using System.Collections; using System.Collections.Generic; using UnityEngine; public struct AttackAbilityConfig { public Vector3 velocity; // velocity setup public int motion; public Animator animator; public PhysicsBody body; } // 单独的一个招式 public class AttackAbility : AbilityBase { AttackAbilityConfig m_Config = new AttackAbilityConfig(); private List m_Triggers = new List(); private List m_LateTriggers = new List(); /// /// 这个招式产生的hit /// private List m_HitInfo = new List(); /// /// 从动画结束开始计时 /// float m_TimeCount; public float ExpireTime { get { return m_TimeCount; } } /// /// 这个招式的hit个数 /// public int HitCount { get { return m_HitInfo != null ? m_HitInfo.Count : 0; } } public AttackAbility(Animator animator, int animation, PhysicsBody body = null) { m_Config.animator = animator; m_Config.motion = animation; m_Config.velocity = Vector3.zero; m_Config.body = body; } public AttackAbility(AttackAbilityConfig config) { m_Config = config; } public override void OnInit() { } public override void OnDefend() { throw new System.NotImplementedException(); } public override void OnEnter() { m_TimeCount = 0; m_Config.animator.CrossFade(m_Config.motion, 0); if(m_Config.body != null) { m_Config.body.LocalVelocity = m_Config.velocity; } foreach(var hit in m_HitInfo) { hit.WipeRecords(); } } public override void OnExit() { m_TimeCount = 0; } public override void OnHit(PhysicsCollisionInfo info) { Avatar avatar = info.prim2.GetComponentInParent(); if (avatar == null) return; for (int i = 0; i < m_HitInfo.Count; ++i) { HitInfo hitInfo = m_HitInfo[i]; if(!hitInfo.HasRecord(avatar)) { hitInfo.AddRecord(avatar); Debug.Log("hit " + avatar.Name); PhysicsBody body = avatar.Body; body.AddForce(new Vector3(3000, 0, 0)); if(avatar is ArmorSoldierScript) { ArmorSoldierScript solider = avatar as ArmorSoldierScript; solider.Hurt(); } } } } public override void OnHurt(PhysicsCollisionInfo info) { } public override void OnTranslate(AbilityBase to) { } public override void OnUpdate() { AnimatorStateInfo info = m_Config.animator.GetCurrentAnimatorStateInfo(0); if(info.shortNameHash == m_Config.motion && info.normalizedTime >= 0.99f) { m_TimeCount += Time.deltaTime; } foreach (var abilityTrigger in m_Triggers) { if (abilityTrigger.Update() && abilityTrigger.Swallow) break; } } // 在物理模拟之后 public override void OnLateUpdate() { foreach (var trigger in m_LateTriggers) { if (trigger.Update() && trigger.Swallow) break; } } public void AddTrigger(Trigger trigger) { if (trigger == null || m_Triggers.Contains(trigger)) return; m_Triggers.Add(trigger); } public void AddLateTrigger(Trigger trigger) { if (trigger == null || m_LateTriggers.Contains(trigger)) return; m_LateTriggers.Add(trigger); } public void AddHitDefination(HitDefination defination) { HitInfo info = new HitInfo(); info.defination = defination; m_HitInfo.Add(info); } }