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
}
}