From 68f3823ddb10110c2abafb5f1aab2f3e6f3fa360 Mon Sep 17 00:00:00 2001 From: chai Date: Fri, 16 Oct 2020 08:09:25 +0800 Subject: * ability system * physics system --- Assets/Scripts/Physics/DefendBox.cs | 18 --------- Assets/Scripts/Physics/DefendBox.cs.meta | 11 ------ Assets/Scripts/Physics/HitBox.cs | 8 ---- Assets/Scripts/Physics/HitBox.cs.meta | 11 ------ Assets/Scripts/Physics/HurtBox.cs | 18 --------- Assets/Scripts/Physics/HurtBox.cs.meta | 11 ------ Assets/Scripts/Physics/PhysicsBox.cs | 4 +- Assets/Scripts/Physics/PhysicsHelper.cs | 46 +++++++++++++++++++++- Assets/Scripts/Physics/PhysicsPrimitive.cs | 16 +++++++- Assets/Scripts/Physics/PhysicsWorld.cs | 62 +++++++++++++++++++++++------- 10 files changed, 111 insertions(+), 94 deletions(-) delete mode 100644 Assets/Scripts/Physics/DefendBox.cs delete mode 100644 Assets/Scripts/Physics/DefendBox.cs.meta delete mode 100644 Assets/Scripts/Physics/HitBox.cs delete mode 100644 Assets/Scripts/Physics/HitBox.cs.meta delete mode 100644 Assets/Scripts/Physics/HurtBox.cs delete mode 100644 Assets/Scripts/Physics/HurtBox.cs.meta (limited to 'Assets/Scripts/Physics') 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 +} + + /// /// 碰撞的信息 /// 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,16 +1,7 @@ -using System.Collections; + using System.Collections; using System.Collections.Generic; using UnityEngine; -/// -/// primitive标记 -/// -public enum PhysicsTag -{ - Player = 1, // 从属于玩家 - Oponent = 1 << 1, // 从属于对手 -} - /// /// primitive分类 /// @@ -20,17 +11,36 @@ public enum PhysicsGroup Prop, // 物体 Ground, // 地面 Wall, // 墙面 + + GroupCount, +} + +/// +/// primitive标记 +/// +public enum PhysicsTag +{ + Player = 1, // 从属于玩家 + Oponent = 1 << 1, // 从属于对手 } public class PhysicsWorld : Singleton { - private int m_UpdateRate = 30; + private int m_UpdateRate = 60; // 重力加速度 private readonly Vector3 m_Gravity = new Vector3(0, -9.8f, 0); // 当前管理的碰撞体 private List 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(); @@ -74,9 +84,33 @@ public class PhysicsWorld : Singleton 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 -- cgit v1.1-26-g67d0