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

时间:2014-04-19 17:23:41

标签: c# unity3d coroutine

我正在使用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后切换它,但无济于事。

让我感到困惑的是,它适用于鼠标,但不适用于触摸,这让我觉得它不是协程。因为它的存在我很丢失。

任何帮助都将不胜感激。

提前致谢

2 个答案:

答案 0 :(得分:0)

我建议您使用预处理程序指令

包围特定于平台的代码
#if UNITY_STANDALONE
    // mouse logic
#else
    // touch logic
#endif

测试是否解决问题。

你也可以:

检查相应的Touch.phase值以防止多次火灾。

而不是Animator.SetBool考虑使用Animator.SetTrigger - 您应该在Animator View中正确配置它。

Animation View中,您可以添加要在帧中触发的事件。在最后一帧中添加一个将破坏对象的一个​​。这是我经常采用的方法。

答案 1 :(得分:0)

触摸经历了多个阶段,您可以为每个阶段启动协程。

触摸首先处于TouchPhase.Began阶段,然后处于TouchPhase.Stationary阶段,然后进入TouchPhase.Ended阶段。您的CheckForTouch()函数会针对这些多个状态获得相同的触摸。相反,您可以简单地向该函数添加一个if来对其进行排序:

foreach (Touch item in Input.touches)
{
    if (item.phase == TouchPhase.Began) 
    {
        Vector3 touchPosition = ...