diff options
Diffstat (limited to 'Assets/Scripts')
-rw-r--r-- | Assets/Scripts/ApplicationMain.cs | 7 | ||||
-rw-r--r-- | Assets/Scripts/Physics/PhysicsBall.cs | 23 | ||||
-rw-r--r-- | Assets/Scripts/Physics/PhysicsBody.cs | 13 | ||||
-rw-r--r-- | Assets/Scripts/Physics/PhysicsBox.cs | 29 | ||||
-rw-r--r-- | Assets/Scripts/Physics/PhysicsHelper.cs | 19 | ||||
-rw-r--r-- | Assets/Scripts/Physics/PhysicsPrimitive.cs | 46 | ||||
-rw-r--r-- | Assets/Scripts/Physics/PhysicsWorld.cs | 65 | ||||
-rw-r--r-- | Assets/Scripts/Test/SaionjiScript.cs | 23 |
8 files changed, 185 insertions, 40 deletions
diff --git a/Assets/Scripts/ApplicationMain.cs b/Assets/Scripts/ApplicationMain.cs index fa4c2357..04648edf 100644 --- a/Assets/Scripts/ApplicationMain.cs +++ b/Assets/Scripts/ApplicationMain.cs @@ -8,7 +8,7 @@ public class ApplicationMain : MonoBehaviour void Start() { InputManager.Instance.Init(); - + PhysicsWorld.Instance.Init(); } // Update is called once per frame @@ -16,4 +16,9 @@ public class ApplicationMain : MonoBehaviour { InputManager.Instance.Update(); } + + private void LateUpdate()
+ {
+ PhysicsWorld.Instance.Update();
+ } } 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;
+/// <summary>
+/// 碰撞球
+/// </summary>
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;
+// 需要受物理系统托管的动作:
+// 跳跃上升
+// 跳跃下降
+// 空中受击
+//
+//
+// 不会受物理系统托管的动作:
+// 单个招式
+// 空中连击
+//
+//
+// 一般来说启用物理是被动的
+
/// <summary>
/// 刚体
/// </summary>
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;
+/// <summary>
+/// AABB碰撞盒
+/// </summary>
public class PhysicsBox : PhysicsPrimitive
{
- /// <summary>
- /// 中心点
- /// </summary>
- public Vector3 m_Center;
+ public override PrimitiveType Type
+ {
+ get
+ {
+ return PrimitiveType.Box;
+ }
+ }
- /// <summary>
- /// 长宽高
- /// </summary>
- 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
+}
+
/// <summary>
/// 物理碰撞体基类
-/// 只需要Box和Ball两种
+/// 对于格斗游戏来说只需要Box和Ball两种
/// </summary>
public abstract class PhysicsPrimitive : MonoBehaviour
{
- [SerializeField]
+ public virtual PrimitiveType Type
+ {
+ get
+ {
+ return PrimitiveType.None;
+ }
+ }
+
/// <summary>
- /// 这个primitive是否参与物理计算,用来快速给物体取消和恢复重力影响
+ /// 世界坐标,物理模拟是在世界空间,本地坐标没有意义
/// </summary>
- protected bool m_IsActive;
- public bool IsActive
+ public Vector3 Position
{
get
{
- return m_IsActive;
+ return transform.TransformPoint(m_Center);
}
}
/// <summary>
- /// 这个primitive所属的物体
+ /// 中心点在本地空间的位置
/// </summary>
- protected Transform m_Parent;
- public Transform Parent
+ public Vector3 m_Center;
+
+ [SerializeField]
+ /// <summary>
+ /// 这个primitive是否参与物理计算,用来快速给物体取消和恢复重力影响
+ /// </summary>
+ 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;
/// <summary>
-/// 标记
+/// primitive标记
/// </summary>
public enum PhysicsTag
{
- Player,
- Oponent,
+ Player = 1, // 从属于玩家
+ Oponent = 1 << 1, // 从属于对手
}
/// <summary>
-/// 分类
+/// primitive分类
/// </summary>
public enum PhysicsGroup
{
- Character,
- Environment,
- Props,
+ Character, // 角色
+ Prop, // 物体
+ Ground, // 地面
+ Wall, // 墙面
}
public class PhysicsWorld : Singleton<PhysicsWorld>
{
- private int m_UpdateRate = 60;
+ private int m_UpdateRate = 30;
+ // 重力加速度
+ private readonly Vector3 m_Gravity = new Vector3(0, -9.8f, 0);
+ // 当前管理的碰撞体
+ private List<PhysicsPrimitive> m_Primitives;
+ private float m_TimeCount;
+ public void Init()
+ {
+ m_Primitives = new List<PhysicsPrimitive>();
+ 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);
+ }
+
+ /// <summary>
+ /// 物理系统已稳定的逻辑帧率执行
+ /// </summary>
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");
}
diff --git a/Assets/Scripts/Test/SaionjiScript.cs b/Assets/Scripts/Test/SaionjiScript.cs index c252645b..a3216dd5 100644 --- a/Assets/Scripts/Test/SaionjiScript.cs +++ b/Assets/Scripts/Test/SaionjiScript.cs @@ -37,4 +37,27 @@ public partial class SaionjiScript : MonoBehaviour //}
}
+ // 更新顺序:
+ // internal animator update -> OnAnimatorMove() -> physics
+ // 角色最后的位置以物理系统为准(如果加入物理系统的话)
+ // 如果后续有物理处理,会重写transform
+ // 对于后续不受物理管理的动作,不需要修改transform
+ void OnAnimatorMove()
+ {
+ Animator animator = GetComponent<Animator>();
+
+ // animator.deltaPosition和animator.deltaRotation是animator做的root motion后的结果
+ // 在后面做一个硬性约束z=0,将角色限制在z=0平面上
+ if (animator)
+ {
+ Vector3 position = transform.position;
+ position.x += animator.deltaPosition.x;
+ position.y += animator.deltaPosition.y;
+ transform.position = position;
+
+ // animation clip导入设置旋转一般上设置为baked inpose,不需要手动限制
+ transform.rotation *= animator.deltaRotation;
+ }
+ }
+
}
|