summaryrefslogtreecommitdiff
path: root/Assets/Scripts/Avatar
diff options
context:
space:
mode:
authorchai <chaifix@163.com>2020-11-02 19:53:12 +0800
committerchai <chaifix@163.com>2020-11-02 19:53:12 +0800
commit3708d0a07ce43c3d98a0171eacfa9c370c873f96 (patch)
tree728f72bd8e6c464c6f56db7b08755031f685c45c /Assets/Scripts/Avatar
parent64061aee5d7849f348f07b78fc3f96ad7555c147 (diff)
*受击
Diffstat (limited to 'Assets/Scripts/Avatar')
-rw-r--r--Assets/Scripts/Avatar/Abilities/AbilityBase.cs4
-rw-r--r--Assets/Scripts/Avatar/Abilities/AttackAbility.cs35
-rw-r--r--Assets/Scripts/Avatar/Abilities/MoveAbility.cs8
-rw-r--r--Assets/Scripts/Avatar/AbilitySystem.cs41
-rw-r--r--Assets/Scripts/Avatar/Actions/ActionEffects.meta8
-rw-r--r--Assets/Scripts/Avatar/Avatar.cs74
-rw-r--r--Assets/Scripts/Avatar/HitDefination.cs10
-rw-r--r--Assets/Scripts/Avatar/HitInfo.cs10
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);
+ }
+
}