using System; using System.Reflection; using System.Collections; using System.Collections.Generic; using UnityEngine; public class MonsterState : UnitState { public enum EUnitState { Nien, Idle, Move, HitLight, HitAir, HitGround, HitFall, KnockDown, Rise, Pull, Landing, } [SerializeField] private EUnitState m_State; public EUnitState CurrentState { get { return m_State; } } UnitAnimation unitAnimation { get { return m_Owner.unitAnimation; } } public override void Initialize() { base.Initialize(); } public void ChangeState(EUnitState nextState, T param = default, bool bForce = false) { if (!IsChange(nextState, bForce)) return; LogHelper.Log("Monster UnitState: " + m_State.ToString() + " -> " + nextState.ToString()); StopAllCoroutines(); EUnitState prevState = m_State; string methodFunc = "On" + m_State.ToString() + "Exit"; MethodInfo exitMethod = GetType().GetMethod(methodFunc, BindingFlags.Instance | BindingFlags.NonPublic, null, new Type[] { typeof(EUnitState) }, null); if (exitMethod != null) { exitMethod.Invoke(this, new object[] { nextState }); } else { LogHelper.LogError("缺少 " + methodFunc); } m_State = nextState; StartCoroutine(m_State.ToString(), param); } bool IsChange(EUnitState newState, bool bForce) { if (newState != m_State || bForce) return true; return false; } IEnumerator Nein() { yield break; } void OnNienExit(EUnitState nextState) { } public struct IdleParam { } public struct LandingParam { } public struct HitLightParam { } public struct HitAirParam { } public struct RiseParam { } #region Idle IEnumerator Idle(IdleParam param) { //if (m_Owner.isInAir) // 浮空切换到landing //{ // ChangeState(EUnitState.Landing, new LandingParam()); //} //else // idle //{ m_Owner.SetYPosition(0); m_Owner.monsterAnimation.AnimIdle(); while (true) { yield return null; } //} } void OnIdleExit(EUnitState nextState) { } #endregion #region HitLight IEnumerator HitLight(HitLightParam param) { ((MonsterController)owner).FacePC(); m_Owner.monsterAnimation.AnimHitBackHeavy(); yield return null; while (true) { bool reachEnd = m_Owner.monsterAnimation.layers[0].playbackNormalizedTime == 1; if(reachEnd) { ChangeState(EUnitState.Idle, new IdleParam()); } yield return null; } } void OnHitLightExit(EUnitState nextState) { } #endregion #region HitAir IEnumerator HitAir(HitAirParam param) { m_Owner.monsterAnimation.AnimHitAir(); yield return null; while (true) { bool reachEnd = m_Owner.monsterAnimation.layers[0].playbackNormalizedTime == 1; if (reachEnd) { //yield return new WaitForSeconds(1f); ChangeState(EUnitState.Rise, new RiseParam()); } yield return null; } } void OnHitAirExit(EUnitState nextState) { } #endregion #region Rise IEnumerator Rise(RiseParam param) { m_Owner.monsterAnimation.AnimRise(); yield return null; while (true) { bool reachEnd = m_Owner.monsterAnimation.layers[0].playbackNormalizedTime == 1; if (reachEnd) { ChangeState(EUnitState.Idle, new IdleParam()); } yield return null; } } void OnRiseExit(EUnitState nextState) { } #endregion }