void Update() { if (IsPlaying) { CurrentTime += Time.deltaTime; if (WaittingProcessAnimators != null && WaittingProcessAnimators.Count > 0) { for (int i = 0; i < WaittingProcessAnimators.Count; i++) { Description des = WaittingProcessAnimators[i]; if (des == null) { continue; } if (des.Time == -1) { continue; } if (des.Animator == null) { continue; } if (CurrentTime >= des.Time) { //if (name == "MyTurnAndRoll") //{ // Debug.LogError("Fixedlist: wanna play " + des.Animator.name); //} //if (des.Animator.m_Status == GTAnimator.Status.UnAction) //{ GTAnimator.PlayTask task = new GTAnimator.PlayTask(); task.PlayAllClip = true; task.PlayMode = GTAnimator.PlayMode.StopPrevious; des.Animator.PreBeginDelegate += OnOneAnimatorPreStart; des.Animator.BeginDelegate += OnOneAnimatorStart; des.Animator.UpdateDelegate += OnOneAnimatorUpdate; des.Animator.EndDelegate += OnOneAnimatorEnd; des.Animator.Play(task); WaittingProcessAnimators.Remove(des); ActiveAnimators.Add(des); //} //else //{ // Debug.LogError("Fixedlist: play error " + des.Animator.name + ", status is " + des.Animator.m_Status.ToString()); //} } } } if (WaittingProcessAnimators.Count == 0 && ActiveAnimators.Count == 0) { PlayEnd(); } } }
private void OnOneAnimatorPreStart(GTAnimator animator, GTAnimator.PlayTask task) { if (animator == null) { return; } if (Adapter != null) { MethodInfo info = Adapter.GetType().GetMethod("OnAnimatorPreStart"); if (info != null) { Adapter.GetType().InvokeMember("OnAnimatorPreStart", BindingFlags.InvokeMethod | BindingFlags.Public | BindingFlags.Instance, null, Adapter, new object[] { animator, task }); } //else //{ // // Utility.LogError("FixedPlaylist: can not callback your adapter caused by null method named 'OnAnimatorStart(void)'"); //} } Description des = GetDescription(animator); if (des == null || des.Animator == null) { return; } if (des.Adapter != null) { MethodInfo info = des.Adapter.GetType().GetMethod("OnAnimatorPreStart"); if (info != null) { des.Adapter.GetType().InvokeMember("OnAnimatorPreStart", BindingFlags.InvokeMethod | BindingFlags.Public | BindingFlags.Instance, null, des.Adapter, new object[] { animator, task }); } else { Utility.LogError("FixedPlaylist: can not callback your adapter caused by null method named 'OnAnimatorPreStart(void)'"); } } }
private void OnOneAnimatorEnd(GTAnimator animator) { if (animator != null) { animator.PreBeginDelegate -= OnOneAnimatorPreStart; animator.BeginDelegate -= OnOneAnimatorStart; animator.UpdateDelegate -= OnOneAnimatorUpdate; animator.EndDelegate -= OnOneAnimatorEnd; } if (Adapter != null) { MethodInfo info = Adapter.GetType().GetMethod("OnAnimatorEnd"); if (info != null) { Adapter.GetType().InvokeMember("OnAnimatorEnd", BindingFlags.InvokeMethod | BindingFlags.Public | BindingFlags.Instance, null, Adapter, new object[] { animator }); } else { Utility.LogError("FixedPlaylist: can not callback your adapter caused by null method named 'OnAnimatorEnd(void)'"); } } Description des = GetDescription(animator); if (des == null) { return; } ActiveAnimators.Remove(des); if (des.Adapter != null) { MethodInfo info = des.Adapter.GetType().GetMethod("OnAnimatorEnd"); if (info != null) { des.Adapter.GetType().InvokeMember("OnAnimatorEnd", BindingFlags.InvokeMethod | BindingFlags.Public | BindingFlags.Instance, null, des.Adapter, new object[] { animator }); } else { Utility.LogError("FixedPlaylist: can not callback your adapter caused by null method named 'OnAnimatorEnd(void)'"); } if (des.CallbackOnEnd) { if (ListenEnd != null) { ListenEnd(this); } } } if (WaittingProcessAnimators != null && WaittingProcessAnimators.Count > 0) { for (int i = 0; i < WaittingProcessAnimators.Count; i++) { Description tempDes = WaittingProcessAnimators[i]; if (tempDes == null || tempDes.Animator == null) { continue; } if (tempDes.RelyOn == animator && tempDes.Time == -1 && tempDes.Animator.m_Status == GTAnimator.Status.UnAction) { GTAnimator.PlayTask task = new GTAnimator.PlayTask(); task.PlayAllClip = true; task.PlayMode = GTAnimator.PlayMode.DontPlayWhenBusying; tempDes.Animator.PreBeginDelegate += OnOneAnimatorPreStart; tempDes.Animator.BeginDelegate += OnOneAnimatorStart; tempDes.Animator.UpdateDelegate += OnOneAnimatorUpdate; tempDes.Animator.EndDelegate += OnOneAnimatorEnd; tempDes.Animator.Play(task); WaittingProcessAnimators.Remove(tempDes); ActiveAnimators.Add(tempDes); } } } }
public override void OnInspectorGUI() { try { if (Instance == null) { return; } base.OnInspectorGUI(); #region Debug view if (Application.isPlaying) { if (EditorUtility.DrawHeader("Debug", true)) { EditorUtility.BeginContents(); GUILayout.BeginHorizontal(); GUILayout.Label("EnableQueue", GUILayout.Width(100)); EnableQueue = EditorGUILayout.Toggle(EnableQueue); GUILayout.EndHorizontal(); GUILayout.BeginHorizontal(); GUILayout.Label("PlayAllClip", GUILayout.Width(100)); PlayAllClip = EditorGUILayout.Toggle(PlayAllClip); GUILayout.EndHorizontal(); GUILayout.BeginHorizontal(); GUILayout.Label("PlayImmediately", GUILayout.Width(100)); PlayImmediately = EditorGUILayout.Toggle(PlayImmediately); GUILayout.EndHorizontal(); #region animation clip pop view GUILayout.Space(4.0f); AllClipNames = new List <string>(); if (Instance.Clips != null && Instance.Clips.Count > 0) { for (int i = 0; i < Instance.Clips.Count; i++) { Clip clip = Instance.Clips[i]; if (clip == null) { Instance.Clips.RemoveAt(i); i--; continue; } AllClipNames.Add("From " + clip.BeginTime + "s to " + clip.EndTime + "s || Name: " + clip.Name); } } CurrentSelectedDebugClipIndex = EditorGUILayout.Popup(CurrentSelectedDebugClipIndex, AllClipNames.ToArray()); if (CurrentSelectedDebugClipIndex < Instance.Clips.Count && CurrentSelectedClipIndex >= 0) { CurrentSelectedDebugClip = Instance.Clips[CurrentSelectedDebugClipIndex]; } else { CurrentSelectedDebugClip = null; } #endregion GUILayout.BeginHorizontal(); if (GUILayout.Button("Play")) { if (Application.isPlaying == false) { return; } if (CurrentSelectedDebugClip == null) { return; } GTAnimator.PlayTask task = new GTAnimator.PlayTask(); task.PlayAllClip = PlayAllClip; if (PlayAllClip == false) { task.WannaPlayClips = new string[] { CurrentSelectedDebugClip.Name }; } if (EnableQueue) { task.PlayMode = GTAnimator.PlayMode.Waitting; } else { task.PlayMode = GTAnimator.PlayMode.StopPrevious; } GTAnimator.Handler handler = new GTAnimator.Handler(); handler.Callback = HandlerCallback; task.Handler = handler; Instance.Play(task); } GUILayout.EndHorizontal(); GUILayout.BeginHorizontal(); if (GUILayout.Button("Pause")) { if (Application.isPlaying == false) { return; } Instance.Pause(); } GUILayout.EndHorizontal(); GUILayout.BeginHorizontal(); if (GUILayout.Button("UnPause")) { if (Application.isPlaying == false) { return; } Instance.UnPause(); } GUILayout.EndHorizontal(); GUILayout.BeginHorizontal(); if (GUILayout.Button("Stop")) { if (Application.isPlaying == false) { return; } Instance.Stop(true); } GUILayout.EndHorizontal(); EditorUtility.EndContents(); } } #endregion #region animator property view //GUILayout.Space(5.0f); //if (GTAnimatorEditorUtility.DrawHeader("Animator Property", true)) //{ // GTAnimatorEditorUtility.BeginContents(); // GUILayout.BeginHorizontal(); // if (GUILayout.Button("Preview", GUILayout.Width(100))) { } // if (GUILayout.Button("Clear", GUILayout.Width(100))) { } // GUILayout.EndHorizontal(); // GTAnimatorEditorUtility.EndContents(); //} #endregion #region animation clip view GUILayout.Space(5.0f); if (CurrentSelectedClip != null) { OpenClipHeader = EditorUtility.DrawHeader("Clip - " + CurrentSelectedClip.Name + " || From " + CurrentSelectedClip.BeginTime + "s to " + CurrentSelectedClip.EndTime + "s", true); } else { OpenClipHeader = EditorUtility.DrawHeader("Clip", true); } if (OpenClipHeader) { #region animation clip operation EditorUtility.BeginContents(); GUILayout.BeginHorizontal(); GUILayout.Label("Name: "); GonnaCreateClipName = EditorGUILayout.TextField(GonnaCreateClipName); if (GUILayout.Button("Add", GUILayout.Width(60), GUILayout.Height(15))) { if (Instance.Clips == null) { Instance.Clips = new List <Clip>(); } if (IsClipNameLegal(GonnaCreateClipName) == false) { Utility.LogError("clip name is illegal,please try another one"); return; } Instance.Clips.Add(new Clip() { Name = GonnaCreateClipName }); } GUILayout.EndHorizontal(); GUILayout.BeginHorizontal(); GUILayout.Space(4.0f); if (GUILayout.Button("Clear", GUILayout.Width(80))) { if (Instance.Clips != null) { Instance.Clips.Clear(); } } if (GUILayout.Button("Delete", GUILayout.Width(80))) { if (CurrentSelectedClip == null) { return; } if (Instance.Clips == null) { return; } Instance.Clips.Remove(CurrentSelectedClip); } if (GUILayout.Button("Clone", GUILayout.Width(80))) { if (Instance.Clips == null) { Instance.Clips = new List <Clip>(); } if (IsClipNameLegal(GonnaCreateClipName) == false) { Utility.LogError("clip name is illegal,please try another one"); return; } Clip clip = new Clip(); clip.Name = GonnaCreateClipName; clip.Clone(CurrentSelectedClip); Instance.Clips.Add(clip); } GUILayout.EndHorizontal(); #endregion #region animation clip pop view GUILayout.Space(4.0f); AllClipNames = new List <string>(); if (Instance.Clips != null && Instance.Clips.Count > 0) { for (int i = 0; i < Instance.Clips.Count; i++) { Clip clip = Instance.Clips[i]; if (clip == null) { Instance.Clips.RemoveAt(i); i--; continue; } clip.ClampTime(); AllClipNames.Add("From " + clip.BeginTime + "s to " + clip.EndTime + "s || Name: " + clip.Name); } } CurrentSelectedClipIndex = EditorGUILayout.Popup(CurrentSelectedClipIndex, AllClipNames.ToArray()); if (CurrentSelectedClipIndex < Instance.Clips.Count && CurrentSelectedClipIndex >= 0) { CurrentSelectedClip = Instance.Clips[CurrentSelectedClipIndex]; } else { CurrentSelectedClip = null; } #endregion #region display clip property GUILayout.Space(4.0f); if (CurrentSelectedClip != null) { CurrentSelectedClip.DiaplayEditorView(); } #endregion EditorUtility.EndContents(); } #endregion #region animation clip actions view GUILayout.Space(5.0f); if (EditorUtility.DrawHeader("Action", true)) { if (CurrentSelectedClip == null) { EditorGUILayout.HelpBox("Please select an animation clip", MessageType.Warning); } else { #region header GUILayout.BeginHorizontal(); GUILayout.Label("Clip: " + CurrentSelectedClip.Name); GUILayout.Space(2.0f); GUILayout.Label("Time from " + CurrentSelectedClip.BeginTime + "s to " + CurrentSelectedClip.EndTime + "s"); GUILayout.EndHorizontal(); #endregion #region add action EditorUtility.BeginContents(); GUILayout.Space(2.0f); GUILayout.BeginHorizontal(); if (AllActionType == null || AllActionType.Count == 0 || AllActionTypeName == null || AllActionTypeName.Count == 0) { AllActionType = EditorUtility.GetAllSubClass(typeof(ClipAction), null); if (AllActionType != null && AllActionType.Count > 0) { AllActionTypeName = new List <string>(); for (int i = 0; i < AllActionType.Count; i++) { Type type = AllActionType[i]; if (type == null) { continue; } string typeName = EditorUtility.GetTypeNameWithoutNamespcae(type.FullName); AllActionTypeName.Add(typeName); } } } if (AllActionTypeName != null && AllActionTypeName.Count > 0) { GonnaAddActionIndex = EditorGUILayout.Popup(GonnaAddActionIndex, AllActionTypeName.ToArray()); if (GonnaAddActionIndex >= 0 && GonnaAddActionIndex < AllActionTypeName.Count) { GonnaCreateActionType = AllActionType[GonnaAddActionIndex]; } } GUILayout.FlexibleSpace(); GonnaCreateActionName = EditorGUILayout.TextField(GonnaCreateActionName); GUILayout.FlexibleSpace(); if (GUILayout.Button("Add", GUILayout.Width(60), GUILayout.Height(15))) { if (CurrentSelectedClip == null) { return; } if (GonnaCreateActionType == null) { return; } if (IsActionNameLegal(GonnaCreateActionName) == false) { Utility.LogError("action identify name is illegal,please try another one"); return; } ClipAction action = CurrentSelectedClip.AddAction(GonnaCreateActionType); if (action != null) { action.IdentifyName = GonnaCreateActionName; } } GUILayout.EndHorizontal(); #endregion #region operation of action collection GUILayout.Space(3.0f); GUILayout.BeginHorizontal(); if (GUILayout.Button("Clear", GUILayout.Width(60))) { if (CurrentSelectedClip == null) { return; } CurrentSelectedClip.ClearAction(); } if (GUILayout.Button("Delete", GUILayout.Width(60))) { if (CurrentSelectedAction == null) { return; } if (CurrentSelectedClip == null) { return; } CurrentSelectedClip.RemoveAction(CurrentSelectedAction); } if (GUILayout.Button("Clone", GUILayout.Width(60))) { } GUILayout.FlexibleSpace(); if (BoolDisplayAllAction) { if (GUILayout.Button("Display-Single")) { BoolDisplayAllAction = !BoolDisplayAllAction; } } else { if (GUILayout.Button(" Display-All ")) { BoolDisplayAllAction = !BoolDisplayAllAction; } } GUILayout.EndHorizontal(); EditorUtility.EndContents(); #endregion #region display view EditorUtility.BeginContents(); GUILayout.Space(6.0f); if (BoolDisplayAllAction == true) { #region all view if (CurrentSelectedClip == null || CurrentSelectedClip.GetAllAction() == null || CurrentSelectedClip.GetAllAction().Count == null) { return; } for (int i = 0; i < CurrentSelectedClip.GetAllAction().Count; i++) { ClipAction action = CurrentSelectedClip.GetAllAction()[i]; if (action == null) { continue; } EditorUtility.BeginContents(); GUILayout.Space(2.0f); action.DisplayEditorView(); GUILayout.Space(2.0f); EditorUtility.EndContents(); } #endregion } else { #region single view AllActionNames = new List <string>(); if (CurrentSelectedClip.GetAllAction() != null && CurrentSelectedClip.GetAllAction().Count > 0) { for (int i = 0; i < CurrentSelectedClip.GetAllAction().Count; i++) { ClipAction action = CurrentSelectedClip.GetAllAction()[i]; if (action == null) { continue; } AllActionNames.Add("From " + action.BeginTime + " to " + action.EndTime + " || " + action.DisplayName); } } CurrentSelectedActionIndex = EditorGUILayout.Popup(CurrentSelectedActionIndex, AllActionNames.ToArray()); if (CurrentSelectedActionIndex >= 0 && CurrentSelectedActionIndex < CurrentSelectedClip.GetAllAction().Count) { CurrentSelectedAction = CurrentSelectedClip.GetAllAction()[CurrentSelectedActionIndex]; } #endregion #region detail property GUILayout.Space(6.0f); if (CurrentSelectedAction != null) { CurrentSelectedAction.DisplayEditorView(); } #endregion } EditorUtility.EndContents(); #endregion } } #endregion GUILayout.Space(5.0f); } catch { } }