Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在哪里附加碰撞检测脚本?_C#_Performance_Unity3d - Fatal编程技术网

C# 在哪里附加碰撞检测脚本?

C# 在哪里附加碰撞检测脚本?,c#,performance,unity3d,C#,Performance,Unity3d,我观看了Unity的教程,其中演示者创建了他附加到硬币预制件上的硬币拾取脚本。我想知道拾取脚本是否应该附加到玩家或硬币游戏对象 假设我们有一个游戏,游戏中有可拾取的对象。他们所做的只是增加分数(或以另一种方式影响玩家),并在碰撞中摧毁自己 我想知道解决这个问题的首选方法是什么 我提出了两种方法: 接近A 在玩家游戏对象上有一个objectpick脚本。此脚本将根据碰撞对象的类型执行所需的任何操作 private void OnTriggerEnter2D(Collider2D other) {

我观看了Unity的教程,其中演示者创建了他附加到硬币预制件上的硬币拾取脚本。我想知道拾取脚本是否应该附加到玩家或硬币游戏对象

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

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

我提出了两种方法:


接近A 在玩家游戏对象上有一个objectpick脚本。此脚本将根据碰撞对象的类型执行所需的任何操作

private void OnTriggerEnter2D(Collider2D other)
{
    if (other.gameObject.CompareTag("Coin"))
    {
        IncrementScore();
        Destroy(other.gameObject);
    }
    else if (other.gameObject.CompareTag("SuperSpeed"))
    {
        IncreasePlayerSpeed();
        Destroy(other.gameObject);
    }
}
方法B 将硬币拾取脚本设置在每枚硬币上,并在每一次超高速通电时将SuperSpeedPickup脚本设置在

private void OnTriggerEnter2D(Collider2D other)
{
    if (other.gameObject.CompareTag("Player"))
    {
        other.gameObject.IncrementScore();
        Destroy(gameObject);
    }
}
和其他脚本:

private void OnTriggerEnter2D(Collider2D other)
{
    if (other.gameObject.CompareTag("Player"))
    {
        other.gameObject.IncreasePlayerSpeed();
        Destroy(gameObject);
    }
}

方法A是否比方法B更有效?如果是这样的话,当接近A时,游戏对象的大致数量是多少


或者使用方法B总是更好,因为它看起来更干净(当我们有许多不同的可拾取对象时)

考虑到你可以为每一枚硬币创建一个预置,并为每一枚超高速加电创建一个预置,第二种方法脚本已经附加在它上面,考虑到你可以非常容易地从代码中的任何地方生成它们,我真的会坚持使用第二种方法,使它更合理,干净,每个人都能理解


我不喜欢(而且我绝对不会使用)这种特定用途的第一种方法,主要是因为
OnTriggerEnter2D
很可能会被发射很多次,因为它被放在播放器上,播放器到处移动,与东西碰撞。

我应该使用B,因为它更像是对象编程的工作原理(至少在我的头脑中!),即使它更昂贵

但是方法A不会分割交互,所以假设您可以与两个不同的可拾取对象碰撞,同时与bouth碰撞。如果使用方法A,它将始终使用相同的碰撞顺序,这可能是需要的,也可能不是

但是很明显,对于方法B,您并不知道首先拾取哪个对象(在这个具体的例子中!)

在您的示例中,“方法a”将比另一个更有效,因为
OnTriggerEnter2D
只调用一次。使用“方法b”,在两个不同的脚本上调用两次
OnTriggerEnter2D
。Unity需要进行回调调用,更不用说在两个不同的脚本和播放器上了。另外,
OnTriggerEnter2D
被发送到disabled
MonoBehaviouss
,这使得“接近”成为更有效的选择。慢事件调用的主要原因是因为调用是从代码的本机C++侧到Unity的CyAPI接口,这是

请注意,这真的没那么重要。这只是试图回答你的问题,哪一个更有效,但你所做的是一个微观优化


在这个决定中应该扮演重要角色的是硬币在触发后的行为

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


如果收集到的硬币具有不同的行为,如具有不同分数值、颜色和动作(动画)的硬币,则在硬币一侧进行检测并处理每个硬币。这就是为什么脚本首先被附加到游戏对象上的原因。不同的硬币不需要不同的标签。使用
enum
OnTriggerEnter2D
函数中区分它们的操作。在这种情况下,使用“方法a”来处理这个问题会很糟糕。

方法a
听起来性能更好一些,而且它也适用于多人游戏。如果您有n名玩家,本地或在线,您需要检查硬币上的玩家id。否则你需要很多标签。如果玩家自己检测到物品碰撞,则无需这样做

玩家对象应该有拾取东西的能力。它应该检测它是否与可拾取的对象发生碰撞(例如,通过使用“pickable”标记)。我认为(但我绝对不确定这一点,所以我以评论的形式发布),性能不是问题,在这里。Unity应“安排”特定循环中所有对象的OnTiggerEnter逻辑,专用于碰撞检测并由引擎管理。就我个人而言,我一直在实现一种方法,让编程逻辑“以玩家为中心”(在我看来,玩家应该在与其他对象发生冲突时进行操作)。玩家很可能已经分配了一个colider,所以它无论如何都会与所有东西发生冲突。是的,它只是为了在碰撞器代码中省去一些无用的检查,以使所有东西更干净、更有条理(最重要的是,从逻辑的角度来看,至少在我的经验/意见中),为什么你要标记它们?碰撞已选择正确的播放机。参数无效。