summaryrefslogtreecommitdiff
path: root/Assets/Scripts/Unit/Components/UnitState/MonsterState.cs
diff options
context:
space:
mode:
authorchai <chaifix@163.com>2021-09-01 08:30:42 +0800
committerchai <chaifix@163.com>2021-09-01 08:30:42 +0800
commita5c191cf74238084d9bd9f805b4b6755f70d956d (patch)
tree06c0f5a85e6bda587205e5b2bea8e2d9fab4f373 /Assets/Scripts/Unit/Components/UnitState/MonsterState.cs
parent340bb7224b4f100413541df3b937d90be028a8b1 (diff)
*改变目录结构
Diffstat (limited to 'Assets/Scripts/Unit/Components/UnitState/MonsterState.cs')
-rw-r--r--Assets/Scripts/Unit/Components/UnitState/MonsterState.cs179
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