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

拉希德·德夫(Rashid Dev)

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

我只是想知道是否有一种方法可以避免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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何减少调用 OnTriggerEnter 的频率?

如何避免 Spark 中的嵌套地图调用?

如何避免在 FluentValidation 中重复外部调用

如何避免在Scala中调用asInstanceOf

如何避免[]在Flutter中调用null

如何避免在子列表中调用回调函数

如何避免Linux的strftime()中过多的stat(/ etc / localtime)调用?

如何避免Observable中超出最大调用堆栈大小?

如何避免在JS中重复“ document.getElementById”调用?

如何避免LINQ表达式中的动态调用

如何从助手中调用动作并避免渲染?

如何避免使用家族多态在Scala中调用asInstanceOf

如何避免/防止 Node.js 中的无限递归调用?

如何避免在cakephp中执行特定功能后调用afterSave

如何避免基类中的多语性调用

如何避免代理调用的痕迹

如何避免多次AJAX调用?

如何避免多次Ajax调用

如何避免嵌套方法调用?

如何检查在 OnTriggerEnter 中的对象上找到的文本

无论如何,要避免在Xamarin中每个方法的setter中调用NotifyChanged?

如何从 JavaScript 承诺(python 调用)中获取变量,避免 Odoo 中的挂起状态?

单击键盘中的完成时,如何避免调用 ExpandableListView 中的 getChildView

从线程中调用.net服务中的stop时如何避免死锁?

如果角度 5 中的 forKJoin 中的参数为空,如何避免 api 调用?

如何在vertx中重构异步调用链,以避免回调地狱

在摩卡测试中,调用异步函数时如何避免超时错误:超时超过2000ms

symfony2在选民中调用is_granted:如何避免无限循环?

如何避免导航堆栈中的一系列委托调用?