哪里附上碰撞检测脚本?

Mat*_*uth 3 c# performance unity-game-engine

我观看了Unity的Basic Platformer Game教程,其中主持人创建了他附加到Coin预制件的硬币拾取脚本.我想知道是否应该将拾取脚本附加到Player或Coin GameObject.

假设我们有一个带有可拾取物体的游戏.他们只做增加分数(或以另一种方式影响玩家)并在碰撞中摧毁自己.

我想知道这个问题的首选方法是什么.

我想出了两种方法:


方法A.

玩家游戏对象上有一个ObjectPickup脚本.此脚本将根据碰撞对象的类型执行任何操作.

private void OnTriggerEnter2D(Collider2D other)
{
    if (other.gameObject.CompareTag("Coin"))
    {
        IncrementScore();
        Destroy(other.gameObject);
    }
    else if (other.gameObject.CompareTag("SuperSpeed"))
    {
        IncreasePlayerSpeed();
        Destroy(other.gameObject);
    }
}
Run Code Online (Sandbox Code Playgroud)

方法B.

CoinPickup在脚本每个硬币SuperSpeedPickup脚本对每一个超高速通电.

private void OnTriggerEnter2D(Collider2D other)
{
    if (other.gameObject.CompareTag("Player"))
    {
        other.gameObject.IncrementScore();
        Destroy(gameObject);
    }
}
Run Code Online (Sandbox Code Playgroud)

和其他脚本:

private void OnTriggerEnter2D(Collider2D other)
{
    if (other.gameObject.CompareTag("Player"))
    {
        other.gameObject.IncreasePlayerSpeed();
        Destroy(gameObject);
    }
}
Run Code Online (Sandbox Code Playgroud)

接近更高效然后B方法?如果是这样,当方法A变得更可取时,游戏对象的粗略数量是多少?

或者使用方法B总是更好,因为它似乎更清洁(当我们有许多不同的可拾取物体时)?

Pro*_*mer 5

在您的示例中,"接近a"将比另一个更有效,因为它OnTriggerEnter2D被调用一次.使用"方法b",OnTriggerEnter2D在两个不同的脚本上调用两次.Unity在两个不同的脚本+播放器上进行回调调用的速度较慢.此外,OnTriggerEnter2D被发送到残疾人MonoBehaviours,使"接近"更有效的选择.事件调用缓慢的主要原因是因为调用是从代码的本机C++端调用到Unity的C#API端,这是代价高昂的.

请注意,这并不重要.这只是一个尝试回答你的问题,哪一个更有效,但你正在做的是微优化.


应该在这个决定中发挥重要作用的是触发后硬币的行为.

如果硬币表现相同,则使用"接近a"并在玩家一侧进行检测.

如果硬币具有不同的行为,例如具有不同得分值的硬币,颜色和动作(动画),则在收集时,然后在硬币侧进行检测并处理每个硬币.这就是脚本首先附加到GameObjects的原因.每个不同的硬币不需要不同的标签.使用enum来区分它们在动作OnTriggerEnter2D的功能.在这种情况下使用"接近a"来处理这个问题会很糟糕.