summaryrefslogtreecommitdiff
path: root/Assets/Scripts/Physics
diff options
context:
space:
mode:
Diffstat (limited to 'Assets/Scripts/Physics')
-rw-r--r--Assets/Scripts/Physics/DefendBox.cs18
-rw-r--r--Assets/Scripts/Physics/DefendBox.cs.meta11
-rw-r--r--Assets/Scripts/Physics/HitBox.cs8
-rw-r--r--Assets/Scripts/Physics/HitBox.cs.meta11
-rw-r--r--Assets/Scripts/Physics/HurtBox.cs18
-rw-r--r--Assets/Scripts/Physics/HurtBox.cs.meta11
-rw-r--r--Assets/Scripts/Physics/PhysicsBox.cs4
-rw-r--r--Assets/Scripts/Physics/PhysicsHelper.cs46
-rw-r--r--Assets/Scripts/Physics/PhysicsPrimitive.cs16
-rw-r--r--Assets/Scripts/Physics/PhysicsWorld.cs62
10 files changed, 111 insertions, 94 deletions
diff --git a/Assets/Scripts/Physics/DefendBox.cs b/Assets/Scripts/Physics/DefendBox.cs
deleted file mode 100644
index 730fe640..00000000
--- a/Assets/Scripts/Physics/DefendBox.cs
+++ /dev/null
@@ -1,18 +0,0 @@
-using System.Collections;
-using System.Collections.Generic;
-using UnityEngine;
-
-public class DefendBox : MonoBehaviour
-{
- // Start is called before the first frame update
- void Start()
- {
-
- }
-
- // Update is called once per frame
- void Update()
- {
-
- }
-}
diff --git a/Assets/Scripts/Physics/DefendBox.cs.meta b/Assets/Scripts/Physics/DefendBox.cs.meta
deleted file mode 100644
index bc2f10ad..00000000
--- a/Assets/Scripts/Physics/DefendBox.cs.meta
+++ /dev/null
@@ -1,11 +0,0 @@
-fileFormatVersion: 2
-guid: cb44b541bd6b6f747bb9079c7249d23f
-MonoImporter:
- externalObjects: {}
- serializedVersion: 2
- defaultReferences: []
- executionOrder: 0
- icon: {instanceID: 0}
- userData:
- assetBundleName:
- assetBundleVariant:
diff --git a/Assets/Scripts/Physics/HitBox.cs b/Assets/Scripts/Physics/HitBox.cs
deleted file mode 100644
index a6337abd..00000000
--- a/Assets/Scripts/Physics/HitBox.cs
+++ /dev/null
@@ -1,8 +0,0 @@
-using System.Collections;
-using System.Collections.Generic;
-using UnityEngine;
-
-public class HitBox : PhysicsBox
-{
-
-}
diff --git a/Assets/Scripts/Physics/HitBox.cs.meta b/Assets/Scripts/Physics/HitBox.cs.meta
deleted file mode 100644
index f220b38f..00000000
--- a/Assets/Scripts/Physics/HitBox.cs.meta
+++ /dev/null
@@ -1,11 +0,0 @@
-fileFormatVersion: 2
-guid: 73d73d5d2dc8d324b8b75ccd818af01d
-MonoImporter:
- externalObjects: {}
- serializedVersion: 2
- defaultReferences: []
- executionOrder: 0
- icon: {instanceID: 0}
- userData:
- assetBundleName:
- assetBundleVariant:
diff --git a/Assets/Scripts/Physics/HurtBox.cs b/Assets/Scripts/Physics/HurtBox.cs
deleted file mode 100644
index c7fd97bd..00000000
--- a/Assets/Scripts/Physics/HurtBox.cs
+++ /dev/null
@@ -1,18 +0,0 @@
-using System.Collections;
-using System.Collections.Generic;
-using UnityEngine;
-
-public class HurtBox : MonoBehaviour
-{
- // Start is called before the first frame update
- void Start()
- {
-
- }
-
- // Update is called once per frame
- void Update()
- {
-
- }
-}
diff --git a/Assets/Scripts/Physics/HurtBox.cs.meta b/Assets/Scripts/Physics/HurtBox.cs.meta
deleted file mode 100644
index c74284f1..00000000
--- a/Assets/Scripts/Physics/HurtBox.cs.meta
+++ /dev/null
@@ -1,11 +0,0 @@
-fileFormatVersion: 2
-guid: fdb3c8999ca3f954e81886171ce9517f
-MonoImporter:
- externalObjects: {}
- serializedVersion: 2
- defaultReferences: []
- executionOrder: 0
- icon: {instanceID: 0}
- userData:
- assetBundleName:
- assetBundleVariant:
diff --git a/Assets/Scripts/Physics/PhysicsBox.cs b/Assets/Scripts/Physics/PhysicsBox.cs
index 657aea71..8c93a1e1 100644
--- a/Assets/Scripts/Physics/PhysicsBox.cs
+++ b/Assets/Scripts/Physics/PhysicsBox.cs
@@ -29,9 +29,11 @@ public class PhysicsBox : PhysicsPrimitive
public float Wide { get { return m_Size.y; } }
public float Height { get { return m_Size.z; } }
+ public bool m_DrawGizmo = true;
+
public void OnDrawGizmos()
{
- if (!m_IsActive)
+ if (!m_IsActive || !m_DrawGizmo)
return;
Vector3 pos = Position;
Gizmos.color = m_HintColor;
diff --git a/Assets/Scripts/Physics/PhysicsHelper.cs b/Assets/Scripts/Physics/PhysicsHelper.cs
index 94916bfc..aa31108e 100644
--- a/Assets/Scripts/Physics/PhysicsHelper.cs
+++ b/Assets/Scripts/Physics/PhysicsHelper.cs
@@ -2,12 +2,23 @@
using System.Collections.Generic;
using UnityEngine;
+enum CollisionType
+{
+ BallvsBall = 1,
+ BallvsBox,
+ BoxvsBox
+}
+
+
/// <summary>
/// 碰撞的信息
/// </summary>
public class PhysicsCollisionInfo
{
-
+ CollisionType type;
+ PhysicsPrimitive prim1;
+ PhysicsPrimitive prim2;
+ Vector3 contacts;
}
public sealed class PhysicsHelper
@@ -34,6 +45,39 @@ public sealed class PhysicsHelper
return true;
}
+ public static bool BallvsRay(PhysicsBall ball, Vector3 ray)
+ {
+ return false;
+ }
+
+ public static bool BoxvsRay(PhysicsBox box, Vector3 ray)
+ {
+ return false;
+ }
+
+ public static bool RayvsRay(Vector3 ray1, Vector3 ray2)
+ {
+ return false;
+ }
+
+ public static bool PrimvsPrim(PhysicsPrimitive prim1, PhysicsPrimitive prim2, out PhysicsCollisionInfo info)
+ {
+ if(prim1.Type == PrimitiveType.Ball)
+ {
+ if (prim2.Type == PrimitiveType.Ball)
+ return BallvsBall2D(prim1 as PhysicsBall, prim2 as PhysicsBall, out info);
+ else
+ return BallvsBox2D(prim1 as PhysicsBall, prim2 as PhysicsBox, out info);
+ }
+ else
+ {
+ if (prim2.Type == PrimitiveType.Ball)
+ return BallvsBox2D(prim2 as PhysicsBall, prim1 as PhysicsBox, out info);
+ else
+ return BoxvsBox2D(prim1 as PhysicsBox, prim2 as PhysicsBox, out info);
+ }
+ }
+
#endregion
public static bool BallvsBall(PhysicsBall ball1, PhysicsBall ball2, out PhysicsCollisionInfo info)
diff --git a/Assets/Scripts/Physics/PhysicsPrimitive.cs b/Assets/Scripts/Physics/PhysicsPrimitive.cs
index 99549db3..59c56aaf 100644
--- a/Assets/Scripts/Physics/PhysicsPrimitive.cs
+++ b/Assets/Scripts/Physics/PhysicsPrimitive.cs
@@ -64,6 +64,7 @@ public abstract class PhysicsPrimitive : MonoBehaviour
}
}
+ [Tooltip("给primitive分组,决定大组和大组之间是否有碰撞检测")]
[SerializeField]
protected PhysicsGroup m_Group;
public PhysicsGroup Group
@@ -74,6 +75,7 @@ public abstract class PhysicsPrimitive : MonoBehaviour
}
}
+ [Tooltip("给primitive一个标记,表明它的从属关系。帮助做hitbox和hurtbox")]
[SerializeField]
protected PhysicsTag m_Tag;
public PhysicsTag Tag
@@ -84,7 +86,19 @@ public abstract class PhysicsPrimitive : MonoBehaviour
}
}
- [SerializeField]
+ [Tooltip("同一个标签的没有碰撞检测")]
+ [SerializeField]
+ protected string m_Label;
+ public string Label
+ {
+ get
+ {
+ return m_Label;
+ }
+ }
+
+ [Tooltip("单个碰撞体的描述(名称),作为标识用来识别")]
+ [SerializeField]
protected string m_Title;
public string Title
{
diff --git a/Assets/Scripts/Physics/PhysicsWorld.cs b/Assets/Scripts/Physics/PhysicsWorld.cs
index 5ef747b2..3514934c 100644
--- a/Assets/Scripts/Physics/PhysicsWorld.cs
+++ b/Assets/Scripts/Physics/PhysicsWorld.cs
@@ -1,17 +1,8 @@
-using System.Collections;
+ using System.Collections;
using System.Collections.Generic;
using UnityEngine;
/// <summary>
-/// primitive标记
-/// </summary>
-public enum PhysicsTag
-{
- Player = 1, // 从属于玩家
- Oponent = 1 << 1, // 从属于对手
-}
-
-/// <summary>
/// primitive分类
/// </summary>
public enum PhysicsGroup
@@ -20,17 +11,36 @@ public enum PhysicsGroup
Prop, // 物体
Ground, // 地面
Wall, // 墙面
+
+ GroupCount,
+}
+
+/// <summary>
+/// primitive标记
+/// </summary>
+public enum PhysicsTag
+{
+ Player = 1, // 从属于玩家
+ Oponent = 1 << 1, // 从属于对手
}
public class PhysicsWorld : Singleton<PhysicsWorld>
{
- private int m_UpdateRate = 30;
+ private int m_UpdateRate = 60;
// 重力加速度
private readonly Vector3 m_Gravity = new Vector3(0, -9.8f, 0);
// 当前管理的碰撞体
private List<PhysicsPrimitive> m_Primitives;
private float m_TimeCount;
+ private readonly int[] m_CollisionTable = {
+ // wall ground prop character
+/*character*/ 1, 1, 1, 1,
+/*prop */ 1, 1, 0, 0,
+/*ground */ 0, 0, 0, 0,
+/*wall */ 0, 0, 0, 0,
+ };
+
public void Init()
{
m_Primitives = new List<PhysicsPrimitive>();
@@ -74,9 +84,33 @@ public class PhysicsWorld : Singleton<PhysicsWorld>
private void Tick()
{
- float deltaTime = 1f / m_UpdateRate;
- //Debug.Log("Physics Tick");
+ float deltaTime = 1f / m_UpdateRate;
+ int groupCount = (int)PhysicsGroup.GroupCount;
+ for (int i = 0; i < m_Primitives.Count; ++i)
+ {
+ PhysicsPrimitive prim1 = m_Primitives[i];
+ for(int j = i + 1; j < m_Primitives.Count; ++j)
+ {
+ PhysicsPrimitive prim2 = m_Primitives[j];
+
+ // check collision by group
+ int minType = Mathf.Min((int)prim1.Type, (int)prim2.Type);
+ int maxType = Mathf.Max((int)prim1.Type, (int)prim2.Type);
+ if (m_CollisionTable[minType * groupCount + groupCount - maxType - 1] == 0)
+ continue;
+
+ // check collision by label
+ if (prim1.Label == prim2.Label)
+ continue;
+ PhysicsCollisionInfo info;
+ if(PhysicsHelper.PrimvsPrim(prim1, prim2, out info))
+ {
+ //没有physics body的primitive将不会被移动,只有那些绑定了physics body的会被施加物理效果,比如角色身体、物品
+
+ }
+ }
+ }
}
-}
+} \ No newline at end of file