From f049177e20a276049c61edbad631c1b2bbdd5706 Mon Sep 17 00:00:00 2001 From: chai Date: Thu, 15 Oct 2020 19:05:22 +0800 Subject: -advanced inspector +odin --- Assets/Scripts/Physics/PhysicsBall.cs | 23 ++++++++++- Assets/Scripts/Physics/PhysicsBody.cs | 13 ++++++ Assets/Scripts/Physics/PhysicsBox.cs | 29 ++++++++----- Assets/Scripts/Physics/PhysicsHelper.cs | 19 +++++---- Assets/Scripts/Physics/PhysicsPrimitive.cs | 46 +++++++++++++++------ Assets/Scripts/Physics/PhysicsWorld.cs | 65 ++++++++++++++++++++++++++---- 6 files changed, 156 insertions(+), 39 deletions(-) (limited to 'Assets/Scripts/Physics') diff --git a/Assets/Scripts/Physics/PhysicsBall.cs b/Assets/Scripts/Physics/PhysicsBall.cs index 2a076718..5baceeb8 100644 --- a/Assets/Scripts/Physics/PhysicsBall.cs +++ b/Assets/Scripts/Physics/PhysicsBall.cs @@ -2,10 +2,29 @@ using System.Collections.Generic; using UnityEngine; +/// +/// 碰撞球 +/// public class PhysicsBall : PhysicsPrimitive { - public Vector3 m_Center; - public float m_Radius; + public override PrimitiveType Type + { + get + { + return PrimitiveType.Ball; + } + } + + [SerializeField] + private float m_Radius; + + public float Radius + { + get + { + return m_Radius; + } + } public void OnDrawGizmos() { diff --git a/Assets/Scripts/Physics/PhysicsBody.cs b/Assets/Scripts/Physics/PhysicsBody.cs index e78e6f68..a4ef3aa5 100644 --- a/Assets/Scripts/Physics/PhysicsBody.cs +++ b/Assets/Scripts/Physics/PhysicsBody.cs @@ -2,6 +2,19 @@ using System.Collections.Generic; using UnityEngine; +// 需要受物理系统托管的动作: +// 跳跃上升 +// 跳跃下降 +// 空中受击 +// +// +// 不会受物理系统托管的动作: +// 单个招式 +// 空中连击 +// +// +// 一般来说启用物理是被动的 + /// /// 刚体 /// diff --git a/Assets/Scripts/Physics/PhysicsBox.cs b/Assets/Scripts/Physics/PhysicsBox.cs index b273cb3d..657aea71 100644 --- a/Assets/Scripts/Physics/PhysicsBox.cs +++ b/Assets/Scripts/Physics/PhysicsBox.cs @@ -2,17 +2,28 @@ using System.Collections.Generic; using UnityEngine; +/// +/// AABB碰撞盒 +/// public class PhysicsBox : PhysicsPrimitive { - /// - /// 中心点 - /// - public Vector3 m_Center; + public override PrimitiveType Type + { + get + { + return PrimitiveType.Box; + } + } - /// - /// 长宽高 - /// - public Vector3 m_Size; + [SerializeField] + private Vector3 m_Size; + public Vector3 Size + { + get + { + return m_Size; + } + } public float Long { get { return m_Size.x; } } public float Wide { get { return m_Size.y; } } @@ -22,7 +33,7 @@ public class PhysicsBox : PhysicsPrimitive { if (!m_IsActive) return; - Vector3 pos = m_Center + transform.position; + Vector3 pos = Position; Gizmos.color = m_HintColor; Gizmos.DrawCube(pos, m_Size); } diff --git a/Assets/Scripts/Physics/PhysicsHelper.cs b/Assets/Scripts/Physics/PhysicsHelper.cs index 27d04051..94916bfc 100644 --- a/Assets/Scripts/Physics/PhysicsHelper.cs +++ b/Assets/Scripts/Physics/PhysicsHelper.cs @@ -13,42 +13,45 @@ public class PhysicsCollisionInfo public sealed class PhysicsHelper { - public static bool BallvsBall(PhysicsBall ball1, PhysicsBall ball2, out PhysicsCollisionInfo info) +#region 简略版的2D检测,忽略z轴,对于格斗游戏来说使用2D物理 + + public static bool BallvsBall2D(PhysicsBall ball1, PhysicsBall ball2, out PhysicsCollisionInfo info) { info = null; + return true; } - public static bool BoxvsBox(PhysicsBox box1, PhysicsBox box2, out PhysicsCollisionInfo info) + public static bool BoxvsBox2D(PhysicsBox box1, PhysicsBox box2, out PhysicsCollisionInfo info) { info = null; return true; } - public static bool BallvsBox(PhysicsBall ball, PhysicsBox box, out PhysicsCollisionInfo info) + public static bool BallvsBox2D(PhysicsBall ball, PhysicsBox box, out PhysicsCollisionInfo info) { info = null; return true; } - #region 简略版的2D检测,忽略z轴 +#endregion - public static bool BallvsBall2D(PhysicsBall ball1, PhysicsBall ball2, out PhysicsCollisionInfo info) + public static bool BallvsBall(PhysicsBall ball1, PhysicsBall ball2, out PhysicsCollisionInfo info) { info = null; return true; } - public static bool BoxvsBox2D(PhysicsBox box1, PhysicsBox box2, out PhysicsCollisionInfo info) + public static bool BoxvsBox(PhysicsBox box1, PhysicsBox box2, out PhysicsCollisionInfo info) { info = null; return true; } - public static bool BallvsBox2D(PhysicsBall ball, PhysicsBox box, out PhysicsCollisionInfo info) + public static bool BallvsBox(PhysicsBall ball, PhysicsBox box, out PhysicsCollisionInfo info) { info = null; return true; } - #endregion + } diff --git a/Assets/Scripts/Physics/PhysicsPrimitive.cs b/Assets/Scripts/Physics/PhysicsPrimitive.cs index 0d285fd3..99549db3 100644 --- a/Assets/Scripts/Physics/PhysicsPrimitive.cs +++ b/Assets/Scripts/Physics/PhysicsPrimitive.cs @@ -2,34 +2,53 @@ using System.Collections.Generic; using UnityEngine; +public enum PrimitiveType +{ + None, + Ball, + Box +} + /// /// 物理碰撞体基类 -/// 只需要Box和Ball两种 +/// 对于格斗游戏来说只需要Box和Ball两种 /// public abstract class PhysicsPrimitive : MonoBehaviour { - [SerializeField] + public virtual PrimitiveType Type + { + get + { + return PrimitiveType.None; + } + } + /// - /// 这个primitive是否参与物理计算,用来快速给物体取消和恢复重力影响 + /// 世界坐标,物理模拟是在世界空间,本地坐标没有意义 /// - protected bool m_IsActive; - public bool IsActive + public Vector3 Position { get { - return m_IsActive; + return transform.TransformPoint(m_Center); } } /// - /// 这个primitive所属的物体 + /// 中心点在本地空间的位置 /// - protected Transform m_Parent; - public Transform Parent + public Vector3 m_Center; + + [SerializeField] + /// + /// 这个primitive是否参与物理计算,用来快速给物体取消和恢复重力影响 + /// + protected bool m_IsActive; + public bool IsActive { get { - return m_Parent; + return m_IsActive; } } @@ -65,7 +84,6 @@ public abstract class PhysicsPrimitive : MonoBehaviour } } - [SerializeField] protected string m_Title; public string Title @@ -92,11 +110,15 @@ public abstract class PhysicsPrimitive : MonoBehaviour protected void OnInit() { m_ID = UIDManager.Acquire(); - m_Parent = transform; } protected Color Color_Green = new Color(0,1, 0, 0.5f); [SerializeField] protected Color m_HintColor = new Color(0, 0, 0, 0.5f); + + [Tooltip("Physics body, leave blank and primitive will be static.")] + [SerializeField] + protected PhysicsBody m_Body; + } \ No newline at end of file diff --git a/Assets/Scripts/Physics/PhysicsWorld.cs b/Assets/Scripts/Physics/PhysicsWorld.cs index 653bad0d..5ef747b2 100644 --- a/Assets/Scripts/Physics/PhysicsWorld.cs +++ b/Assets/Scripts/Physics/PhysicsWorld.cs @@ -3,30 +3,79 @@ using System.Collections.Generic; using UnityEngine; /// -/// 标记 +/// primitive标记 /// public enum PhysicsTag { - Player, - Oponent, + Player = 1, // 从属于玩家 + Oponent = 1 << 1, // 从属于对手 } /// -/// 分类 +/// primitive分类 /// public enum PhysicsGroup { - Character, - Environment, - Props, + Character, // 角色 + Prop, // 物体 + Ground, // 地面 + Wall, // 墙面 } public class PhysicsWorld : Singleton { - private int m_UpdateRate = 60; + private int m_UpdateRate = 30; + // 重力加速度 + private readonly Vector3 m_Gravity = new Vector3(0, -9.8f, 0); + // 当前管理的碰撞体 + private List m_Primitives; + private float m_TimeCount; + public void Init() + { + m_Primitives = new List(); + m_TimeCount = Time.time; + } + + public void AddPrimitive(PhysicsPrimitive prim) + { + if (prim == null) + return; + if(m_Primitives.Contains(prim)) + { + Debug.LogError("PhysicsWorld已经存在此碰撞体,ID=" + prim.ID + ", 类型=" + prim.Tag); + return; + } + m_Primitives.Add(prim); + } + + public void RemovePrimitive(PhysicsPrimitive prim) + { + if (prim == null) + return; + m_Primitives.Remove(prim); + } + + /// + /// 物理系统已稳定的逻辑帧率执行 + /// public void Update() { + float preTime = m_TimeCount; + m_TimeCount = Time.time; + float dt = m_TimeCount - preTime; + while (dt > 1f / m_UpdateRate) + { + Tick(); + dt -= 1f / m_UpdateRate; + } + m_TimeCount -= dt; + } + + private void Tick() + { + float deltaTime = 1f / m_UpdateRate; + //Debug.Log("Physics Tick"); } -- cgit v1.1-26-g67d0