Mat*_*uth 3 c# performance unity-game-engine
我观看了Unity的Basic Platformer Game教程,其中主持人创建了他附加到Coin预制件的硬币拾取脚本.我想知道是否应该将拾取脚本附加到Player或Coin GameObject.
假设我们有一个带有可拾取物体的游戏.他们只做增加分数(或以另一种方式影响玩家)并在碰撞中摧毁自己.
我想知道这个问题的首选方法是什么.
我想出了两种方法:
在玩家游戏对象上有一个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)
有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总是更好,因为它似乎更清洁(当我们有许多不同的可拾取物体时)?
在您的示例中,"接近a"将比另一个更有效,因为它OnTriggerEnter2D被调用一次.使用"方法b",OnTriggerEnter2D在两个不同的脚本上调用两次.Unity在两个不同的脚本+播放器上进行回调调用的速度较慢.此外,OnTriggerEnter2D被发送到残疾人MonoBehaviours,使"接近"更有效的选择.事件调用缓慢的主要原因是因为调用是从代码的本机C++端调用到Unity的C#API端,这是代价高昂的.
请注意,这并不重要.这只是一个尝试回答你的问题,哪一个更有效,但你正在做的是微优化.
应该在这个决定中发挥重要作用的是触发后硬币的行为.
如果硬币表现相同,则使用"接近a"并在玩家一侧进行检测.
如果硬币具有不同的行为,例如具有不同得分值的硬币,颜色和动作(动画),则在收集时,然后在硬币侧进行检测并处理每个硬币.这就是脚本首先附加到GameObjects的原因.每个不同的硬币不需要不同的标签.使用enum来区分它们在动作OnTriggerEnter2D的功能.在这种情况下使用"接近a"来处理这个问题会很糟糕.