summaryrefslogtreecommitdiff
path: root/Assets/Scripts/Unit
diff options
context:
space:
mode:
authorchai <chaifix@163.com>2021-08-06 09:31:08 +0800
committerchai <chaifix@163.com>2021-08-06 09:31:08 +0800
commit35f2e468715e12d93cb88f2258c2d0ae82d1d189 (patch)
tree1edb1f0919cee10352e8e732654c959ff2e471dd /Assets/Scripts/Unit
parent128d70642ddb8fa7818a84d0d23ca24ed2f8802c (diff)
*collision
Diffstat (limited to 'Assets/Scripts/Unit')
-rw-r--r--Assets/Scripts/Unit/Collider/ColliderRegistry.cs20
-rw-r--r--Assets/Scripts/Unit/Collider/ColliderRegistry.cs.meta11
-rw-r--r--Assets/Scripts/Unit/Collider/CollisionSystem.cs108
-rw-r--r--Assets/Scripts/Unit/Collider/CollisionSystem.cs.meta11
-rw-r--r--Assets/Scripts/Unit/Component/UnitAnimation.cs1
-rw-r--r--Assets/Scripts/Unit/Component/UnitCollider.cs36
-rw-r--r--Assets/Scripts/Unit/Controller/UnitController.cs29
7 files changed, 184 insertions, 32 deletions
diff --git a/Assets/Scripts/Unit/Collider/ColliderRegistry.cs b/Assets/Scripts/Unit/Collider/ColliderRegistry.cs
new file mode 100644
index 00000000..d51e9615
--- /dev/null
+++ b/Assets/Scripts/Unit/Collider/ColliderRegistry.cs
@@ -0,0 +1,20 @@
+using System.Collections;
+using System.Collections.Generic;
+using UnityEngine;
+
+public class ColliderRegistry : Singleton<ColliderRegistry>
+{
+ public List<UnitCollider> colliders = new List<UnitCollider>();
+
+ public void AddCollider(UnitCollider collider)
+ {
+ if (!colliders.Contains(collider))
+ colliders.Add(collider);
+ }
+
+ public void RemoveCollider(UnitCollider collider)
+ {
+ if (colliders.Contains(collider))
+ colliders.Remove(collider);
+ }
+} \ No newline at end of file
diff --git a/Assets/Scripts/Unit/Collider/ColliderRegistry.cs.meta b/Assets/Scripts/Unit/Collider/ColliderRegistry.cs.meta
new file mode 100644
index 00000000..8007287c
--- /dev/null
+++ b/Assets/Scripts/Unit/Collider/ColliderRegistry.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 7787595f1b3721847aeca526a55446b9
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Scripts/Unit/Collider/CollisionSystem.cs b/Assets/Scripts/Unit/Collider/CollisionSystem.cs
new file mode 100644
index 00000000..efbb2784
--- /dev/null
+++ b/Assets/Scripts/Unit/Collider/CollisionSystem.cs
@@ -0,0 +1,108 @@
+using System.Collections;
+using System.Collections.Generic;
+using UnityEngine;
+
+public struct ColliderDescriptor
+{
+ public ColliderInfo colliderInfo;
+ public UnitCollider unitCollider;
+}
+
+public struct CollisionInfo
+{
+ ColliderDescriptor collider; // 主动
+ ColliderDescriptor collidee; // 从动
+}
+
+public class CollisionSystem : SingletonMB<CollisionSystem>
+{
+ public delegate void StageHandle();
+
+ public StageHandle onSolveHit;
+
+ [SerializeField]
+ private int m_UnitColliderCount;
+
+ ColliderRegistry registry { get { return ColliderRegistry.Instance; } }
+
+ private void Start()
+ {
+ }
+
+ void Update()
+ {
+ m_UnitColliderCount = registry.colliders != null ? registry.colliders.Count : 0;
+
+ SolveHit();
+ }
+
+ // hitbox <-> hurtbox
+ void SolveHit()
+ {
+ // collect all hit box
+ List<ColliderDescriptor> hitboxes = ListPool<ColliderDescriptor>.Get();
+ foreach (var collider in registry.colliders)
+ {
+ ColliderInfo[] boxes = collider.GetCurrentBoxesInfoByType(ColliderBox.EColliderType.HitBox);
+ if (boxes == null || boxes.Length == 0)
+ continue;
+ for(int i = 0; i < boxes.Length; ++i)
+ {
+ ColliderDescriptor descriptor = new ColliderDescriptor();
+ descriptor.colliderInfo = boxes[i];
+ descriptor.unitCollider = collider;
+ hitboxes.Add(descriptor);
+ }
+ }
+ // collect all hurt box
+ List<ColliderDescriptor> hurtboxes = ListPool<ColliderDescriptor>.Get();
+ foreach (var collider in registry.colliders)
+ {
+ ColliderInfo[] boxes = collider.GetCurrentBoxesInfoByType(ColliderBox.EColliderType.HurtBox);
+ if (boxes == null || boxes.Length == 0)
+ continue;
+ for (int i = 0; i < boxes.Length; ++i)
+ {
+ ColliderDescriptor descriptor = new ColliderDescriptor();
+ descriptor.colliderInfo = boxes[i];
+ descriptor.unitCollider = collider;
+ hurtboxes.Add(descriptor);
+ }
+ }
+
+ // solve
+ for(int i = 0; i < hitboxes.Count; ++ i)
+ {
+ ColliderDescriptor hitbox = hitboxes[i];
+ for (int j = 0; j < hurtboxes.Count; ++j)
+ {
+ ColliderDescriptor hurtbox = hurtboxes[j];
+ if (hitbox.unitCollider == hurtbox.unitCollider) // 同一个角色的hitbox和hurtbox不交互
+ continue;
+
+ }
+ }
+
+ ListPool<ColliderDescriptor>.Release(hitboxes);
+ ListPool<ColliderDescriptor>.Release(hurtboxes);
+ }
+
+ // throwbox <-> hurtbox
+ void SolveThrow()
+ {
+
+ }
+
+ // defendbox <-> hurtbox
+ void SolveDefend()
+ {
+
+ }
+
+ // blockbox <-> hitbox
+ void SolveBlock()
+ {
+
+ }
+
+}
diff --git a/Assets/Scripts/Unit/Collider/CollisionSystem.cs.meta b/Assets/Scripts/Unit/Collider/CollisionSystem.cs.meta
new file mode 100644
index 00000000..948c0ac7
--- /dev/null
+++ b/Assets/Scripts/Unit/Collider/CollisionSystem.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: dc2cc9a83ab4066478ac795935406ee2
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Scripts/Unit/Component/UnitAnimation.cs b/Assets/Scripts/Unit/Component/UnitAnimation.cs
index 8a8b79a6..e1bca484 100644
--- a/Assets/Scripts/Unit/Component/UnitAnimation.cs
+++ b/Assets/Scripts/Unit/Component/UnitAnimation.cs
@@ -164,7 +164,6 @@ public class AnimatorLayerInfo
yield return null;
}
}
-
}
// 控制动画播放、执行动作timeline(包括执行事件和碰撞盒)
diff --git a/Assets/Scripts/Unit/Component/UnitCollider.cs b/Assets/Scripts/Unit/Component/UnitCollider.cs
index 57585ba2..3d6bca70 100644
--- a/Assets/Scripts/Unit/Component/UnitCollider.cs
+++ b/Assets/Scripts/Unit/Component/UnitCollider.cs
@@ -2,29 +2,14 @@
using System.Collections.Generic;
using UnityEngine;
-public class ColliderRegistry : Singleton<ColliderRegistry>
-{
- public List<UnitCollider> colliders = new List<UnitCollider>();
-
- public void AddCollider(UnitCollider collider)
- {
- if (!colliders.Contains(collider))
- colliders.Add(collider);
- }
-
- public void RemoveCollider(UnitCollider collider)
- {
- if (colliders.Contains(collider))
- colliders.Remove(collider);
- }
-}
-
// 角色当前的碰撞盒
[DisallowMultipleComponent]
public class UnitCollider : UnitComponent
{
public bool showGizmos;
+ private Dictionary<int/*hitbox hash*/, List<int/*unitController hash*/>> hitMask = new Dictionary<int, List<int>>();
+
public override void Awake()
{
base.Awake();
@@ -56,6 +41,23 @@ public class UnitCollider : UnitComponent
return infos;
}
+ // 动作切换,重置collider mask
+ public void OnAnimationChange()
+ {
+ hitMask.Clear();
+
+ }
+
+ public void RecordCollision()
+ {
+
+ }
+
+ public bool CanCollide()
+ {
+ return true;
+ }
+
#if UNITY_EDITOR
public void OnDrawGizmos()
diff --git a/Assets/Scripts/Unit/Controller/UnitController.cs b/Assets/Scripts/Unit/Controller/UnitController.cs
index 031f4697..a9baf595 100644
--- a/Assets/Scripts/Unit/Controller/UnitController.cs
+++ b/Assets/Scripts/Unit/Controller/UnitController.cs
@@ -2,14 +2,14 @@
using System.Collections.Generic;
using UnityEngine;
-public interface Interactable
-{
- void OnHit();
- void OnHurt();
- void OnGrab();
-}
-
-public class UnitController : MonoBehaviour, Interactable
+//public interface Interactable
+//{
+// void OnHit();
+// void OnHurt();
+// void OnGrab();
+//}
+
+public class UnitController : MonoBehaviour/*, Interactable*/
{
// 角色共有的组件
@@ -94,18 +94,19 @@ public class UnitController : MonoBehaviour, Interactable
unitRootMotion.OnUpdate();
}
- public void OnHit()
+ public virtual void OnDestroy()
+ {
+ }
+
+ public virtual void OnHit()
{
- throw new System.NotImplementedException();
}
- public void OnHurt()
+ public virtual void OnHurt()
{
- throw new System.NotImplementedException();
}
- public void OnGrab()
+ public virtual void OnGrab()
{
- throw new System.NotImplementedException();
}
}