等待多个动画完成
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')
三步走完后
我有两个想法。
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 组件创建动画。
动画 window 允许使用动画事件。
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"); }
}
我会清楚地认为这种方式很脏,但它应该可以工作并且需要对现有代码进行较少的修改。
我想做的是
按动画移动每 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;
}
}
}
}
忘了我会说的代码。通过 Animator 组件创建动画。
动画 window 允许使用动画事件。
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"); }
}
我会清楚地认为这种方式很脏,但它应该可以工作并且需要对现有代码进行较少的修改。