Coroutine可能被调用两次-动画在触摸时被调用两遍
本文关键字:调用 触摸 两遍 动画 Coroutine 两次 | 更新日期: 2023-09-27 17:58:59
我正在用Unity3D开发一款游戏。
我有一个动画,当精灵被触摸时播放,然后精灵被摧毁。
当用户触摸精灵时,这会触发动画,同样当鼠标光标触摸精灵时也会触发动画。
动画在被触摸时会播放2-3次。当它被鼠标"触摸"时,它会按预期工作——动画播放一次,精灵就会被摧毁。
我正在使用协程来实现这个和这个。这是我第一次使用协同程序,所以我怀疑我用错了。
代码如下:
private void CheckForTouch()
{
foreach (Touch item in Input.touches)
{
Vector3 touchPosition =
Camera.main.ScreenToWorldPoint(item.position);
if (collider2D == Physics2D.OverlapPoint(touchPosition))
{
StartCoroutine(PlayAnimation());
break; //Put this in to stop any subsequent touches triggering?
}
}
//Mouse code - this works fine, which is what's confusing me.
Vector3 touchPositionKeyboard = Camera.main.ScreenToWorldPoint(Input.mousePosition);
if (collider2D == Physics2D.OverlapPoint(touchPositionKeyboard))
{
StartCoroutine(PlayAnimation());
}
}
private IEnumerator PlayAnimation()
{
//Setting this to true triggers the animation to be played
animController.SetBool("Dead", true);
yield return new WaitForSeconds(touchEvent.length);
//This destroys the object
TakeDamage(this.Health);
//Finally this sets it back to it's idle state
animController.SetBool("Dead", false);
}
这都是在更新方法中调用的
void Update(){CheckForTouch();}
我玩过一个bool触发器,在第一次调用PlayAnimation后切换它,但没有用。
真正让我困惑的是,它适用于鼠标,但不适用于触摸,这让我觉得它不是协同程序。。就目前情况来看,我很失落。
如有任何帮助,我们将不胜感激。
提前感谢
我建议您用预处理器指令包围特定于平台的代码
#if UNITY_STANDALONE
// mouse logic
#else
// touch logic
#endif
测试这是否能解决问题。
您也可以:
检查相应的Touch.phase
值以防止多次火灾。
考虑使用Animator.SetTrigger
而不是Animator.SetBool
——您应该在Animator View
中正确配置它。
在Animation View
中,您可以添加要在帧中激发的事件。在最后一帧中添加一个将破坏对象的帧。这是我通常采取的方法。
触摸正在经历多个阶段,您可以为每个阶段启动协同程序。
触摸首先处于TouchPhase.Began
阶段,然后可能处于TouchPhase.Stationary
阶段,然后进入TouchPhase.Ended
阶段。您的CheckForTouch()
功能在这多个状态下接收相同的触摸。相反,你可以简单地在函数中添加一个if来解决这个问题:
foreach (Touch item in Input.touches)
{
if (item.phase == TouchPhase.Began)
{
Vector3 touchPosition = ...