【问题标题】:Wait for multiple animation finish等待多个动画完成
【发布时间】:2016-02-26 18:09:57
【问题描述】:

我想做的是

通过动画移动每 3 个面板

每个动画完成后做点什么。

在我的 panelCtrl.cs 中,它会移动面板。

public class PanelCtrl : MonoBehaviour {
void Update () {
    if (moving){
        distCovered = (Time.time - startTime) * moveSpeed * 4;

        fracJourney = distCovered / journeyLength;

        transform.position = Vector3.Lerp(startMarker, endMarker,fracJourney);

        if (fracJourney >= 1){
            moving = false;

        }
    }
}

//when moving
public float distCovered;
public Vector3 startMarker;
public Vector3 endMarker;
private float moveSpeed = 10.0F;
public float startTime;
public float journeyLength;
public float fracJourney;
public bool moving = false;

public void Move(Transform distination){
    endMarker = distination.position;
    startMarker = this.transform.position;
    startTime = Time.time;
    journeyLength = Vector3.Distance(startMarker,endMarker);
    moving = true;
}

在我的 Gamectrl.cs 中

PanelCtrl.Move (panel1.transform);
PanelCtrl.Move (panel2.transform);
PanelCtrl.Move (panel3.transform);
Debug.log('finished!');

目前,Debug.log('finished') 在动画完成之前被调用。

但是,我想在三步完成后做Debug.log('finished')

我有两个想法。

1) 使用协程??但是怎么办??制作三个协程,如何检查每个动画的完成情况??

2) 检查移动标志?我试图检查移动标志,

所以我在我的 GameCtrl.cs 中尝试了这个,但它挂断了!

void Update () {
bool readyForSpawn = false; // Wait for all movement finishing
while (readyForSpawn == false) {
    readyForSpawn = true;
    foreach (GameObject obj in GameObject.FindObjectsOfType(typeof(GameObject))) {
        if (obj.transform.parent == null && obj.name == "Panel(Clone)") {
            PanelCtrl pan = obj.GetComponent ("PanelCtrl") as PanelCtrl;
            if (pan.moving == true){
                Debug.Log ("moving:true");
                readyForSpawn = false;
            }
        }
    }
}

【问题讨论】:

  • 嗯,在 Unity 中可以使用异步吗?如果是,则可以将 Move 函数声明为异步,创建 TaskCompletionSource,在设置“moving = false”(动画完成)时解决它,然后等待函数的结果
  • 答案是 fafase 解释的动画事件。古斯曼——这与任何事情都无关。 Unity是一个游戏引擎,它是一个基于ECS框架的系统

标签: c# unity3d unityscript


【解决方案1】:

忘记我会说的代码。通过 Animator 组件创建动画。

动画窗口允许使用动画事件。

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

如果您真的想保留代码,那么您将使用使用整数标志的事件系统。您的面板控制器会收听动画,完成后会触发事件。 Panel 聆听并记录下来。然后当所有三个都完成后,它会做应该做的事情

public class PanelCtrl : MonoBehaviour {

    public static event Action OnCompletion;
    void Update () {
    if (moving){
        distCovered = (Time.time - startTime) * moveSpeed * 4;

        fracJourney = distCovered / journeyLength;

        transform.position = Vector3.Lerp(startMarker, endMarker,fracJourney);

        if (fracJourney >= 1){
            moving = false;
            OnCompletion();
        }
    }
}

然后你有一个控制器来监听:

public class Manager:MonoBehaviour {
    void Awake(){
        PanelCtrl.OnCompletion += HandleCompletion;
    }
}

private int flag = 3 
void HandleCompletion (){
     if(--flag == 0){ Debug.Log("All done"); }
}

我显然认为这种方式很脏,但它应该可以工作,并且需要对现有代码进行较少的修改。

【讨论】:

  • 其实我的目标不是动画,只是移动。我说错了。我正在尝试第二个。我需要更多地了解事件处理。
  • 我使用这个整数标志,它工作得很好。非常感谢!这是我学习事件动作处理的好机会。
猜你喜欢
  • 2012-08-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-13
  • 1970-01-01
  • 2017-03-15
  • 1970-01-01
相关资源
最近更新 更多