diff --git a/Modified fragsurf/Movement/SurfController.cs b/Modified fragsurf/Movement/SurfController.cs index 70442d3..5dec423 100644 --- a/Modified fragsurf/Movement/SurfController.cs +++ b/Modified fragsurf/Movement/SurfController.cs @@ -74,9 +74,10 @@ namespace Fragsurf.Movement { speed = _surfer.moveData.velocity.magnitude; _surfer.moveData.velocity.y = yVel; - float maxDistPerFrame = 1f; + float maxDistPerFrame = 0.05f; Vector3 velocityThisFrame = _surfer.moveData.velocity * _deltaTime; - float velocityDistLeft = velocityThisFrame.magnitude; + float velocityDist = velocityThisFrame.magnitude; + float velocityDistLeft = velocityDist; float initialVel = velocityDistLeft; while (velocityDistLeft > 0f) { @@ -88,7 +89,7 @@ namespace Fragsurf.Movement { _surfer.moveData.origin += velThisLoop; // don't penetrate walls - SurfPhysics.ResolveCollisions (_surfer.collider, ref _surfer.moveData.origin, ref _surfer.moveData.velocity, _surfer.moveData.rigidbodyPushForce); + SurfPhysics.ResolveCollisions (_surfer.collider, ref _surfer.moveData.origin, ref _surfer.moveData.velocity, _surfer.moveData.rigidbodyPushForce, amountThisLoop / velocityDist); } diff --git a/Modified fragsurf/Movement/SurfPhysics.cs b/Modified fragsurf/Movement/SurfPhysics.cs index 3424fa1..7f7dd45 100644 --- a/Modified fragsurf/Movement/SurfPhysics.cs +++ b/Modified fragsurf/Movement/SurfPhysics.cs @@ -29,7 +29,12 @@ namespace Fragsurf.Movement { /// /// /// http://www.00jknight.com/blog/unity-character-controller + public static void ResolveCollisions (Collider collider, ref Vector3 origin, ref Vector3 velocity, float rigidbodyPushForce) { + ResolveCollisions (collider, ref origin, ref velocity, rigidbodyPushForce, 1f); + } + + public static void ResolveCollisions (Collider collider, ref Vector3 origin, ref Vector3 velocity, float rigidbodyPushForce, float velocityMultiplier) { // manual collision resolving int numOverlaps = 0; @@ -59,17 +64,18 @@ namespace Fragsurf.Movement { Quaternion.identity, _colliders [i], _colliders [i].transform.position, _colliders [i].transform.rotation, out direction, out distance)) { + // Handle collision direction.Normalize (); Vector3 penetrationVector = direction * distance; Vector3 velocityProjected = Vector3.Project (velocity, -direction); velocityProjected.y = 0; // don't touch y velocity, we need it to calculate fall damage elsewhere origin += penetrationVector; - velocity -= velocityProjected; + velocity -= velocityProjected * velocityMultiplier; Rigidbody rb = _colliders [i].GetComponentInParent (); if (rb) if (!rb.isKinematic) - rb.AddForceAtPosition (velocityProjected * rigidbodyPushForce, origin, ForceMode.Impulse); + rb.AddForceAtPosition (velocityProjected * velocityMultiplier * rigidbodyPushForce, origin, ForceMode.Impulse); }