using System.Collections; using System.Collections.Generic; using UnityEngine; /// /// primitive标记 /// public enum PhysicsTag { Player = 1, // 从属于玩家 Oponent = 1 << 1, // 从属于对手 } /// /// primitive分类 /// public enum PhysicsGroup { Character, // 角色 Prop, // 物体 Ground, // 地面 Wall, // 墙面 } public class PhysicsWorld : Singleton { 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"); } }