一个简单的问题在这里..
我只是想知道是否有一种方法可以避免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!");
}
}
除非此方法在单个帧中对许多对象触发,否则可能不值得。
但是,您可以通过在字典中缓存Tile对象并使用以下索引来实现此目的Collider.gameObject.GetInstanceID()
:
在某些脚本中,运行脚本的每个实例都OnTriggerEnter
可以访问(例如游戏管理器):
public Dictionary<int, Tile> tileCache;
// ...
// Initializing:
tileCache = new Dictionary<int, Tile>();
使用示例:
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!");
}
}
因为您使用的是gameObject的实例ID,所以您可以执行类似在每个Tile的“开始”中预加载tile缓存的操作。索引将是gameObject.GetInstanceID()
,在GetComponent
那里没有必要的调用。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句