using UnityEngine; namespace Artngame.SKYMASTER { [RequireComponent(typeof(CharacterController))] public class FirstPersonController : MonoBehaviour { public float speed; public float upDownRange; public float jumpSpeed; private float verticalRotation; private CharacterController cc; private bool rotate; private float currentSpeed; private bool flying; private float verticalVelocity; private void Start() { cc = GetComponent(); rotate = true; SetCursorState(CursorLockMode.Locked); } private void SetCursorState(CursorLockMode wantedMode) { Cursor.lockState = wantedMode; Cursor.visible = CursorLockMode.Locked != wantedMode; } private void OnControllerColliderHit(ControllerColliderHit hit) { float num = currentSpeed * 0.5f; Rigidbody attachedRigidbody = hit.collider.attachedRigidbody; if (!(attachedRigidbody == null) && !attachedRigidbody.isKinematic && !(hit.moveDirection.y < -0.3f)) { Vector3 vector = new Vector3(hit.moveDirection.x, 0f, hit.moveDirection.z); attachedRigidbody.velocity = vector * num; } } private void Update() { float axis = Input.GetAxis("Vertical"); float axis2 = Input.GetAxis("Horizontal"); currentSpeed = speed; if (rotate) { float axis3 = Input.GetAxis("Mouse X"); verticalRotation -= Input.GetAxis("Mouse Y"); verticalRotation = Mathf.Clamp(verticalRotation, 0f - upDownRange, upDownRange); Camera.main.transform.localRotation = Quaternion.Euler(verticalRotation, 0f, 0f); base.transform.Rotate(0f, axis3, 0f); } if (!flying) { if (cc.isGrounded) { verticalVelocity = 0f; if (Input.GetButton("Jump")) { verticalVelocity = jumpSpeed; } } else { verticalVelocity += Physics.gravity.y * Time.deltaTime; } } else { currentSpeed = speed * 300f; if (Input.GetKey("e")) { verticalVelocity = 1f; } else if (Input.GetKey("q")) { verticalVelocity = -1f; } else { verticalVelocity = 0f; } } if (Input.GetKey(KeyCode.LeftControl)) { cc.height = 0.2f; currentSpeed *= 0.25f; } else { cc.height = 2f; } if (Input.GetKey(KeyCode.LeftShift)) { currentSpeed *= 2.2f; } if (Input.GetKeyDown("f")) { flying = !flying; } Vector3 vector = base.transform.rotation * new Vector3(axis2, verticalVelocity, axis); cc.Move(vector * currentSpeed * Time.deltaTime); if (Input.GetKeyDown(KeyCode.Escape)) { rotate = !rotate; SetCursorState(rotate ? CursorLockMode.Locked : CursorLockMode.None); } } } }