diff options
author | chai <chaifix@163.com> | 2021-08-06 09:31:08 +0800 |
---|---|---|
committer | chai <chaifix@163.com> | 2021-08-06 09:31:08 +0800 |
commit | 35f2e468715e12d93cb88f2258c2d0ae82d1d189 (patch) | |
tree | 1edb1f0919cee10352e8e732654c959ff2e471dd /Assets/Scripts | |
parent | 128d70642ddb8fa7818a84d0d23ca24ed2f8802c (diff) |
*collision
Diffstat (limited to 'Assets/Scripts')
-rw-r--r-- | Assets/Scripts/Props.meta | 8 | ||||
-rw-r--r-- | Assets/Scripts/Scene.meta | 8 | ||||
-rw-r--r-- | Assets/Scripts/Unit/Collider/ColliderRegistry.cs | 20 | ||||
-rw-r--r-- | Assets/Scripts/Unit/Collider/ColliderRegistry.cs.meta | 11 | ||||
-rw-r--r-- | Assets/Scripts/Unit/Collider/CollisionSystem.cs | 108 | ||||
-rw-r--r-- | Assets/Scripts/Unit/Collider/CollisionSystem.cs.meta | 11 | ||||
-rw-r--r-- | Assets/Scripts/Unit/Component/UnitAnimation.cs | 1 | ||||
-rw-r--r-- | Assets/Scripts/Unit/Component/UnitCollider.cs | 36 | ||||
-rw-r--r-- | Assets/Scripts/Unit/Controller/UnitController.cs | 29 |
9 files changed, 184 insertions, 48 deletions
diff --git a/Assets/Scripts/Props.meta b/Assets/Scripts/Props.meta deleted file mode 100644 index bb96602e..00000000 --- a/Assets/Scripts/Props.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: f299520ed9fcf4a45858ad4ef5a8d5d1 -folderAsset: yes -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Scripts/Scene.meta b/Assets/Scripts/Scene.meta deleted file mode 100644 index eb7a8716..00000000 --- a/Assets/Scripts/Scene.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: eaee2d0f48cff9b40baf0686a8105600 -folderAsset: yes -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: 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();
}
}
|