FighterState.cs 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219
  1. using UnityEngine;
  2. using System.Collections;
  3. using System.Collections.Generic;
  4. public enum FighterStateType
  5. {
  6. None = 0,
  7. Idle,
  8. Coming, //出场
  9. Attack,
  10. BeHit,
  11. Die,
  12. Down,
  13. DownIdle,
  14. BeHitDown,
  15. Revive,
  16. Vertigo,
  17. Stark,
  18. NavRun,
  19. Run,
  20. Jump,
  21. Victory,
  22. Break,
  23. Sleep,
  24. }
  25. public enum FighterStateTriggerType
  26. {
  27. Attack,
  28. BeHit,
  29. NavRun,
  30. Run,
  31. Jump,
  32. }
  33. delegate FighterState FighterStateCreator (Fighter fighter);
  34. public abstract class FighterState
  35. {
  36. static Dictionary<FighterStateType, FighterStateCreator> creators;
  37. static Dictionary<Fighter, Dictionary<FighterStateType, FighterState>> cached_fighter_states;
  38. public static void RegistCacheFighterState (Fighter fighter)
  39. {
  40. if (cached_fighter_states == null)
  41. cached_fighter_states = new Dictionary<Fighter, Dictionary<FighterStateType, FighterState>> ();
  42. cached_fighter_states.Add (fighter, new Dictionary<FighterStateType, FighterState> ());
  43. }
  44. public static void UnregistCacheFighterState (Fighter fighter)
  45. {
  46. if (cached_fighter_states != null && cached_fighter_states.ContainsKey (fighter))
  47. cached_fighter_states.Remove (fighter);
  48. }
  49. public static FighterState Create (Fighter fighter, FighterStateType state)
  50. {
  51. if (fighter == null) return null;
  52. if (creators == null)
  53. RegisterCreators ();
  54. bool useCache = cached_fighter_states != null && cached_fighter_states.ContainsKey (fighter);
  55. if (useCache && cached_fighter_states [fighter].ContainsKey (state))
  56. return cached_fighter_states [fighter] [state];
  57. if (creators.ContainsKey (state)) {
  58. FighterState resultState = creators [state] (fighter);
  59. if (useCache)
  60. cached_fighter_states [fighter].Add (state, resultState);
  61. return resultState;
  62. }
  63. return null;
  64. }
  65. static void RegisterCreators ()
  66. {
  67. creators = new Dictionary<FighterStateType, FighterStateCreator> ();
  68. creators.Add (FighterStateType.Idle, FighterStateIdle.Creator);
  69. creators.Add(FighterStateType.Coming, FighterStateComing.Creator);
  70. creators.Add (FighterStateType.Attack, FighterStateAttack.Creator);
  71. creators.Add (FighterStateType.BeHit, FighterStateBeHit.Creator);
  72. creators.Add (FighterStateType.Die, FighterStateDie.Creator);
  73. creators.Add (FighterStateType.Down, FighterStateDown.Creator);
  74. creators.Add (FighterStateType.DownIdle, FighterStateDownIdle.Creator);
  75. creators.Add (FighterStateType.BeHitDown, FighterStateBeHitDown.Creator);
  76. creators.Add (FighterStateType.Revive, FighterStateResurrection.Creator);
  77. creators.Add (FighterStateType.Vertigo, FighterStateVertigo.Creator);
  78. creators.Add (FighterStateType.Stark, FighterStateStark.Creator);
  79. creators.Add (FighterStateType.NavRun, FigterStateNavRun.Creator);
  80. creators.Add (FighterStateType.Run, FighterStateRun.Creator);
  81. creators.Add (FighterStateType.Break, FighterStateBreak.Creator);
  82. creators.Add (FighterStateType.Sleep, FighterStateSleep.Creator);
  83. }
  84. protected FighterStateType mState;
  85. protected Fighter mFighter;
  86. protected FighterStateData mStateData;
  87. protected string mAnimName;
  88. protected int m_nFrame = 0;
  89. protected FighterState (Fighter fighter, FighterStateType state, bool reentrant = false)
  90. {
  91. mFighter = fighter;
  92. mState = state;
  93. Reentrant = reentrant;
  94. mStateData = fighter.StateData;
  95. mAnimName = FighterAnimatorHash.StateIdle;
  96. m_nFrame = 0;
  97. }
  98. public FighterStateType State { get { return mState; } }
  99. public bool Reentrant { get; private set; }
  100. public bool IsAnimValid { get { return mFighter.Ctrl.Animator != null; } }
  101. public virtual void OnEnter(FighterStateType fromState, object param)
  102. {
  103. //string strinfo;
  104. //if (mFighter.Id == 4)
  105. //{
  106. // if (mState == FighterStateType.Run)
  107. // {
  108. // strinfo = string.Format("Frame = {0},FightId = {1},State = {2}-----Enter",
  109. // mFighter.Battle.FrameCount.ToString(),
  110. // mFighter.Id.ToString(),
  111. // mState.ToString()
  112. // );
  113. // //FighterStateAttack pAttack = this as FighterStateAttack;
  114. // //string strskillinfo = string.Format("-------skillName ={0}",
  115. // //pAttack.mAttackParam.skill.SkillName
  116. // //);
  117. // //strinfo += strskillinfo;
  118. // Debug.Log(strinfo);
  119. // }
  120. //}
  121. }
  122. public virtual void OnLeave ()
  123. {
  124. //string strinfo;
  125. //if (mFighter.Id == 4)
  126. //{
  127. // if (mState == FighterStateType.Run)
  128. // {
  129. // strinfo = string.Format("Frame = {0},FightId = {1},State = {2}-----Leave",
  130. // mFighter.Battle.FrameCount.ToString(),
  131. // mFighter.Id.ToString(),
  132. // mState.ToString()
  133. // );
  134. // Debug.Log(strinfo);
  135. // }
  136. //}
  137. }
  138. public virtual void Update (float deltaTime)
  139. {
  140. }
  141. public void SetAnimatorSpeed(float speed)
  142. {
  143. if(mFighter.Ctrl.Animator != null)
  144. {
  145. mFighter.Ctrl.Animator.SetFloat("moveSpeed", speed);
  146. }
  147. }
  148. public void ForcePlayAnim(string animName)
  149. {
  150. mAnimName = animName;
  151. PlayAnimState();
  152. }
  153. public void PlayAnimState ()
  154. {
  155. if (string.IsNullOrEmpty(mAnimName)) return;
  156. if (mAnimName == FighterAnimatorHash.StateIdle)
  157. return;
  158. if (mFighter.Ctrl.Animator == null)
  159. return;
  160. if (mFighter.Ctrl.Animator.gameObject.activeInHierarchy) {
  161. mFighter.Ctrl.Animator.SetFloat("moveSpeed", 1);
  162. mFighter.Ctrl.Animator.Play(mAnimName);
  163. }
  164. }
  165. public bool CheckAnimState ()
  166. {
  167. if (mAnimName == FighterAnimatorHash.StateIdle)
  168. return false;
  169. if (mFighter.Ctrl.Animator == null)
  170. return false;
  171. if (mFighter.Ctrl.Animator.runtimeAnimatorController!= null && mFighter.Ctrl.Animator.GetCurrentAnimatorStateInfo (0).IsName(mAnimName))
  172. {
  173. return true;
  174. } else
  175. return false;
  176. }
  177. protected int ChangeFrame(float fTime)
  178. {
  179. float fComingFrame = fTime / 30f;
  180. int nAddFrame = fComingFrame - (int)fComingFrame > 0.0f ? 1 : 0;
  181. int nOverFrame = (int)fComingFrame + nAddFrame;
  182. return nOverFrame;
  183. }
  184. public abstract void OnDataChanged ();
  185. public abstract FighterStateType GetTriggerNextState (FighterStateTriggerType triggerType, int checkVal = 0);
  186. }