using System; using System.Collections.Generic; using Fantasy; using Fantasy.Entitas; using NBF.Utils; using UnityEngine; namespace NBF { public class Player : Entity { // ========== 本地状态 ========== /// /// 是否本地玩家 /// public bool IsLocalPlayer; /// /// 是否切换物品中 /// public bool IsChangeItemIng; public bool IsLureRod => false; public bool IsSelf => RoleModel.Instance.Id == Id; // ========== 物理状态(高频同步) ========== public Vector3 Position; public Quaternion Rotation; public Vector2 MoveInput; public float Speed; public float RotationSpeed; public bool IsGrounded; public bool Run; public float EyeAngle; /// /// 标志量 /// public long TagValue; /// /// 上一个状态 /// public PlayerState PreviousState; /// /// 当前状态 /// public PlayerState State; /// /// 状态参数 /// public StateEnterParams StateParams; /// /// 玩家的物品 /// public Dictionary Items = new Dictionary(); /// /// 当前手持物品id /// public long HandItemId; /// /// 当前手持物品 /// public PlayerItem HandItem => Items.GetValueOrDefault(HandItemId); #region 初始化 public void InitPlayer(MapUnitInfo unitInfo) { AddComponent(); AddComponent(); if (unitInfo.Id == RoleModel.Instance.Id) { //自己 AddComponent(); } } #endregion #region 物品 public void ReleaseItem(PlayerItem item) { if (Items.ContainsValue(item)) { Items.Remove(item.Id); item.Dispose(); } } public void UnUseItem() { var prevItem = HandItem; HandItemId = 0; ItemChangeEvent(prevItem); } public void UseItem(ItemInfo item) { var prevItem = HandItem; var itemType = item.ConfigId.GetItemType(); if (itemType == ItemType.Rod) { var playerItemRod = Create(Scene); playerItemRod.Init(this, item); Items[playerItemRod.Id] = playerItemRod; HandItemId = playerItemRod.Id; } ItemChangeEvent(prevItem); } private void ItemChangeEvent(PlayerItem prevItem) { Scene.EventComponent.Publish(new PlayerItemChangeEvent { Player = this, Item = HandItem, PrevItem = prevItem }); } #endregion #region 状态切换 /// /// 切换状态 /// /// /// public void ChangeState(PlayerState state, StateEnterParams stateParams = null) { if (state == State) { return; } PreviousState = State; State = state; StateParams = stateParams; Scene.EventComponent.Publish(new PlayerStateChangeEvent { Player = this }); } #endregion } }