SimpleFPSController.cs 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. using UnityEngine;
  2. namespace ZenFulcrum.EmbeddedBrowser {
  3. /// <summary>
  4. /// Simple no-nonsense FPS controller for use in demos. It's not very refined, but it's simple.
  5. ///
  6. /// (The 5.x and newer controllers are pretty heavy to include for a demo.)
  7. /// </summary>
  8. [RequireComponent(typeof(Rigidbody))]
  9. public class SimpleFPSController : MonoBehaviour {
  10. public float lookSpeed = 100;
  11. public float moveSpeed = 10;
  12. public float moveForce = 20000;
  13. public float jumpForce = 50;
  14. public float dampening = 2;
  15. private Vector3 bottom = new Vector3(0, -1, 0);
  16. private Camera head;
  17. private Rigidbody body;
  18. private float lookPitch;
  19. public void Awake() {
  20. head = GetComponentInChildren<Camera>();
  21. body = GetComponent<Rigidbody>();
  22. }
  23. public void Update() {
  24. //look
  25. var lookDelta = new Vector2(Input.GetAxisRaw("Mouse X"), Input.GetAxisRaw("Mouse Y")) * lookSpeed;
  26. var deltaYaw = Quaternion.AngleAxis(lookDelta.x, Vector3.up);
  27. transform.localRotation *= deltaYaw;
  28. lookPitch += -lookDelta.y;
  29. lookPitch = Mathf.Clamp(lookPitch, -90, 90);
  30. head.transform.localRotation = Quaternion.Euler(lookPitch, 0, 0);
  31. //jump
  32. if (Input.GetButtonDown("Jump") && Grounded) {
  33. body.AddForce(-Physics.gravity.normalized * jumpForce, ForceMode.Impulse);
  34. }
  35. }
  36. public void FixedUpdate() {
  37. if (Time.frameCount < 5) return;
  38. var grounded = Grounded;
  39. if (grounded) body.drag = dampening;
  40. else body.drag = 0;
  41. var horizVel = body.velocity;
  42. horizVel.y = 0;
  43. //move
  44. var moveWish = new Vector3(Input.GetAxisRaw("Horizontal"), 0, Input.GetAxisRaw("Vertical"));
  45. if (moveWish.magnitude > 1) moveWish = moveWish.normalized;
  46. if (horizVel.magnitude > moveSpeed) return;
  47. //local to global
  48. moveWish = transform.TransformVector(moveWish);
  49. var force = moveWish * moveForce * Time.deltaTime;
  50. if (force.magnitude > 0) {
  51. if (!grounded) force *= .5f;
  52. body.AddForce(force, ForceMode.Force);
  53. }
  54. }
  55. public bool Grounded {
  56. get {
  57. var hits = Physics.SphereCastAll(new Ray(transform.position + bottom + transform.up * .01f, Physics.gravity.normalized), .1f, .1f);
  58. for (int i = 0; i < hits.Length; i++) {
  59. if (hits[i].rigidbody == body) continue;
  60. return true;
  61. }
  62. return false;
  63. }
  64. }
  65. }
  66. }