public void ApplyCommandOnPlayer(PlayerBody body, MovementCommand command, float deltaTime = -1) { if(deltaTime < 0) { deltaTime = Time.deltaTime; } Transform bodyTransform = body.gameObject.transform; Rigidbody bodyRigidbody = body.gameObject.rigidbody; if(command.LateralAxis != 0) { float torqueMagnitude = body.RotAcceleration * command.LateralAxis * deltaTime; bodyRigidbody.AddTorque(bodyTransform.up.normalized * torqueMagnitude); } if(command.FrontAxis != 0) { float forceMagnitude = body.LinearAcceleration * command.FrontAxis * deltaTime; /* Vector3 comOffset = (-bodyTransform.up + bodyTransform.forward * Mathf.Sign(command.FrontAxis)) / 2; bodyRigidbody.AddForceAtPosition(bodyTransform.forward * forceMagnitude, bodyRigidbody.centerOfMass + comOffset, ForceMode.Acceleration); */ bodyRigidbody.AddForce(bodyTransform.forward.normalized*forceMagnitude); } if(command.TestButton(MovementCommand.ActionFlags.Jump)) { body.Jump(); } }
public void ApplyCommandOnPlayer(PlayerBody body, MovementCommand command, float deltaTime = -1) { if(deltaTime < 0) { deltaTime = Time.deltaTime; } if(command.HasMovement) { Debug.Log("Command have ("+command.FrontAxis+","+command.LateralAxis+")"); Transform cameraReference = body.ActiveCamera.transform; Rigidbody rigidbody = body.gameObject.rigidbody; Transform playerTransform = body.gameObject.transform; //calculate target movement Vector3 targetMovement = (command.FrontAxis * cameraReference.forward) + (command.LateralAxis * cameraReference.right); targetMovement.y = 0; //purge vertical component targetMovement.Normalize(); //normalize Vector2 commandVector = new Vector2(command.FrontAxis, command.LateralAxis); //accelerate toward target movement rigidbody.AddForce(targetMovement * commandVector.magnitude * body.LinearAcceleration * deltaTime); //gradually rotate front toward target Vector3 currentFront = playerTransform.forward; currentFront.y = 0; currentFront.Normalize(); //prevent float angle = Vector3.Angle(currentFront, targetMovement); if(angle != 0) { //check if remaining delta is smaller than what's percorrble with current angular velocity playerTransform.rotation = Quaternion.LookRotation(Vector3.RotateTowards(playerTransform.forward, targetMovement, body.RotAcceleration * deltaTime, body.LinearAcceleration * deltaTime)); /* float potential = body.RotAcceleration * deltaTime; if(angle < potential) { playerTransform.rotation = Quaternion.LookRotation(Vector3.RotateTowards(playerTransform.forward, targetMovement, 0, 0)); } else { rigidbody.AddTorque(body.transform.up * potential); } */ } } if(command.TestButton(MovementCommand.ActionFlags.Jump)) { body.Jump(); } }