#if ENABLE_INPUT_SYSTEM && ENABLE_INPUT_SYSTEM_PACKAGE#define USE_INPUT_SYSTEMusingUnityEngine.InputSystem;usingUnityEngine.InputSystem.Controls;#endifusingUnityEngine;publicclassSimpleCameraController:MonoBehaviour{
classCameraState{
publicfloat yaw;publicfloat pitch;publicfloat roll;publicfloat x;publicfloat y;publicfloat z;publicvoidSetFromTransform(Transform t){
pitch = t.eulerAngles.x;
yaw = t.eulerAngles.y;
roll = t.eulerAngles.z;
x = t.position.x;
y = t.position.y;
z = t.position.z;}publicvoidTranslate(Vector3 translation){
Vector3 rotatedTranslation = Quaternion.Euler(pitch, yaw, roll)* translation;
x += rotatedTranslation.x;
y += rotatedTranslation.y;
z += rotatedTranslation.z;}publicvoidLerpTowards(CameraState target,float positionLerpPct,float rotationLerpPct){
yaw = Mathf.Lerp(yaw, target.yaw, rotationLerpPct);
pitch = Mathf.Lerp(pitch, target.pitch, rotationLerpPct);
roll = Mathf.Lerp(roll, target.roll, rotationLerpPct);
x = Mathf.Lerp(x, target.x, positionLerpPct);
y = Mathf.Lerp(y, target.y, positionLerpPct);
z = Mathf.Lerp(z, target.z, positionLerpPct);}publicvoidUpdateTransform(Transform t){
t.eulerAngles =newVector3(pitch, yaw, roll);
t.position =newVector3(x, y, z);}}CameraState m_TargetCameraState =newCameraState();CameraState m_InterpolatingCameraState =newCameraState();[Header("Movement Settings")][Tooltip("Exponential boost factor on translation, controllable by mouse wheel.")]publicfloat boost =3.5f;[Tooltip("Time it takes to interpolate camera position 99% of the way to the target."),Range(0.001f,1f)]publicfloat positionLerpTime =0.2f;[Header("Rotation Settings")][Tooltip("X = Change in mouse position.\nY = Multiplicative factor for camera rotation.")]publicAnimationCurve mouseSensitivityCurve =newAnimationCurve(newKeyframe(0f,0.5f,0f,5f),newKeyframe(1f,2.5f,0f,0f));[Tooltip("Time it takes to interpolate camera rotation 99% of the way to the target."),Range(0.001f,1f)]publicfloat rotationLerpTime =0.01f;[Tooltip("Whether or not to invert our Y axis for mouse input to rotation.")]publicbool invertY =false;voidOnEnable(){
m_TargetCameraState.SetFromTransform(transform);
m_InterpolatingCameraState.SetFromTransform(transform);}Vector3GetInputTranslationDirection(){
Vector3 direction =newVector3();if(Input.GetKey(KeyCode.W)){
direction += Vector3.forward;}if(Input.GetKey(KeyCode.S)){
direction += Vector3.back;}if(Input.GetKey(KeyCode.A)){
direction += Vector3.left;}if(Input.GetKey(KeyCode.D)){
direction += Vector3.right;}if(Input.GetKey(KeyCode.Q)){
direction += Vector3.down;}if(Input.GetKey(KeyCode.E)){
direction += Vector3.up;}return direction;}voidUpdate(){
Vector3 translation = Vector3.zero;#if ENABLE_LEGACY_INPUT_MANAGER// Exit Sample if(Input.GetKey(KeyCode.Escape)){
Application.Quit();#if UNITY_EDITOR
UnityEditor.EditorApplication.isPlaying =false;#endif}// Hide and lock cursor when right mouse button pressedif(Input.GetMouseButtonDown(1)){
Cursor.lockState = CursorLockMode.Locked;}// Unlock and show cursor when right mouse button releasedif(Input.GetMouseButtonUp(1)){
Cursor.visible =true;
Cursor.lockState = CursorLockMode.None;}// Rotationif(Input.GetMouseButton(1)){
var mouseMovement =newVector2(Input.GetAxis("Mouse X"), Input.GetAxis("Mouse Y")*(invertY ?1:-1));var mouseSensitivityFactor = mouseSensitivityCurve.Evaluate(mouseMovement.magnitude);
m_TargetCameraState.yaw += mouseMovement.x * mouseSensitivityFactor;
m_TargetCameraState.pitch += mouseMovement.y * mouseSensitivityFactor;}// Translation
translation =GetInputTranslationDirection()* Time.deltaTime;// Speed up movement when shift key heldif(Input.GetKey(KeyCode.LeftShift)){
translation *=10.0f;}// Modify movement by a boost factor (defined in Inspector and modified in play mode through the mouse scroll wheel)
boost += Input.mouseScrollDelta.y *0.2f;
translation *= Mathf.Pow(2.0f, boost);#elif USE_INPUT_SYSTEM// TODO: make the new input system work#endif
m_TargetCameraState.Translate(translation);// Framerate-independent interpolation// Calculate the lerp amount, such that we get 99% of the way to our target in the specified timevar positionLerpPct =1f- Mathf.Exp((Mathf.Log(1f-0.99f)/ positionLerpTime)* Time.deltaTime);var rotationLerpPct =1f- Mathf.Exp((Mathf.Log(1f-0.99f)/ rotationLerpTime)* Time.deltaTime);
m_InterpolatingCameraState.LerpTowards(m_TargetCameraState, positionLerpPct, rotationLerpPct);
m_InterpolatingCameraState.UpdateTransform(transform);}}