From 3708d0a07ce43c3d98a0171eacfa9c370c873f96 Mon Sep 17 00:00:00 2001 From: chai Date: Mon, 2 Nov 2020 19:53:12 +0800 Subject: =?UTF-8?q?*=E5=8F=97=E5=87=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Assets/Scripts/Avatar/Abilities/AbilityBase.cs | 4 +- Assets/Scripts/Avatar/Abilities/AttackAbility.cs | 35 ++++++++++- Assets/Scripts/Avatar/Abilities/MoveAbility.cs | 8 --- Assets/Scripts/Avatar/AbilitySystem.cs | 41 ++++++------- Assets/Scripts/Avatar/Actions/ActionEffects.meta | 8 +++ Assets/Scripts/Avatar/Avatar.cs | 74 +++++++++++++++++++++++- Assets/Scripts/Avatar/HitDefination.cs | 10 ++-- Assets/Scripts/Avatar/HitInfo.cs | 10 +++- 8 files changed, 147 insertions(+), 43 deletions(-) create mode 100644 Assets/Scripts/Avatar/Actions/ActionEffects.meta (limited to 'Assets/Scripts/Avatar') diff --git a/Assets/Scripts/Avatar/Abilities/AbilityBase.cs b/Assets/Scripts/Avatar/Abilities/AbilityBase.cs index 8b1a5549..28f0e8d6 100644 --- a/Assets/Scripts/Avatar/Abilities/AbilityBase.cs +++ b/Assets/Scripts/Avatar/Abilities/AbilityBase.cs @@ -52,12 +52,12 @@ public abstract class AbilityBase /// /// 检测到hitbox碰撞时的回调 /// - public virtual void OnHit() { } + public virtual void OnHit(PhysicsCollisionInfo info) { } /// /// 检测到hurtbox碰撞时的回调 /// - public virtual void OnHurt() { } + public virtual void OnHurt(PhysicsCollisionInfo info) { } /// /// 检测到defendbox碰撞时的回调 diff --git a/Assets/Scripts/Avatar/Abilities/AttackAbility.cs b/Assets/Scripts/Avatar/Abilities/AttackAbility.cs index 117dca7e..38c5d62f 100644 --- a/Assets/Scripts/Avatar/Abilities/AttackAbility.cs +++ b/Assets/Scripts/Avatar/Abilities/AttackAbility.cs @@ -80,6 +80,11 @@ public class AttackAbility : AbilityBase { m_Config.body.LocalVelocity = m_Config.velocity; } + + foreach(var hit in m_HitInfo) + { + hit.WipeRecords(); + } } public override void OnExit() @@ -87,11 +92,30 @@ public class AttackAbility : AbilityBase m_TimeCount = 0; } - public override void OnHit() + 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() + public override void OnHurt(PhysicsCollisionInfo info) { } @@ -137,4 +161,11 @@ public class AttackAbility : AbilityBase m_LateTriggers.Add(trigger); } + public void AddHitDefination(HitDefination defination) + { + HitInfo info = new HitInfo(); + info.defination = defination; + m_HitInfo.Add(info); + } + } diff --git a/Assets/Scripts/Avatar/Abilities/MoveAbility.cs b/Assets/Scripts/Avatar/Abilities/MoveAbility.cs index 757cd2d1..cf9fa106 100644 --- a/Assets/Scripts/Avatar/Abilities/MoveAbility.cs +++ b/Assets/Scripts/Avatar/Abilities/MoveAbility.cs @@ -37,14 +37,6 @@ public class MoveAbility : AbilityBase { } - public override void OnHit() - { - } - - public override void OnHurt() - { - } - public override void OnTranslate(AbilityBase to) { } diff --git a/Assets/Scripts/Avatar/AbilitySystem.cs b/Assets/Scripts/Avatar/AbilitySystem.cs index 46156c55..024e73cb 100644 --- a/Assets/Scripts/Avatar/AbilitySystem.cs +++ b/Assets/Scripts/Avatar/AbilitySystem.cs @@ -7,8 +7,6 @@ using UnityEngine; /// public class AbilitySystem { - private static List AbilitySystems = new List(); - /// /// 当前执行的ability /// @@ -26,23 +24,6 @@ public class AbilitySystem public AbilitySystem() { - AbilitySystems.Add(this); - } - - public static void Update() - { - foreach(var systems in AbilitySystems) - { - systems.OnUpdate(); - } - } - - public static void LateUpdate() - { - foreach (var systems in AbilitySystems) - { - systems.OnLateUpdate(); - } } public void ForceStart(AbilityBase ability) @@ -76,10 +57,24 @@ public class AbilitySystem { m_Currrent.OnLateUpdate(); } - } - - - public void SwitchToAbility(AbilityBase targetAbility) + } + + public void OnHit(PhysicsCollisionInfo info) + { + if(m_Currrent != null) + { + m_Currrent.OnHit(info); + } + } + public void OnHurt(PhysicsCollisionInfo info) + { + if (m_Currrent != null) + { + m_Currrent.OnHurt(info); + } + } + + public void SwitchToAbility(AbilityBase targetAbility) { if (m_Currrent != null) m_Currrent.OnExit(); diff --git a/Assets/Scripts/Avatar/Actions/ActionEffects.meta b/Assets/Scripts/Avatar/Actions/ActionEffects.meta new file mode 100644 index 00000000..17a426dd --- /dev/null +++ b/Assets/Scripts/Avatar/Actions/ActionEffects.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 0b5ccfefc2e6b104a8566f4da9a16c5f +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Avatar/Avatar.cs b/Assets/Scripts/Avatar/Avatar.cs index 47d8c4b7..a8d90fa7 100644 --- a/Assets/Scripts/Avatar/Avatar.cs +++ b/Assets/Scripts/Avatar/Avatar.cs @@ -8,18 +8,34 @@ using UnityEngine; /// public class Avatar : MonoBehaviour, IInteractable { + public string Name; - + // 一个角色包括一个身体的collider和若干hitbox和hurtbox public PhysicsBody m_Body; public PhysicsBox m_BodyCollider; public PhysicsBox[] m_Hitbox; public PhysicsBox[] m_Hurtbox; + protected AbilitySystem m_AbilitySystem = new AbilitySystem(); + + public PhysicsBody Body + { + get + { + return m_Body; + } + } + public PhysicsPrimitive[] GetAllPrimitive() { throw new System.NotImplementedException(); } + protected void Init() + { + AvatarManager.Instance.AddAvatar(this); + } + public PhysicsBox GetHitbox() { throw new System.NotImplementedException(); @@ -59,4 +75,60 @@ public class Avatar : MonoBehaviour, IInteractable return false; } + public void OnUpdate() + { + m_AbilitySystem.OnUpdate(); + } + + // 在物理模拟之后调用 + public void OnLateUpdate() + { + // hitbox + for(int i = 0;i < m_Hitbox.Length; ++i) + { + PhysicsBox hitbox = m_Hitbox[i]; + if (hitbox == null || !hitbox.IsActive) + continue; + for(int j = 0;j < PhysicsWorld.Instance.Collisions.Count; ++j) + { + PhysicsCollisionInfo info = PhysicsWorld.Instance.Collisions[j]; + if(info.prim1 == hitbox) + { + m_AbilitySystem.OnHit(info); + } + else if(info.prim2 == hitbox) + { + PhysicsPrimitive temp = info.prim1; + info.prim1 = info.prim2; + info.prim2 = temp; + m_AbilitySystem.OnHit(info); + } + } + } + // hurtbox + for (int i = 0; i < m_Hurtbox.Length; ++i) + { + PhysicsBox hurtbox = m_Hurtbox[i]; + if (hurtbox == null || !hurtbox.IsActive) + continue; + for (int j = 0; j < PhysicsWorld.Instance.Collisions.Count; ++j) + { + PhysicsCollisionInfo info = PhysicsWorld.Instance.Collisions[j]; + if (info.prim1 == hurtbox) + { + m_AbilitySystem.OnHurt(info); + } + else if(info.prim2 == hurtbox) + { + PhysicsPrimitive temp = info.prim1; + info.prim1 = info.prim2; + info.prim2 = temp; + m_AbilitySystem.OnHurt(info); + } + } + } + + m_AbilitySystem.OnLateUpdate(); + } + } diff --git a/Assets/Scripts/Avatar/HitDefination.cs b/Assets/Scripts/Avatar/HitDefination.cs index 1f622b32..96ceaf00 100644 --- a/Assets/Scripts/Avatar/HitDefination.cs +++ b/Assets/Scripts/Avatar/HitDefination.cs @@ -8,11 +8,11 @@ public class HitDefination public float start = 0f; public float end = 1f; // 触发的开始和结束时间范围,用来处理一个attack多个hit的情况 - public int effectID = 0; // 特效 - public Transform effectHost = null; // 特效挂点 - public Vector3 effectPosition; // 特效位置(effectHost为空时生效) - public Quaternion effectRotation; // 特效旋转 - public Vector3 effectScale = Vector3.one; // 特效缩放 + public int sparkID = 0; // 特效perfab ID + public Transform sparkHost = null; // 特效挂点 + public Vector3 sparkPosition; // 特效位置(sparkHost为空时生效) + public Quaternion sparkRotation; // 特效旋转 + public Vector3 sparkScale = Vector3.one; // 特效缩放 } \ No newline at end of file diff --git a/Assets/Scripts/Avatar/HitInfo.cs b/Assets/Scripts/Avatar/HitInfo.cs index bdb116eb..8d24f6ee 100644 --- a/Assets/Scripts/Avatar/HitInfo.cs +++ b/Assets/Scripts/Avatar/HitInfo.cs @@ -9,11 +9,11 @@ public class HitInfo /// /// 记录这个hit命中的avatar /// - private List m_HitAvatars; + private List m_HitAvatars = new List(); public void AddRecord(Avatar avatar) { - if (m_HitAvatars.Contains(avatar)) + if (!m_HitAvatars.Contains(avatar)) m_HitAvatars.Add(avatar); } @@ -22,4 +22,10 @@ public class HitInfo { m_HitAvatars.Clear(); } + + public bool HasRecord(Avatar avatar) + { + return m_HitAvatars.Contains(avatar); + } + } -- cgit v1.1-26-g67d0