簡體   English   中英

等待多個動畫完成

[英]Wait for multiple animation finish

我想做的是

通過動畫移動每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')之后執行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;
            }
        }
    }
}

忘了用我會說的代碼來做。 通過Animator組件創建一個Animation。

動畫窗口允許使用動畫事件。

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

如果您確實想保留代碼,則可以使用使用整數標志的事件系統。 您的面板控制器將收聽動畫,並在完成動畫后觸發事件。 面板會監聽並記錄下來。 然后,當這三個步驟都完成時,它應該執行

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"); }
}

我顯然會認為這種方式很臟,但是它應該可以工作,並且需要對現有代碼進行較少的修改。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM