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 }