78 lines
2.3 KiB
C#
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
|
|
} |