rabidus-test/Assets/BNG Framework/Scripts/Core/PlayerGravity.cs

91 lines
3.0 KiB
C#

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
namespace BNG {
/// <summary>
/// Apply Gravity to a CharacterController or RigidBody
/// </summary>
public class PlayerGravity : MonoBehaviour {
[Tooltip("If true, will apply gravity to the CharacterController component, or RigidBody if no CC is present.")]
public bool GravityEnabled = true;
[Tooltip("Amount of Gravity to apply to the CharacterController or Rigidbody. Default is 'Physics.gravity'.")]
public Vector3 Gravity = Physics.gravity;
CharacterController characterController;
SmoothLocomotion smoothLocomotion;
Rigidbody playerRigidbody;
private float _movementY;
private Vector3 _initialGravityModifier;
// Save us a null check in FixedUpdate
private bool _validRigidBody = false;
void Start() {
characterController = GetComponent<CharacterController>();
smoothLocomotion = GetComponentInChildren<SmoothLocomotion>();
playerRigidbody = GetComponent<Rigidbody>();
_validRigidBody = playerRigidbody != null;
_initialGravityModifier = Gravity;
}
// Apply Gravity in LateUpdate to ensure it gets applied after any character movement is applied in Update
void LateUpdate() {
// Apply Gravity to Character Controller
if (GravityEnabled && characterController != null && characterController.enabled) {
_movementY += Gravity.y * Time.deltaTime;
// Default to smooth locomotion
if(smoothLocomotion) {
smoothLocomotion.MoveCharacter(new Vector3(0, _movementY, 0) * Time.deltaTime);
}
// Fallback to character controller
else if(characterController) {
characterController.Move(new Vector3(0, _movementY, 0) * Time.deltaTime);
}
// Reset Y movement if we are grounded
if (characterController.isGrounded) {
_movementY = 0;
}
}
}
void FixedUpdate() {
// Apply Gravity to Rigidbody Controller
if (_validRigidBody && GravityEnabled) {
//playerRigidbody.AddRelativeForce(Gravity, ForceMode.VelocityChange);
//playerRigidbody.AddForce(new Vector3(0, -Gravity.y * playerRigidbody.mass, 0));
if(smoothLocomotion && smoothLocomotion.ControllerType == PlayerControllerType.Rigidbody && smoothLocomotion.GroundContacts < 1) {
}
playerRigidbody.AddForce(Gravity * playerRigidbody.mass);
}
}
public void ToggleGravity(bool gravityOn) {
GravityEnabled = gravityOn;
if (gravityOn) {
Gravity = _initialGravityModifier;
}
else {
Gravity = Vector3.zero;
}
}
}
}