SimpleController_UsingState.cs 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. using UnityEngine.InputSystem;
  2. using UnityEngine;
  3. // Using state of gamepad device directly.
  4. public class SimpleController_UsingState : MonoBehaviour
  5. {
  6. public float moveSpeed;
  7. public float rotateSpeed;
  8. public GameObject projectile;
  9. private Vector2 m_Rotation;
  10. private bool m_Firing;
  11. private float m_FireCooldown;
  12. public void Update()
  13. {
  14. var gamepad = Gamepad.current;
  15. if (gamepad == null)
  16. return;
  17. var leftStick = gamepad.leftStick.ReadValue();
  18. var rightStick = gamepad.rightStick.ReadValue();
  19. Look(rightStick);
  20. Move(leftStick);
  21. if (gamepad.buttonSouth.wasPressedThisFrame)
  22. {
  23. m_Firing = true;
  24. m_FireCooldown = 0;
  25. }
  26. else if (gamepad.buttonSouth.wasReleasedThisFrame)
  27. {
  28. m_Firing = false;
  29. }
  30. if (m_Firing && m_FireCooldown < Time.time)
  31. {
  32. Fire();
  33. m_FireCooldown = Time.time + 0.1f;
  34. }
  35. }
  36. private void Move(Vector2 direction)
  37. {
  38. if (direction.sqrMagnitude < 0.01)
  39. return;
  40. var scaledMoveSpeed = moveSpeed * Time.deltaTime;
  41. // For simplicity's sake, we just keep movement in a single plane here. Rotate
  42. // direction according to world Y rotation of player.
  43. var move = Quaternion.Euler(0, transform.eulerAngles.y, 0) * new Vector3(direction.x, 0, direction.y);
  44. transform.position += move * scaledMoveSpeed;
  45. }
  46. private void Look(Vector2 rotate)
  47. {
  48. if (rotate.sqrMagnitude < 0.01)
  49. return;
  50. var scaledRotateSpeed = rotateSpeed * Time.deltaTime;
  51. m_Rotation.y += rotate.x * scaledRotateSpeed;
  52. m_Rotation.x = Mathf.Clamp(m_Rotation.x - rotate.y * scaledRotateSpeed, -89, 89);
  53. transform.localEulerAngles = m_Rotation;
  54. }
  55. private void Fire()
  56. {
  57. var transform = this.transform;
  58. var newProjectile = Instantiate(projectile);
  59. newProjectile.transform.position = transform.position + transform.forward * 0.6f;
  60. newProjectile.transform.rotation = transform.rotation;
  61. const int size = 1;
  62. newProjectile.transform.localScale *= size;
  63. newProjectile.GetComponent<Rigidbody>().mass = Mathf.Pow(size, 3);
  64. newProjectile.GetComponent<Rigidbody>().AddForce(transform.forward * 20f, ForceMode.Impulse);
  65. newProjectile.GetComponent<MeshRenderer>().material.color =
  66. new Color(Random.value, Random.value, Random.value, 1.0f);
  67. }
  68. }