diff options
author | chai <chaifix@163.com> | 2020-11-02 19:53:12 +0800 |
---|---|---|
committer | chai <chaifix@163.com> | 2020-11-02 19:53:12 +0800 |
commit | 3708d0a07ce43c3d98a0171eacfa9c370c873f96 (patch) | |
tree | 728f72bd8e6c464c6f56db7b08755031f685c45c /Assets/Scripts/Avatar | |
parent | 64061aee5d7849f348f07b78fc3f96ad7555c147 (diff) |
*受击
Diffstat (limited to 'Assets/Scripts/Avatar')
-rw-r--r-- | Assets/Scripts/Avatar/Abilities/AbilityBase.cs | 4 | ||||
-rw-r--r-- | Assets/Scripts/Avatar/Abilities/AttackAbility.cs | 35 | ||||
-rw-r--r-- | Assets/Scripts/Avatar/Abilities/MoveAbility.cs | 8 | ||||
-rw-r--r-- | Assets/Scripts/Avatar/AbilitySystem.cs | 41 | ||||
-rw-r--r-- | Assets/Scripts/Avatar/Actions/ActionEffects.meta | 8 | ||||
-rw-r--r-- | Assets/Scripts/Avatar/Avatar.cs | 74 | ||||
-rw-r--r-- | Assets/Scripts/Avatar/HitDefination.cs | 10 | ||||
-rw-r--r-- | Assets/Scripts/Avatar/HitInfo.cs | 10 |
8 files changed, 147 insertions, 43 deletions
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 /// <summary>
/// 检测到hitbox碰撞时的回调
/// </summary>
- public virtual void OnHit() { }
+ public virtual void OnHit(PhysicsCollisionInfo info) { }
/// <summary>
/// 检测到hurtbox碰撞时的回调
/// </summary>
- public virtual void OnHurt() { }
+ public virtual void OnHurt(PhysicsCollisionInfo info) { }
/// <summary>
/// 检测到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<Avatar>();
+ 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; /// </summary> public class AbilitySystem { - private static List<AbilitySystem> AbilitySystems = new List<AbilitySystem>(); - /// <summary> /// 当前执行的ability /// </summary> @@ -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; /// </summary>
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 /// <summary> /// 记录这个hit命中的avatar /// </summary> - private List<Avatar> m_HitAvatars; + private List<Avatar> m_HitAvatars = new List<Avatar>(); 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);
+ } + } |