using Adon.Game.Data; using AdonGameKit; using BehaviorDesigner.Runtime; using Chronos; using Cinemachine; using System.Collections; using System.Collections.Generic; using UnityEngine; namespace Adon.Game.BO { /// /// 基础角色类 /// public partial class BaseCharacterAdon : Role { /// /// 受击点 /// public Transform m_HitObj; public Transform m_TopObj; public Transform m_FootObj; /// /// 动作控制器 /// public Animator m_Animator; /// /// 名字 /// private string m_Name; private int m_Id; /// /// 当前攻击id /// public int m_CurAttackIdx; /// /// 技能id /// public int m_SkillId; /// /// 当前状态 /// public eState m_CurState; /// /// 队伍Id /// private int m_TeamId; ///// ///// Buff 列表 ///// //private List m_Buffs = new List(); ///// ///// DeBuff 列表 ///// //private List m_Debuffs = new List(); /// /// 角色属性 /// private CharStatAdon m_Stat = new CharStatAdon(); /// /// 伤害闪光材质对象 /// public Transform m_damageFlash; public Transform m_freezeFlashs; public Transform m_CuringFlashs; public Material[] m_damageFlashMaterial; public Material[] m_freezeFlashMaterial; public Material[] m_CuringFlashMaterial; /// /// 特效管理 /// public FxManagerAdon m_FxManagerAdon; /// /// 震屏组件 /// public CinemachineImpulseSource m_CinemachineImpulseSource; /// /// 头部看向目标组件 /// public HeadLookAtTarget m_PerfectLookAtAdon; public CapsuleCollider m_CapsuleCollider;//胶囊碰撞体 /// /// 武器碰撞体 /// public Collider m_WeaponCol; /// /// 第三人称虚拟相机 /// public CinemachineFreeLook mCM_ThirdPerson; /// /// 角色相机管理 /// public CameraManagerAdon m_CameraManagerAdon; /// /// 模型对象 /// public Transform m_fbx; //public int Id { get => m_Id; set => m_Id = value; } //public string Name { get => m_Name; set => m_Name = value; } //public eState CurState { get => m_CurState; set => m_CurState = value; } public LocalClock[] m_LocalClocks;//局部时钟列表 /// /// 是否不受伤 /// public bool m_NotHurt; /// /// 不受伤时间 /// public bool m_NotHurtTime; protected virtual void Awake() { m_LocalClocks = GetComponentsInChildren();//获取局部时钟列表 m_fbx = transform.Find("FBX"); m_Animator = m_fbx.GetComponent(); m_PerfectLookAtAdon = m_fbx.GetComponent();//看向目标组件 m_HitObj = transform.Find("FBX/Effect_000/Hit"); m_TopObj = transform.Find("FBX/Effect_000/Top"); m_FootObj = transform.Find("FBX/Effect_000/Foot"); if (m_HitObj == null) m_HitObj = transform.Find("FBX/00/Hit"); if (m_TopObj == null) m_TopObj = transform.Find("FBX/00/Top"); if (m_FootObj == null) m_FootObj = transform.Find("FBX/00/Foot"); //获取伤害闪光材质球 m_damageFlash = transform.Find("DamageFlashs"); //获取冰冻伤害材质球 m_freezeFlashs = transform.Find("FreezeFlashs"); //获取治愈材质球 m_CuringFlashs = transform.Find("CuringFlashs"); if (m_damageFlash != null) { SkinnedMeshRenderer[] damageFlashs = m_damageFlash.GetComponentsInChildren(); m_damageFlashMaterial = new Material[damageFlashs.Length]; for (int i = 0; i < m_damageFlashMaterial.Length; i++) { m_damageFlashMaterial[i] = damageFlashs[i].GetComponent().material; } } if (m_freezeFlashs != null) { SkinnedMeshRenderer[] freezeFlashs = m_freezeFlashs.GetComponentsInChildren(); m_freezeFlashMaterial = new Material[freezeFlashs.Length]; for (int i = 0; i < m_freezeFlashMaterial.Length; i++) { m_freezeFlashMaterial[i] = freezeFlashs[i].GetComponent().material; } } if (m_CuringFlashs != null) { SkinnedMeshRenderer[] CuringFlashs = m_CuringFlashs.GetComponentsInChildren(); m_CuringFlashMaterial = new Material[CuringFlashs.Length]; for (int i = 0; i < m_CuringFlashMaterial.Length; i++) { m_CuringFlashMaterial[i] = CuringFlashs[i].GetComponent().material; } } m_FxManagerAdon = this.gameObject.AddComponent();//添加角色特效管理器 m_CinemachineImpulseSource = GetComponent();//震屏组件 m_CapsuleCollider = GetComponent();//获取胶囊碰撞体 } /// /// 发现目标消息 /// /// public virtual void OnMsgFindTarget(){} public virtual void OnMsg_Attacked(Adon.Game.Data.StructData.Attacked_MsgData data) { } /// /// 设置震屏 /// /// 震动起始位置 /// 震动等级 /// 震动持续时间 /// 衰减时间 public void SetCameraShake(Vector3 pos, float lv, float sustainTime = 0.1f, float decayTime = 0.1f) { m_CinemachineImpulseSource.m_ImpulseDefinition.m_AmplitudeGain = lv; m_CinemachineImpulseSource.m_ImpulseDefinition.m_TimeEnvelope.m_SustainTime = sustainTime; m_CinemachineImpulseSource.m_ImpulseDefinition.m_TimeEnvelope.m_DecayTime = decayTime; m_CinemachineImpulseSource.GenerateImpulseAt(pos, Vector3.one); } /// /// 设置局部时钟时间比例 /// /// public void SetLocalClockTimeScale(float timeScale) { for (int i = 0; i < m_LocalClocks.Length; i++) { LocalClock _localClock = m_LocalClocks[i]; _localClock.localTimeScale = timeScale; } } } }