1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
|
using System;
using System.Reflection;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class MonsterState : UnitState
{
public enum EUnitState
{
Nien,
Idle,
Move,
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 { }
#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
}
|