summaryrefslogtreecommitdiff
path: root/Assets/Scripts/Unit/Component/MonsterState.cs
blob: 2beba0d59cf9860fa1bae771c5b9b35287c46e01 (plain)
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


}