diff options
author | chai <chaifix@163.com> | 2021-09-01 08:30:42 +0800 |
---|---|---|
committer | chai <chaifix@163.com> | 2021-09-01 08:30:42 +0800 |
commit | a5c191cf74238084d9bd9f805b4b6755f70d956d (patch) | |
tree | 06c0f5a85e6bda587205e5b2bea8e2d9fab4f373 /Assets/Scripts/Unit/Components/UnitState/MonsterState.cs | |
parent | 340bb7224b4f100413541df3b937d90be028a8b1 (diff) |
*改变目录结构
Diffstat (limited to 'Assets/Scripts/Unit/Components/UnitState/MonsterState.cs')
-rw-r--r-- | Assets/Scripts/Unit/Components/UnitState/MonsterState.cs | 179 |
1 files changed, 179 insertions, 0 deletions
diff --git a/Assets/Scripts/Unit/Components/UnitState/MonsterState.cs b/Assets/Scripts/Unit/Components/UnitState/MonsterState.cs new file mode 100644 index 00000000..a9ac0afb --- /dev/null +++ b/Assets/Scripts/Unit/Components/UnitState/MonsterState.cs @@ -0,0 +1,179 @@ +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<T>(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) + { + m_Owner.monsterAnimation.AnimHitLight(); + 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 + + +}
\ No newline at end of file |