using System; using System.Reflection; using System.Collections; using System.Collections.Generic; using UnityEngine; // 角色状态机 [DisallowMultipleComponent] public partial class PCState : UnitState { public enum EUnitState { Nien, Idle, Move, Spawn, Die, Dead, // Attack, AirAttack, AttackToAir, AirDash, // HitAir, HitAirHit, Knockdown, // HitGuard, // Walk, // Rise, // Jump, // 转身 Turn, Landing, // 从空中降落 } [SerializeField] private EUnitState m_State; public EUnitState CurrentState { get { return m_State; } } private EUnitState m_PrevState; public override void Initialize() { base.Initialize(); owner.onTimelineEvent += OnTimeLineEvent; } public override void Release() { owner.onTimelineEvent -= OnTimeLineEvent; base.Release(); } PCAnimation pcAnimation { get { return m_Owner.pcAnimation; } } public void ChangeState(EUnitState nextState, T param = default, bool bForce = false) { if (!IsChange(nextState, bForce)) return; LogHelper.Log("UnitState: " + m_State.ToString() + " -> " + nextState.ToString()); StopAllCoroutines(); 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_PrevState = m_State; m_State = nextState; if(m_PrevState != m_State && owner.unitRender != null) { // owner.unitRender.SetVisibilityInMainCamera(true); } StartCoroutine(m_State.ToString(), param); } bool IsChange(EUnitState newState, bool bForce) { if (newState != m_State || bForce) return true; return false; } public void TurnAround(bool bRight) { m_Owner.transform.rotation = Quaternion.Euler(0, bRight ? 0 : 180, 0); } public void TurnLeft() { TurnAround(false); } public void TurnRight() { TurnAround(true); } void TryDash() { if (InputManager.Instance.TryCommand(0.5f, KeyCode.A, KeyCode.A)) { TurnLeft(); ChangeState(EUnitState.AirDash, new AirDashParam(), true); } if (InputManager.Instance.TryCommand(0.5f, KeyCode.D, KeyCode.D)) { TurnRight(); ChangeState(EUnitState.AirDash, new AirDashParam(), true); } } void TryTurnAround() { if (Input.GetKey("a")) { TurnLeft(); } if (Input.GetKey("d")) { TurnRight(); } } bool TryTeleport() { if (Input.GetKeyDown("i")) { float offset = owner.isTowardRight ? 1.5f : -1.5f; UnitSnapshotInfo info = owner.TakeSnapshot(); Vector2 dir = TestErika.Instance.monster.owner.center + new Vector3(offset, -0.5f, 0) - owner.center; LensEffect_Dash dash = new LensEffect_Dash(Color.white, 0.1f, Mathf.Atan2(dir.y, dir.x), info); owner.unitLensEffect.AddEffect(dash); owner.center = TestErika.Instance.monster.owner.center + new Vector3(offset, -0.5f, 0); TurnAround(!owner.isTowardRight); return true; } return false; } bool TryBlink() { return false; } bool TryTianyin() { if (Input.GetKeyDown("o")) { float offset = owner.isTowardRight ? 1.2f : -1.2f; TestErika.Instance.monster.owner.center = owner.center + new Vector3(offset, 0.5f, 0); ((MonsterController)TestErika.Instance.monster.owner).monsterState.ChangeState(MonsterState.EUnitState.HitInAir, new MonsterState.HitInAirParam(), true); return true; } return false; } bool TryAttackToAir() { if(Input.GetKey("w") && Input.GetKeyDown("j")) { ChangeState(EUnitState.AttackToAir, new SkillParam()); return true; } return false; } }