如何避免在OnTriggerEnter()中调用GetComponent()?

Ras*_*Dev 4 c# unity-game-engine

一个简单的问题在这里..

我只是想知道是否有一种方法可以避免GetComponent<Script>()在内部打电话OnTriggerEnter(Collider other)?我试图避免这样做,因为我知道GetComponent很慢。

private void OnTriggerEnter(Collider other)
{
    Tile tile = other.GetComponent<Tile>();
    if (tile.colorIndex == GameManager.Instance.currentTargetColorIndex)
    {
        Debug.Log("Hit!");
    }
}
Run Code Online (Sandbox Code Playgroud)

Ruz*_*ihm 5

除非此方法在一帧中对许多对象触发,否则可能不值得。

但是,您可以通过在字典中缓存Tile对象并使用以下索引来实现此目的Collider.gameObject.GetInstanceID()


在某些脚本中,运行脚本的每个实例都OnTriggerEnter可以访问(例如游戏管理器):

public Dictionary<int, Tile> tileCache;

// ...

// Initializing:
tileCache = new Dictionary<int, Tile>();
Run Code Online (Sandbox Code Playgroud)

使用示例:

private void OnTriggerEnter(Collider other)
{
    int tileCacheIndex = other.gameObject.GetInstanceID();
    Tile tile;

    if (GameManager._instance.tileCache.ContainsKey(tileCacheIndex)) 
    {
        tile = GameManager._instance.tileCache[tileCacheIndex];
    }
    else 
    {
        tile = other.GetComponent<Tile>();
        GameManager._instance.tileCache[tileCacheIndex] = tile;
    }

    if (tile.colorIndex == GameManager.Instance.currentTargetColorIndex)
    {
        Debug.Log("Hit!");
    }
}
Run Code Online (Sandbox Code Playgroud)

因为您使用的是gameObject的实例ID,所以可以执行类似在每个Tile的“开始”中预加载tile缓存的操作。索引将是gameObject.GetInstanceID(),在GetComponent那里没有必要的调用。

  • 您也可以将对撞机用作键。 (4认同)
  • 值得检查一下,GetInstanceID确实比GetComponent快。 (2认同)