协程如何与OnTriggerEnter2D协同工作?

问题描述 投票:0回答:2

我正在学习C#和统一性,最近的问题之一是使我的OnTriggerEnter2D()函数起作用。经过大量测试,我设法解决了问题,但是如果我理解,我不确定100%。

所以基本上我正在检查一个物体是否碰到另一个物体,如果不是这种情况,我会旋转该物体:

for (var i = 0; i < 4; i++)
        {
            if (!door.connected)
            {
                go.transform.Rotate(0f, 0f, 90f, Space.Self);
            }
        }

[这个没有用,经过大量调试后,我决定在go.transform.Rotate(0f, 0f, 90f, Space.Self);和这项工作之后立即使用具有0.5s延迟的协程。

如果对的话我的工作是正确的,因为延迟让我的OnTriggerEnter2D()函数有足够的时间来检测冲突,或者与OnTriggerEnter2D()无关?如果是这样,每次我要检查碰撞时都需要使用协程吗?

编辑1:我在另一个脚本中有此代码

public void OnTriggerEnter2D(Collider2D other)
{
    if (other.CompareTag("Door"))
    {
        this.connected = true;
    }
}

因此,上一个循环确实将使我的对象旋转,但从不将我的公共变量“ connected”设置为true,就像从未发生碰撞一样,只是在正确位置产生了一个。但是当我使用协程时它确实起作用,为什么呢?

c# unity3d collision-detection coroutine
2个回答
2
投票

您绝对不需要协程在OnTriggerEnter2D中旋转对象。

根据您显示给我们的代码片段,我想发生了什么事,就是它几乎立即将对象旋转了90度4次(即360度旋转),因此看起来好像根本没有移动。] >

编辑(响应编辑1):

添加协程时您的代码起作用的原因是,那时四个90度旋转不会全部在一个帧中发生。发生的是:

  1. [它将门旋转90度,然后启动一个协程,持续数帧。
  2. 由于门在框架之间旋转,其他脚本有机会检测到任何碰撞
  3. 如果检测到有门,则可以将connected标志设置为true,可以防止在随后的任何事件中调用go.transform.Rotate框架。
  4. 将其与没有协程的序列进行比较:

  1. [将门旋转90度,然后再做一次,然后再做一次,然后再做一次……然后移动到下一帧。
  2. 由于就所有其他GameObjects而言,没有在帧之间移动,没有检测到新的碰撞,并且您的connected标志仍然为假。
  3. 不过,解决问题的方法不是使用协程。解决方法是删除for循环。在Update方法中,如果未连接门,则将门旋转一个角度。在下一次更新中,如果仍未连接门,请再次执行。最终,在4次更新中,它将连接起来,并且不再每帧旋转。


1
投票

如果我做对这项工作,是因为延迟让我的OnTriggerEnter2D()函数有足够的时间来检测冲突,或者与OnTriggerEnter2D()无关吗?

© www.soinside.com 2019 - 2024. All rights reserved.