diff options
Diffstat (limited to 'Assets/Scripts/Physics')
-rw-r--r-- | Assets/Scripts/Physics/PhysicsBody.cs | 18 | ||||
-rw-r--r-- | Assets/Scripts/Physics/PhysicsPrimitive.cs | 214 | ||||
-rw-r--r-- | Assets/Scripts/Physics/PhysicsWorld.cs | 17 |
3 files changed, 153 insertions, 96 deletions
diff --git a/Assets/Scripts/Physics/PhysicsBody.cs b/Assets/Scripts/Physics/PhysicsBody.cs index 84a5fcb0..8fc33fa7 100644 --- a/Assets/Scripts/Physics/PhysicsBody.cs +++ b/Assets/Scripts/Physics/PhysicsBody.cs @@ -45,6 +45,7 @@ public sealed class PhysicsBody : MonoBehaviour }
}
+ [Tooltip("ignore gravity?")]
[SerializeField]
private bool m_UseGravity;
public bool UseGravity
@@ -69,11 +70,26 @@ public sealed class PhysicsBody : MonoBehaviour }
}
- [Tooltip("摩擦力")]
+ [Tooltip("摩擦系数")]
[SerializeField]
private float m_Frication;
+ [Tooltip("力")]
+ [SerializeField]
+ private Vector3 m_Force;
+
[SerializeField]
private PhysicsPrimitive m_Primitive;
+
+ public void AddForce(Vector3 force)
+ {
+ m_Force += force;
+ }
+
+ public void SetForce(Vector3 force)
+ {
+ m_Force = force;
+ }
+
}
diff --git a/Assets/Scripts/Physics/PhysicsPrimitive.cs b/Assets/Scripts/Physics/PhysicsPrimitive.cs index f52fb9e9..491a6204 100644 --- a/Assets/Scripts/Physics/PhysicsPrimitive.cs +++ b/Assets/Scripts/Physics/PhysicsPrimitive.cs @@ -15,76 +15,76 @@ public enum PrimitiveType /// </summary>
public abstract class PhysicsPrimitive : MonoBehaviour
{
- public virtual PrimitiveType Type
- {
- get
- {
- return PrimitiveType.None;
- }
- }
-
- /// <summary>
- /// 世界坐标,物理模拟是在世界空间,本地坐标没有意义
- /// </summary>
- public Vector3 Position
- {
- get
- {
+ public virtual PrimitiveType Type
+ {
+ get
+ {
+ return PrimitiveType.None;
+ }
+ }
+
+ /// <summary>
+ /// 世界坐标,物理模拟是在世界空间,本地坐标没有意义
+ /// </summary>
+ public Vector3 Position
+ {
+ get
+ {
Vector3 euler = Quaternion.ToEulerAngles(transform.rotation);
euler.y = Mathf.Rad2Deg * euler.y;
Vector3 res = m_Center;
res.x = (euler.y > 90 && euler.y <= 180) ? -res.x : res.x;
res = transform.position + res;
- return res;
- }
- }
-
- [SerializeField]
- /// <summary>
- /// 这个primitive是否参与物理计算,用来快速给物体取消和恢复重力影响
- /// </summary>
- protected bool m_IsActive;
- public bool IsActive
- {
- get
- {
- return m_IsActive;
- }
- }
-
- /// <summary>
- /// 唯一ID
- /// </summary>
- protected int m_ID;
- public int ID
- {
- get
- {
- return m_ID;
- }
- }
+ return res;
+ }
+ }
+
+ [SerializeField]
+ /// <summary>
+ /// 这个primitive是否参与物理计算,用来快速给物体取消和恢复重力影响
+ /// </summary>
+ protected bool m_IsActive;
+ public bool IsActive
+ {
+ get
+ {
+ return m_IsActive;
+ }
+ }
+
+ /// <summary>
+ /// 唯一ID
+ /// </summary>
+ protected int m_ID;
+ public int ID
+ {
+ get
+ {
+ return m_ID;
+ }
+ }
[Tooltip("给primitive分组,决定大组和大组之间是否有碰撞检测")]
- [SerializeField]
- protected PhysicsGroup m_Group;
- public PhysicsGroup Group
- {
- get
- {
- return m_Group;
- }
- }
+ [SerializeField]
+ protected PhysicsGroup m_Group;
+ public PhysicsGroup Group
+ {
+ get
+ {
+ return m_Group;
+ }
+ }
[Tooltip("给primitive一个标记,表明它的从属关系。帮助做hitbox和hurtbox")]
- [SerializeField]
- protected PhysicsTag m_Tag;
- public PhysicsTag Tag
- {
- get
- {
- return m_Tag;
- }
- }
+ [SerializeField]
+ protected PhysicsTag m_Tag;
+ public PhysicsTag Tag
+ {
+ get
+ {
+ return m_Tag;
+ }
+ }
[Tooltip("同一个标签的没有碰撞检测")]
[SerializeField]
@@ -99,42 +99,42 @@ public abstract class PhysicsPrimitive : MonoBehaviour [Tooltip("单个碰撞体的描述(名称),作为标识用来识别")]
[SerializeField]
- protected string m_Title;
- public string Title
- {
- get
- {
- return m_Title;
- }
- }
-
- [SerializeField]
- protected string m_Desc;
- public string Desc
- {
- get
- {
- return m_Desc;
- }
- }
-
- /// <summary>
- /// 初始化,设置一些公共数据
- /// </summary>
- protected void OnInit()
- {
- m_ID = UIDManager.Acquire();
+ protected string m_Title;
+ public string Title
+ {
+ get
+ {
+ return m_Title;
+ }
+ }
+
+ [SerializeField]
+ protected string m_Desc;
+ public string Desc
+ {
+ get
+ {
+ return m_Desc;
+ }
+ }
+
+ /// <summary>
+ /// 初始化,设置一些公共数据
+ /// </summary>
+ protected void OnInit()
+ {
+ m_ID = UIDManager.Acquire();
PhysicsWorld.Instance.AddPrimitive(this);
- }
+ }
- protected Color Color_Green = new Color(0,1, 0, 0.5f);
+ protected Color Color_Green = new Color(0, 1, 0, 0.5f);
- [SerializeField]
- protected Color m_HintColor = new Color(0, 0, 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;
+ [Tooltip("Physics body, leave blank and primitive will be static.")]
+ [SerializeField]
+ protected PhysicsBody m_Body;
public PhysicsBody Body
{
@@ -149,4 +149,32 @@ public abstract class PhysicsPrimitive : MonoBehaviour /// </summary>
public Vector3 m_Center;
+ /// <summary>
+ /// 边界:左、右、上、下
+ /// </summary>
+ public Vector4 Bound
+ {
+ get
+ {
+ Vector4 bound = new Vector4();
+ if(this is PhysicsBox)
+ {
+ PhysicsBox box = this as PhysicsBox;
+ bound.x = box.Left;
+ bound.y = box.Right;
+ bound.z = box.Top;
+ bound.w = box.Bottom;
+ }
+ else if(this is PhysicsBall)
+ {
+ PhysicsBall ball = this as PhysicsBall;
+ bound.x = ball.Position.x - ball.Radius;
+ bound.y = ball.Position.x + ball.Radius;
+ bound.z = ball.Position.y + ball.Radius;
+ bound.w = ball.Position.y - ball.Radius;
+ }
+ return bound;
+ }
+ }
+
}
\ No newline at end of file diff --git a/Assets/Scripts/Physics/PhysicsWorld.cs b/Assets/Scripts/Physics/PhysicsWorld.cs index 7994e14b..8d95dff7 100644 --- a/Assets/Scripts/Physics/PhysicsWorld.cs +++ b/Assets/Scripts/Physics/PhysicsWorld.cs @@ -32,7 +32,7 @@ public class PhysicsWorld : Singleton<PhysicsWorld> {
private int m_UpdateRate = 60;
// 重力加速度
- private readonly Vector3 m_Gravity = new Vector3(0, -12f, 0);
+ private readonly Vector3 m_Gravity = new Vector3(0, -20f, 0);
// 当前管理的碰撞体
private List<PhysicsPrimitive> m_Primitives = new List<PhysicsPrimitive>();
private float m_TimeCount;
@@ -40,7 +40,7 @@ public class PhysicsWorld : Singleton<PhysicsWorld> private const int _ = 0;
private readonly int[] m_CollisionTable = {
// hurtbox hitBox wall ground prop character
-/*character*/ 0, 0, 1, 1, 1, 1,
+/*character*/ 0, 0, 1, 1, 1, 0,
/*prop */ 0, 0, 1, 1, 0, _,
/*ground */ 0, 0, 0, 0, _, _,
/*wall */ 0, 0, 0, _, _, _,
@@ -54,6 +54,8 @@ public class PhysicsWorld : Singleton<PhysicsWorld> private List<PhysicsCollisionInfo> m_CollisionInfo = new List<PhysicsCollisionInfo>();
+ public const float Ground = 0.1f;
+
public void Init()
{
m_TimeCount = Time.time;
@@ -218,10 +220,21 @@ public class PhysicsWorld : Singleton<PhysicsWorld> position += velocity * dt;
body.transform.position = position;
+
+ PhysicsBox box = prim as PhysicsBox;
+ if(box.Bottom < 0.1f)
+ {
+ position.y = 0.1f;
+ body.transform.position = position;
+ velocity.y = 0;
+ body.Velocity = velocity;
+ }
}
void SolveCollision(PhysicsPrimitive prim, PhysicsCollisionInfo collision, float dt)
{
+ return;
+
PhysicsBody body = prim.Body;
if (body == null)
return;
|