我正在学习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()
无关?如果是这样,每次我要检查碰撞时都需要使用协程吗?
public void OnTriggerEnter2D(Collider2D other)
{
if (other.CompareTag("Door"))
{
this.connected = true;
}
}
因此,上一个循环确实将使我的对象旋转,但从不将我的公共变量“ connected”设置为true,就像从未发生碰撞一样,只是在正确位置产生了一个。但是当我使用协程时它确实起作用,为什么呢?
您绝对不需要协程在OnTriggerEnter2D中旋转对象。
根据您显示给我们的代码片段,我想发生了什么事,就是它几乎立即将对象旋转了90度4次(即360度旋转),因此看起来好像根本没有移动。] >
编辑(响应编辑1):
添加协程时您的代码起作用的原因是,那时四个90度旋转不会全部在一个帧中发生。发生的是:
connected
标志设置为true,可以防止在随后的任何事件中调用go.transform.Rotate
框架。将其与没有协程的序列进行比较:
connected
标志仍然为假。不过,解决问题的方法不是使用协程。解决方法是删除for
循环。在Update
方法中,如果未连接门,则将门旋转一个角度。在下一次更新中,如果仍未连接门,请再次执行。最终,在4次更新中,它将连接起来,并且不再每帧旋转。
如果我做对这项工作,是因为延迟让我的OnTriggerEnter2D()函数有足够的时间来检测冲突,或者与OnTriggerEnter2D()无关吗?