使对象仅在特定攻击动画完成查询时才实例化

时间:2017-01-23 04:41:22

标签: c# animation unity3d unity5 unity3d-2dtools

当我点击攻击按钮时,我的播放器Robot正在攻击,如下所示。我使用coroutine等待一段时间然后实例化激光形式firepos位置。

请参阅下面的gif以获得清晰的理解: error in shoot time

现在,如果您看到上述gif,您可以看到,如果我按住攻击按钮,则播放器正在根据waitForSeconds {{1一秒后激光射击。到现在为止还好!

但是当我在很短的时间内突然点击按钮时,动画不会播放(我可以理解......显而易见!)但是就像上面的情况一段时间后(由于coroutine)和由于没有时间我点击同样没有激光拍摄我不想要

我想要的是,当我点击并按住攻击按钮时,动画应该完成,然后激光应该拍摄。

如果我在很短的时间内轻拍多次,那么激光(是一个预制的实例化)不应该拍摄。

只有在动画完成时,激光才能拍摄

现在我无法理解这一点!任何身体都可以帮助。

检查员中的按钮(攻击):

laser button

我在waitforsecondsOnpointerDown

中调用了两个函数

功能代码:

up

和Coroutine代码(左右两个):

public void LaserAttack(){
        isAttacking = true;
        StartCoroutine (AttackStillCoroutine ());

        if (robotLeft == true&&isLaserLeft==false) {

            //Debug.Log (firep.position.x);

            //Instantiate (leftLaser, firep.position*1.29f, Quaternion.identity);

            StartCoroutine( DelayMethodLeftInstantiate());

        } 

        if (robotRight == true&&isLaserLeft==false) {

            StartCoroutine(  DelayMethodRightInstantiate());

            //Instantiate (RightLaser, firep.position, Quaternion.identity);
        }
        anim.SetBool ("isAttack", isAttacking);
        isLaserLeft = true;

    }

    public void LaserAttackEnd(){
        isAttacking = false;
        attackStill = false;
        anim.SetBool ("isAttackStill",attackStill);
        anim.SetBool ("isAttack", isAttacking);
        isLaserLeft = false;

    }

对于缺乏知识,请帮助和抱歉...伙计们,我们这样!

1 个答案:

答案 0 :(得分:1)

可以通过两种方法解决您的问题。

首先,如果按钮被释放,你可以停止协程。

你可以使用IPointerUpHandler(我假设你从UI按钮调用方法)

public class InputHandler, MonoBehaviour, IPointerUpHandler
{
    IEnumerator coroutine = null;
    public void LaserAttack(){
        isAttacking = true;
        this.coroutine = AttackStillCoroutine ()
        StartCoroutine (this.coroutine);
       // More code
    }
    public void OnPointerUp(PointerEventData eventData)
    {
         if(this.isAttacking == true && this.coroutine != null ){
             StopCoroutine(this.coroutine);
             this.coroutine = null;
         }
    }
}

我推荐的另一种方法是使用AnimationEvent。您可以将一个方法委托放置到动画中,这样当它到达时,该方法就会被调用。

我会粘贴链接,因为它比代码更直观:

https://docs.unity3d.com/Manual/animeditor-AnimationEvents.html