猿问

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

简单的问题在这里..


我只是想知道有没有办法避免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!");

    }

}


慕莱坞森
浏览 108回答 1
1回答

哈士奇WWW

除非此方法在单个帧中的许多对象上触发,否则可能不值得。但是,您可以通过将 Tile 对象缓存在字典中并使用以下索引来实现Collider.gameObject.GetInstanceID():在某些脚本中,运行的脚本的每个实例都OnTriggerEnter可以访问(例如游戏管理器):public Dictionary<int, Tile> tileCache;// ...// Initializing:tileCache = new Dictionary<int, Tile>();使用示例:private void OnTriggerEnter(Collider other){&nbsp; &nbsp; int tileCacheIndex = other.gameObject.GetInstanceID();&nbsp; &nbsp; Tile tile;&nbsp; &nbsp; if (GameManager._instance.tileCache.ContainsKey(tileCacheIndex))&nbsp;&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; tile = GameManager._instance.tileCache[tileCacheIndex];&nbsp; &nbsp; }&nbsp; &nbsp; else&nbsp;&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; tile = other.GetComponent<Tile>();&nbsp; &nbsp; &nbsp; &nbsp; GameManager._instance.tileCache[tileCacheIndex] = tile;&nbsp; &nbsp; }&nbsp; &nbsp; if (tile.colorIndex == GameManager.Instance.currentTargetColorIndex)&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; Debug.Log("Hit!");&nbsp; &nbsp; }}因为您使用的是游戏对象的实例 ID,所以您可以执行一些操作,例如在每个图块的 Start 中预加载图块缓存。索引只是gameObject.GetInstanceID(),不需要GetComponent在那里调用。
随时随地看视频慕课网APP
我要回答