//------------------------------------------------------------ // Game Framework // Copyright © 2013-2021 Jiang Yin. All rights reserved. // Homepage: https://gameframework.cn/ // Feedback: mailto:ellan@gameframework.cn //------------------------------------------------------------ using UnityEngine; using UnityGameFramework.Runtime; namespace MetaClient { /// /// 可作为目标的实体类。 /// public abstract class TargetableObject : Entity { [SerializeField] private TargetableObjectData m_TargetableObjectData = null; public bool IsDead { get { return m_TargetableObjectData.HP <= 0; } } public abstract ImpactData GetImpactData(); public void ApplyDamage(Entity attacker, int damageHP) { float fromHPRatio = m_TargetableObjectData.HPRatio; m_TargetableObjectData.HP -= damageHP; float toHPRatio = m_TargetableObjectData.HPRatio; if (fromHPRatio > toHPRatio) { GameEntry.HPBar.ShowHPBar(this, fromHPRatio, toHPRatio); } if (m_TargetableObjectData.HP <= 0) { OnDead(attacker); } } #if UNITY_2017_3_OR_NEWER protected override void OnInit(object userData) #else protected internal override void OnInit(object userData) #endif { base.OnInit(userData); gameObject.SetLayerRecursively(Constant.Layer.TargetableObjectLayerId); } #if UNITY_2017_3_OR_NEWER protected override void OnShow(object userData) #else protected internal override void OnShow(object userData) #endif { base.OnShow(userData); m_TargetableObjectData = userData as TargetableObjectData; if (m_TargetableObjectData == null) { Log.Error("Targetable object data is invalid."); return; } } protected virtual void OnDead(Entity attacker) { GameEntry.Entity.HideEntity(this); } private void OnTriggerEnter(Collider other) { Entity entity = other.gameObject.GetComponent(); if (entity == null) { return; } if (entity is TargetableObject && entity.Id >= Id) { // 碰撞事件由 Id 小的一方处理,避免重复处理 return; } AIUtility.PerformCollision(this, entity); } } }