summaryrefslogtreecommitdiff
path: root/Assets/Scripts/Physics/PhysicsWorld.cs
diff options
context:
space:
mode:
Diffstat (limited to 'Assets/Scripts/Physics/PhysicsWorld.cs')
-rw-r--r--Assets/Scripts/Physics/PhysicsWorld.cs50
1 files changed, 43 insertions, 7 deletions
diff --git a/Assets/Scripts/Physics/PhysicsWorld.cs b/Assets/Scripts/Physics/PhysicsWorld.cs
index 41ea59f8..ba9b1bc1 100644
--- a/Assets/Scripts/Physics/PhysicsWorld.cs
+++ b/Assets/Scripts/Physics/PhysicsWorld.cs
@@ -43,7 +43,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, 0,
+/*character*/ 0, 0, 1, 1, 1, 1,
/*prop */ 0, 0, 1, 1, 0, _,
/*ground */ 0, 0, 0, 0, _, _,
/*wall */ 0, 0, 0, _, _, _,
@@ -59,6 +59,15 @@ public class PhysicsWorld : Singleton<PhysicsWorld>
public const float Ground = 0.1f;
+ // 所有碰撞
+ public List<PhysicsCollisionInfo> Collisions
+ {
+ get
+ {
+ return m_CollisionInfo;
+ }
+ }
+
public void Init()
{
m_TimeCount = Time.time;
@@ -184,13 +193,13 @@ public class PhysicsWorld : Singleton<PhysicsWorld>
{
PhysicsPrimitive prim2 = m_Primitives[j];
- // check collision by group
+ // group
int minGroup = Mathf.Min((int)prim1.Group, (int)prim2.Group);
int maxGroup = Mathf.Max((int)prim1.Group, (int)prim2.Group);
if (m_CollisionTable[minGroup * groupCount + groupCount - maxGroup - 1] == 0)
continue;
- // check collision by label
+ // label
if (prim1.Label == prim2.Label)
continue;
@@ -220,11 +229,17 @@ public class PhysicsWorld : Singleton<PhysicsWorld>
velocity += m_Gravity * dt;
body.Velocity = velocity;
- position += velocity * dt;
+ // impluse = d(mv) = m*dv
+ Vector3 impluse = body.Force * dt;
+ Vector3 deltaV = impluse / body.Weight;
+ velocity += deltaV;
+ body.Velocity = velocity;
- body.transform.position = position;
+ position += velocity * dt;
+
+ body.transform.position = position;
- if(prim.IsOnGround)
+ if (prim.IsOnGround)
{
// pos=0, Vy=0
position.y = 0.1f;
@@ -241,11 +256,32 @@ public class PhysicsWorld : Singleton<PhysicsWorld>
velocity.y = 0;
body.Velocity = velocity;
}
+ else if(prim.IsInAir) // 空气摩擦力
+ {
+ if(body.Velocity.x != 0 && body.AirFriction != 0)
+ {
+ float dv = body.AirFriction * dt;
+ dv = Mathf.Min(dv, Mathf.Abs(body.Velocity.x));
+ dv = body.Velocity.x > 0 ? -dv : dv;
+ velocity.x += dv;
+ body.Velocity = velocity;
+ }
+ }
+
+ body.SetForce(Vector3.zero);
}
void SolveCollision(PhysicsPrimitive prim, PhysicsCollisionInfo collision, float dt)
{
- return;
+ PhysicsPrimitive other = collision.prim1 == prim ? collision.prim2 : collision.prim1;
+ if(prim.Body != null && other.Body != null)
+ {
+ Vector3 pos = prim.Body.transform.position;
+ pos.x += pos.x > collision.contact.x ? collision.size.x / 2f : - collision.size.x / 2f;
+ prim.Body.transform.position = pos;
+ }
+
+ return;
PhysicsBody body = prim.Body;
if (body == null)