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后切换它,但没有用。

真正让我困惑的是,它适用于鼠标,但不适用于触摸,这让我觉得它不是协同程序。。就目前情况来看,我很失落。

如有任何帮助,我们将不胜感激。

提前感谢

Coroutine可能被调用两次-动画在触摸时被调用两遍

我建议您用预处理器指令包围特定于平台的代码

#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 = ...