| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219 |
- using UnityEngine;
- using System.Collections;
- using System.Collections.Generic;
- public enum FighterStateType
- {
- None = 0,
- Idle,
- Coming, //出场
- Attack,
- BeHit,
- Die,
- Down,
- DownIdle,
- BeHitDown,
- Revive,
- Vertigo,
- Stark,
- NavRun,
- Run,
- Jump,
- Victory,
- Break,
- Sleep,
- }
- public enum FighterStateTriggerType
- {
- Attack,
- BeHit,
- NavRun,
- Run,
- Jump,
- }
-
- delegate FighterState FighterStateCreator (Fighter fighter);
- public abstract class FighterState
- {
- static Dictionary<FighterStateType, FighterStateCreator> creators;
- static Dictionary<Fighter, Dictionary<FighterStateType, FighterState>> cached_fighter_states;
- public static void RegistCacheFighterState (Fighter fighter)
- {
- if (cached_fighter_states == null)
- cached_fighter_states = new Dictionary<Fighter, Dictionary<FighterStateType, FighterState>> ();
- cached_fighter_states.Add (fighter, new Dictionary<FighterStateType, FighterState> ());
- }
- public static void UnregistCacheFighterState (Fighter fighter)
- {
- if (cached_fighter_states != null && cached_fighter_states.ContainsKey (fighter))
- cached_fighter_states.Remove (fighter);
- }
- public static FighterState Create (Fighter fighter, FighterStateType state)
- {
- if (fighter == null) return null;
- if (creators == null)
- RegisterCreators ();
- bool useCache = cached_fighter_states != null && cached_fighter_states.ContainsKey (fighter);
- if (useCache && cached_fighter_states [fighter].ContainsKey (state))
- return cached_fighter_states [fighter] [state];
-
- if (creators.ContainsKey (state)) {
- FighterState resultState = creators [state] (fighter);
- if (useCache)
- cached_fighter_states [fighter].Add (state, resultState);
- return resultState;
- }
-
- return null;
- }
- static void RegisterCreators ()
- {
- creators = new Dictionary<FighterStateType, FighterStateCreator> ();
- creators.Add (FighterStateType.Idle, FighterStateIdle.Creator);
- creators.Add(FighterStateType.Coming, FighterStateComing.Creator);
- creators.Add (FighterStateType.Attack, FighterStateAttack.Creator);
- creators.Add (FighterStateType.BeHit, FighterStateBeHit.Creator);
- creators.Add (FighterStateType.Die, FighterStateDie.Creator);
- creators.Add (FighterStateType.Down, FighterStateDown.Creator);
- creators.Add (FighterStateType.DownIdle, FighterStateDownIdle.Creator);
- creators.Add (FighterStateType.BeHitDown, FighterStateBeHitDown.Creator);
- creators.Add (FighterStateType.Revive, FighterStateResurrection.Creator);
- creators.Add (FighterStateType.Vertigo, FighterStateVertigo.Creator);
- creators.Add (FighterStateType.Stark, FighterStateStark.Creator);
- creators.Add (FighterStateType.NavRun, FigterStateNavRun.Creator);
- creators.Add (FighterStateType.Run, FighterStateRun.Creator);
- creators.Add (FighterStateType.Break, FighterStateBreak.Creator);
- creators.Add (FighterStateType.Sleep, FighterStateSleep.Creator);
- }
- protected FighterStateType mState;
- protected Fighter mFighter;
- protected FighterStateData mStateData;
- protected string mAnimName;
- protected int m_nFrame = 0;
- protected FighterState (Fighter fighter, FighterStateType state, bool reentrant = false)
- {
- mFighter = fighter;
- mState = state;
- Reentrant = reentrant;
- mStateData = fighter.StateData;
- mAnimName = FighterAnimatorHash.StateIdle;
- m_nFrame = 0;
- }
- public FighterStateType State { get { return mState; } }
- public bool Reentrant { get; private set; }
- public bool IsAnimValid { get { return mFighter.Ctrl.Animator != null; } }
- public virtual void OnEnter(FighterStateType fromState, object param)
- {
- //string strinfo;
- //if (mFighter.Id == 4)
- //{
- // if (mState == FighterStateType.Run)
- // {
- // strinfo = string.Format("Frame = {0},FightId = {1},State = {2}-----Enter",
- // mFighter.Battle.FrameCount.ToString(),
- // mFighter.Id.ToString(),
- // mState.ToString()
- // );
- // //FighterStateAttack pAttack = this as FighterStateAttack;
- // //string strskillinfo = string.Format("-------skillName ={0}",
- // //pAttack.mAttackParam.skill.SkillName
- // //);
- // //strinfo += strskillinfo;
- // Debug.Log(strinfo);
- // }
- //}
- }
- public virtual void OnLeave ()
- {
- //string strinfo;
- //if (mFighter.Id == 4)
- //{
- // if (mState == FighterStateType.Run)
- // {
- // strinfo = string.Format("Frame = {0},FightId = {1},State = {2}-----Leave",
- // mFighter.Battle.FrameCount.ToString(),
- // mFighter.Id.ToString(),
- // mState.ToString()
- // );
- // Debug.Log(strinfo);
- // }
- //}
- }
- public virtual void Update (float deltaTime)
- {
- }
- public void SetAnimatorSpeed(float speed)
- {
- if(mFighter.Ctrl.Animator != null)
- {
- mFighter.Ctrl.Animator.SetFloat("moveSpeed", speed);
- }
- }
- public void ForcePlayAnim(string animName)
- {
- mAnimName = animName;
- PlayAnimState();
- }
- public void PlayAnimState ()
- {
- if (string.IsNullOrEmpty(mAnimName)) return;
- if (mAnimName == FighterAnimatorHash.StateIdle)
- return;
- if (mFighter.Ctrl.Animator == null)
- return;
- if (mFighter.Ctrl.Animator.gameObject.activeInHierarchy) {
- mFighter.Ctrl.Animator.SetFloat("moveSpeed", 1);
- mFighter.Ctrl.Animator.Play(mAnimName);
- }
- }
- public bool CheckAnimState ()
- {
- if (mAnimName == FighterAnimatorHash.StateIdle)
- return false;
- if (mFighter.Ctrl.Animator == null)
- return false;
- if (mFighter.Ctrl.Animator.runtimeAnimatorController!= null && mFighter.Ctrl.Animator.GetCurrentAnimatorStateInfo (0).IsName(mAnimName))
- {
- return true;
- } else
- return false;
- }
- protected int ChangeFrame(float fTime)
- {
- float fComingFrame = fTime / 30f;
- int nAddFrame = fComingFrame - (int)fComingFrame > 0.0f ? 1 : 0;
- int nOverFrame = (int)fComingFrame + nAddFrame;
- return nOverFrame;
- }
- public abstract void OnDataChanged ();
- public abstract FighterStateType GetTriggerNextState (FighterStateTriggerType triggerType, int checkVal = 0);
- }
|