using Thousandto.Plugins.Common.UniScene; using System; using System.Collections.Generic; using UnityEngine; using Thousandto.Core.Asset; using Thousandto.Code.Center; using Thousandto.Code.Global; using PathEditor.Proxy.Plugin; using Thousandto.Plugins.PathGrid; namespace Thousandto.Code.Logic { /// /// lua角色类,用于扩展 /// public class LuaCharacter : Entity { #region members //角色所在场景 private GameScene _sceneEx = null; //模型信息 private FSkinModel _roleSkin = null; //是否被屏蔽模型 protected bool _isShowModel = true; #endregion #region //属性接口 public new GameScene Scene { get { if (_sceneEx == null) { _sceneEx = base.Scene as GameScene; } return _sceneEx; } set { _sceneEx = value; base.Scene = value; } } public new FSkinModel Skin { get { if (_roleSkin == null) { _roleSkin = base.Skin as FSkinModel; } return _roleSkin; } set { base.Skin = value; _roleSkin = value; } } //是否被屏蔽模型 public bool IsShowModel { get { return _isShowModel; } set { _isShowModel = value; if (_isShowModel != Skin.IsActive()) { Skin.SetActive(_isShowModel); } } } #endregion #region//lua回调 public Action SetupFSMBeforeHandle = null; public Action SetupFSMHandle = null; public Action InitializeAfterHandle = null; public Action SyncInfoHandle = null; public Action UninitializeBeforeHandle = null; #endregion #region//初始化和卸载 -- 重写父类函数 //加载Skin protected override FSkinBase OnSetupSkin() { FSkinModel skin = GameCenter.LuaSystem.Adaptor.CreateFSkinModel(FSkinTypeCode.Custom); skin.SetLayer(LayerUtils.RemotePlayer); skin.SetMipmapLevel(0.5f); return skin; } //创建FSM之前的处理 protected override bool OnSetupFSMBefore() { ResetDirection(); if(SetupFSMBeforeHandle != null) { SetupFSMBeforeHandle(); } return base.OnSetupFSMBefore(); } //设置FSM protected override bool OnSetupFSM() { Fsm = new EntityFSM(this); if(SetupFSMHandle != null) { SetupFSMHandle(); } Fsm.Init(this); return true; } public void AddState(LuaCharState state) { Fsm.AddState(state); } public void SetDefaultState(int stateId) { Fsm.SetDefaultStateId((EntityStateID)stateId); } //初始化完成 protected override bool OnInitializeAfter(EntityInitInfo baseInfo) { RefreshSkinQuality(); var initInfo = baseInfo as LuaCharInitInfo; if(InitializeAfterHandle != null && initInfo != null) { InitializeAfterHandle(initInfo); } return base.OnInitializeAfter(baseInfo); } //同步数据 public void SyncInfo(EntityInitInfo baseInfo) { var initInfo = baseInfo as LuaCharInitInfo; if (SyncInfoHandle != null && initInfo != null) { SyncInfoHandle(initInfo); } } //卸载之前 protected override void OnUninitializeBefore() { if(UninitializeBeforeHandle != null) { UninitializeBeforeHandle(); } base.Scene = null; _sceneEx = null; } #endregion #region//判断当前角色处于那种状态 //判断当前是否处于某个状态 public bool IsXState(int state) { bool retval = false; if (Fsm != null) { retval = (int)Fsm.CurrentState.StateID == state; } return retval; } #endregion #region//状态改变 //状态改变 public bool ChangeAction(int stateId, object userData) { if (!IsTransAble((EntityStateID)stateId)) return false; var data = StateDateCache.Get(EntityStateID.LuaCharState); data.LuaData = userData; bool ret = Fsm.TryTransTo((EntityStateID)stateId, data); if (ret) { Fsm.Update(0); } return ret; } #endregion #region//其他公共接口 //刷新skin品质 public void RefreshSkinQuality() { var setCode = GameCenter.GameSetting.GetSetting(GameSettingKeyCode.OtherBonesCount); switch (setCode) { case 1: SkinQuality = SkinQuality.Bone1; break; case 2: SkinQuality = SkinQuality.Bone2; break; case 4: SkinQuality = SkinQuality.Bone4; break; } } #endregion #region//重写父类的一些处理 ---- 播放动作等 //播放 protected override bool OnPlayAnim(string anim, AnimationPartType partType = AnimationPartType.AllBody, WrapMode wrapMode = WrapMode.Default, bool isCrossFade = true, float crossFadeTime = 0.2f, float speed = 1f, float normalizedTime = 0.0f) { return Skin.PlayAnim(anim, partType, wrapMode, isCrossFade, crossFadeTime, speed, normalizedTime); } #endregion #region //阻挡判定 public bool IsBlocked(float x, float y) { return Scene.navigator.IsBlocked(new Vector2(x, y)); } #endregion } }