diff options
author | chai <chaifix@163.com> | 2020-11-16 08:30:54 +0800 |
---|---|---|
committer | chai <chaifix@163.com> | 2020-11-16 08:30:54 +0800 |
commit | f325841eff10ae492ce6c634d4b07cf058a068c6 (patch) | |
tree | 980d81a4b87d571fcb893fc44f8809af97466bca /Assets/Scripts/Avatar/States/AttackState.cs | |
parent | be3ca8b172f22ce7c4c4316745e0df05de58b069 (diff) |
*state system
Diffstat (limited to 'Assets/Scripts/Avatar/States/AttackState.cs')
-rw-r--r-- | Assets/Scripts/Avatar/States/AttackState.cs | 175 |
1 files changed, 175 insertions, 0 deletions
diff --git a/Assets/Scripts/Avatar/States/AttackState.cs b/Assets/Scripts/Avatar/States/AttackState.cs new file mode 100644 index 00000000..ae8f3b66 --- /dev/null +++ b/Assets/Scripts/Avatar/States/AttackState.cs @@ -0,0 +1,175 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +public struct AttackStateConfig +{ + public Vector3 velocity; // velocity setup + public int motion; + public Animator animator; + public PhysicsBody body; +} + +// 单独的一个招式 +public class AttackState : StateBase +{ + AttackStateConfig m_Config = new AttackStateConfig(); + + private List<Trigger> m_Triggers = new List<Trigger>(); + + private List<Trigger> m_PhysicsTriggers = new List<Trigger>(); + + /// <summary> + /// 这个招式配置的hit + /// </summary> + private List<Hit> m_Hits = new List<Hit>(); + + /// <summary> + /// 从动画结束开始计时 + /// </summary> + float m_TimeCount; + public float ExpireTime + { + get + { + return m_TimeCount; + } + } + + /// <summary> + /// 这个招式的hit个数 + /// </summary> + public int HitCount + { + get + { + return m_Hits != null ? m_Hits.Count : 0; + } + } + + + public AttackState(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 AttackState(AttackStateConfig 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_Hits) + { + hit.WipeRecords(); + } + + foreach(var trigger in m_Triggers) + { + trigger.Reset(); + } + } + + public override void OnExit() + { + m_TimeCount = 0; + } + + public override void OnHit(HitInfo info) + { + } + + public override void OnHurt(HurtInfo info) + { + } + + public override void OnTranslate(StateBase 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 stateTrigger in m_Triggers) + { + if (stateTrigger.Update() && stateTrigger.Swallow) + break; + } + } + + // 在物理模拟之后 + public override void OnPhysicsUpdate() + { + foreach (var trigger in m_PhysicsTriggers) + { + 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 AddPhysicsTrigger(Trigger trigger) + { + if (trigger == null || m_PhysicsTriggers.Contains(trigger)) + return; + m_PhysicsTriggers.Add(trigger); + } + + public void AddHitDefination(HitDefination defination) + { + Hit info = new Hit(); + info.defination = defination; + m_Hits.Add(info); + } + + // 获得当前时间点产生的hit + public Hit GetHit() + { + AnimatorStateInfo info = m_Config.animator.GetCurrentAnimatorStateInfo(0); + float normalizeTime = info.normalizedTime; + for (int i = 0; i< m_Hits.Count; ++i) + { + Hit hit = m_Hits[i]; + float start = hit.defination.start; + float end = hit.defination.end; + if(normalizeTime >= start && normalizeTime <= end) + { + return hit; + } + } + return null; + } + +} |