using Axibug; using Axibug.Runtime; using System; using System.Collections.Generic; using UnityEngine; using UnityEngine.XR; namespace Game { public abstract class RoleBase : MonoBehaviour { public E_NODE_TYPE RoleType => mBaseData.RoleType; public int RoleID => mBaseData.innate.roleid; public S_ROLE_DATA_BASE BaseData => mBaseData; public ICharMachineBase Anime => mAnime; public Animator AttackBoxAnime; public AttackBox AttackBoxCollider; public Vector2 InputV2; public E_ONCEATTACK_STEP AttackStep = E_ONCEATTACK_STEP.None; public Transform ModelTransfrom { get { return mModelTransfrom; } } public Transform BridgeTransfrom { get { return mBridgeTransfrom; } } /// /// 动画控制器 /// protected ICharMachineBase mAnime; protected S_ROLE_DATA_BASE mBaseData; protected Transform mBridgeTransfrom; protected Transform mModelTransfrom; protected Rigidbody mRigidbody; protected Collider mselfCollider; protected virtual void Awake() { mBridgeTransfrom = transform.Find("Bridge"); mModelTransfrom = mBridgeTransfrom.Find("Model"); mselfCollider = transform.GetComponent(); mRigidbody = transform.GetComponent(); } protected virtual void OnEnable() { IsMove = false; IsLeft = false; AttackStep = E_ONCEATTACK_STEP.None; MeshChangeDir(mIsLeft); } protected virtual void OnDisable() { } /// /// 初始化 /// /// public virtual void Init(S_ROLE_DATA_BASE data) { mBaseData = data; if (RoleType == E_NODE_TYPE.N_MAINPLAYER) { mAnime = new CharacterMachine(); mAnime.InitMachine(mModelTransfrom, data); } else if (RoleType == E_NODE_TYPE.N_MONSTER) { mAnime = new CharacterMachine(); mAnime.InitMachine(mModelTransfrom, data); } else if (RoleType == E_NODE_TYPE.N_NPC) { } } public virtual void SetAttackBoxAnime(Animator attackBoxAnime) { AttackBoxAnime = attackBoxAnime; AttackBoxCollider = attackBoxAnime.transform.Find("Node1/Box1").GetComponent(); AttackBoxCollider.InitNode(this); } protected virtual void Update() { Update_Move(); } protected virtual void FixedUpdate() { FixedUpdate_Move(); } public abstract void MeshChangeMoveState(bool ToMoveState); public void MeshChangeDir(bool ToLeftDir) { mBridgeTransfrom.localEulerAngles = ToLeftDir ? ConstClass.Angle_LeftDir : ConstClass.Angle_RightDir; } public abstract void Release(); #region 移动 private bool mIsMove = false; public float MoveTime = 0; public bool IsMove { get { return mIsMove; } set{ if (mIsMove != value) { mIsMove = value; if (value)//刚开始移动 { MoveTime = 0; MeshChangeMoveState(true); } else//刚停止移动 { MoveTime = 0; Move_currentVector = Vector3.zero;//清空移动方向 MeshChangeMoveState(false); } } } } /// /// 朝向 /// private bool mIsLeft = false; public bool IsLeft { get { return mIsLeft; } set{ if (mIsLeft != value) { mIsLeft = value; MoveTime = 0;//朝向变化时,重置移动时间 if (value)//开始往右 MeshChangeDir(true); else//开始往左 MeshChangeDir(false); } } } void Update_Move() { bool isDoMove = false; if (AttackStep != E_ONCEATTACK_STEP.None) { //如果在攻击流程 就不移动 } else { if (InputV2 != Vector2.zero) { isDoMove = true; Move_currentVector = new Vector3(InputV2.x, 0, InputV2.y); } //AxibugLog.Debug("Move_currentVector =>" + Move_currentVector); //朝向 if (InputV2.x < 0) IsLeft = true; else if (InputV2.x > 0) IsLeft = false; } IsMove = isDoMove; } /// /// 速度 /// protected float Move_BaseSpeed = 3.5f; protected float Move_SpeedMultiplier = 1f; private Vector3 Move_currentVector; /// /// 移动位移 /// void FixedUpdate_Move() { if (IsMove) MoveTime += Time.deltaTime; Vector3 _playerPos = mRigidbody.position; _playerPos += Move_currentVector * Move_BaseSpeed * Move_SpeedMultiplier * Time.deltaTime; mRigidbody.MovePosition(_playerPos); //AxibugLog.Debug("FixedUpdate_Move =>" + _playerPos); } #endregion #region 攻击盒子动画机 public void DoAtkBox(string AtkBoxAnimeName) { AttackBoxAnime.Play(AtkBoxAnimeName); } #endregion } }