using System.Collections.Generic; using TEngine.Runtime.Entity; using UnityEngine; namespace TEngine.Runtime.Actor { public class ActorEntity : EntityLogicEx { protected override void OnShow(object userData) { base.OnInit(userData); var entityData = (EntityData)userData; GameActor actor = (GameActor)entityData.UserData; actor.Get().BindModel(gameObject); } protected override void OnHide(bool isShutdown, object userData) { } } /// /// 玩家Actor,把Actor具象化成玩家 /// public class PlayerActor:GameActor { public override int GetActorType() { return ActorType.ActorPlayer; } public override void Awake() { base.Awake(); } public override void OnInit() { base.OnInit(); } } /// /// Animator组件 /// public class AnimatorComponent : ActorComponent { private Animator _animator; protected override void Awake() { base.Awake(); _animator = OwnActor.gameObject.AddComponent(); } } /// /// 模型组件 /// public class ModelComponent : ActorComponent { private GameObject _model; protected override void Awake() { base.Awake(); InitModel(); BindOwnActor(); } private void InitModel() { //普通创建实体 // var obj = TResources.Load("Capsule"); // _model = Object.Instantiate(obj); //通过Entity创建实体 PlayEntityMgr.Instance.CreatePlayerEntity(OwnActor,"Capsule",Vector3.zero, Quaternion.identity); } public void BindModel(GameObject gameObject) { _model = gameObject; BindOwnActor(); } private void BindOwnActor() { if (_model == null) { return; } _model.transform.SetParent(OwnActor.gameObject.transform); } } /// /// 状态机组件 /// public class FsmComponent : ActorComponent { public IFsm Fsm; protected override void Awake() { base.Awake(); List> stateList = new List>() { IdleState.Create(), MoveState.Create() }; Fsm = FsmManager.Instance.CreateFsm(OwnActor.ActorId.ToString(), this, stateList); Fsm.Start(); } #region 状态机 public class IdleState : FsmState, IMemory { //触发移动的指令列表 private static KeyCode[] MOVE_COMMANDS = { KeyCode.LeftArrow, KeyCode.RightArrow, KeyCode.UpArrow, KeyCode.DownArrow, KeyCode.A, KeyCode.W, KeyCode.S, KeyCode.D }; protected override void OnInit(IFsm fsm) { base.OnInit(fsm); } protected override void OnEnter(IFsm fsm) { Log.Warning("OnEnter IdleState"); base.OnEnter(fsm); } protected override void OnUpdate(IFsm fsm, float elapseSeconds, float realElapseSeconds) { base.OnUpdate(fsm, elapseSeconds, realElapseSeconds); foreach (var command in MOVE_COMMANDS) { //触发任何一个移动指令时 if (Input.GetKeyDown(command)) { //记录这个移动指令 fsm.SetData("MoveCommand", (int)command); //切换到移动状态 ChangeState(fsm); } } } protected override void OnLeave(IFsm fsm, bool isShutdown) { base.OnLeave(fsm, isShutdown); } protected override void OnDestroy(IFsm fsm) { base.OnDestroy(fsm); } public static IdleState Create() { IdleState state = MemoryPool.Acquire(); return state; } public void Clear() { //此类无状态记录,Clear为空实现 } } public class MoveState : FsmState, IMemory { private static readonly float EXIT_TIME = 0.01f; private float exitTimer; private KeyCode moveCommand; protected override void OnInit(IFsm fsm) { base.OnInit(fsm); } protected override void OnEnter(IFsm fsm) { base.OnEnter(fsm); //进入移动状态时,获取移动指令数据 moveCommand = (KeyCode)(int)fsm.GetData("MoveCommand"); Log.Warning("OnEnter MoveState" + moveCommand); } protected override void OnUpdate(IFsm fsm, float elapseSeconds, float realElapseSeconds) { base.OnUpdate(fsm, elapseSeconds, realElapseSeconds); //计时器累计时间 exitTimer += elapseSeconds; //switch(moveCommand) //{ //根据移动方向指令向对应方向移动 //} if (moveCommand != 0) { exitTimer = 0; } //达到指定时间后 if (exitTimer > EXIT_TIME) { //切换回空闲状态 ChangeState(fsm); } } protected override void OnLeave(IFsm fsm, bool isShutdown) { base.OnLeave(fsm, isShutdown); //推出移动状态时,把计时器清零 exitTimer = 0; //清空移动指令 moveCommand = KeyCode.None; fsm.RemoveData("MoveCommand"); } protected override void OnDestroy(IFsm fsm) { base.OnDestroy(fsm); } public static MoveState Create() { MoveState state = MemoryPool.Acquire(); return state; } public void Clear() { //还原状态内数据 exitTimer = 0; moveCommand = KeyCode.None; } } #endregion } }