Advertisement
Guest User

Untitled

a guest
Dec 23rd, 2024
38
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.21 KB | None | 0 0
  1. using UnityEngine;
  2.  
  3. [RequireComponent(typeof(Transform), typeof(Player))]
  4. public class CharMovement : MonoBehaviour
  5. {
  6. public float maxLinearVelocity = 5f;
  7. [SerializeField] private float _turnSpeed = 360f;
  8. [SerializeField] private float _rotationTolerance = 0.1f; //radius
  9.  
  10. private Player _playerStats;
  11. public Camera _cam;
  12. private Vector3 _mousePos;
  13. public Transform _transform;
  14. private void Start()
  15. {
  16. _playerStats = GetComponent<Player>();
  17. _transform = GetComponent<Transform>();
  18. maxLinearVelocity = _playerStats.speed;
  19. }
  20.  
  21. void Update()
  22. {
  23.  
  24. maxLinearVelocity = _playerStats.speed;
  25. Look();
  26. }
  27.  
  28. private void FixedUpdate()
  29. {
  30. Move();
  31. }
  32.  
  33. public void Move()
  34. {
  35. var input = new Vector3(Input.GetAxisRaw("Horizontal"), 0, Input.GetAxisRaw("Vertical"));
  36. Vector3 forward = transform.forward * input.z * Time.fixedDeltaTime;
  37. Vector3 right = transform.right * input.x * Time.fixedDeltaTime;
  38. Vector3 heading = (forward + right).normalized;
  39. _transform.forward = heading;
  40. _transform.position += maxLinearVelocity * Time.fixedDeltaTime * heading;
  41. }
  42.  
  43. public void Look()
  44. {
  45. Plane plane = new (Vector3.up, Vector3.zero);
  46. Ray ray = _cam.ScreenPointToRay(Input.mousePosition);
  47.  
  48. if (plane.Raycast(ray, out float distance))
  49. {
  50. _mousePos = ray.GetPoint(distance);
  51. }
  52. else { return; }
  53. // Calcola la direzione di rotazione verso il mouse
  54. Vector3 lookDir = (_mousePos - _transform.position).normalized;
  55. lookDir.y = 0;
  56.  
  57. if (lookDir.sqrMagnitude < 0.01f)
  58. return; // check for zero vector?
  59.  
  60. float angle = Mathf.Atan2(lookDir.x, lookDir.z) * Mathf.Rad2Deg;
  61. Quaternion targetRotation = Quaternion.Euler(0, angle, 0);
  62.  
  63. // Tolerance check
  64. float angleDifference = Quaternion.Angle(_transform.rotation, targetRotation);
  65. if (angleDifference < _rotationTolerance)
  66. return; // Tolerance stop
  67. _transform.rotation = Quaternion.RotateTowards(_transform.rotation, targetRotation, _turnSpeed);
  68. }
  69. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement