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