78 lines
2.3 KiB
C#

using UnityEngine;
[RequireComponent( typeof(Camera) )]
public class PlayerEssence : MonoBehaviour
{
public float _acceleration = 50; // how fast you accelerate
public float _accSprintMultiplier = 4; // how much faster you go when "sprinting"
public float _lookSensitivity = 1; // mouse look sensitivity
public float _dampingCoefficient = 5; // how quickly you break to a halt after you stop your input
public bool _focusOnEnable = true; // whether or not to focus and lock cursor immediately on enable
Vector3 velocity; // current velocity
static bool Focused {
get => Cursor.lockState == CursorLockMode.Locked;
set {
Cursor.lockState = value ? CursorLockMode.Locked : CursorLockMode.None;
Cursor.visible = value == false;
}
}
void OnEnable() {
if( _focusOnEnable ) Focused = true;
}
void OnDisable() => Focused = false;
void Update() {
// Input
if( Focused )
UpdateInput();
else if( Input.GetMouseButtonDown( 0 ) )
Focused = true;
// Physics
velocity = Vector3.Lerp( velocity, Vector3.zero, _dampingCoefficient * Time.deltaTime );
transform.position += velocity * Time.deltaTime;
}
void UpdateInput() {
// Position
velocity += GetAccelerationVector() * Time.deltaTime;
// Rotation
Vector2 mouseDelta = _lookSensitivity * new Vector2( Input.GetAxis( "Mouse X" ), -Input.GetAxis( "Mouse Y" ) );
Quaternion rotation = transform.rotation;
Quaternion horiz = Quaternion.AngleAxis( mouseDelta.x, Vector3.up );
Quaternion vert = Quaternion.AngleAxis( mouseDelta.y, Vector3.right );
transform.rotation = horiz * rotation * vert;
// Leave cursor lock
if( Input.GetKeyDown( KeyCode.Escape ) )
Focused = false;
}
Vector3 GetAccelerationVector() {
Vector3 moveInput = default;
void AddMovement( KeyCode key, Vector3 dir ) {
if( Input.GetKey( key ) )
moveInput += dir;
}
AddMovement( KeyCode.W, Vector3.forward );
AddMovement( KeyCode.S, Vector3.back );
AddMovement( KeyCode.D, Vector3.right );
AddMovement( KeyCode.A, Vector3.left );
AddMovement( KeyCode.Space, Vector3.up );
AddMovement( KeyCode.LeftControl, Vector3.down );
Vector3 direction = transform.TransformVector( moveInput.normalized );
if( Input.GetKey( KeyCode.LeftShift ) )
return direction * ( _acceleration * _accSprintMultiplier ); // "sprinting"
return direction * _acceleration; // "walking"
}
// Fog for Camera - Later
}