From 3708d0a07ce43c3d98a0171eacfa9c370c873f96 Mon Sep 17 00:00:00 2001 From: chai Date: Mon, 2 Nov 2020 19:53:12 +0800 Subject: =?UTF-8?q?*=E5=8F=97=E5=87=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Assets/Scripts/Physics/PhysicsWorld.cs | 50 +++++++++++++++++++++++++++++----- 1 file changed, 43 insertions(+), 7 deletions(-) (limited to 'Assets/Scripts/Physics/PhysicsWorld.cs') 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 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 public const float Ground = 0.1f; + // 所有碰撞 + public List Collisions + { + get + { + return m_CollisionInfo; + } + } + public void Init() { m_TimeCount = Time.time; @@ -184,13 +193,13 @@ public class PhysicsWorld : Singleton { 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 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 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) -- cgit v1.1-26-g67d0