PlayerMovement.cs 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151
  1. using UnityEngine;
  2. using System.Collections;
  3. using System.Collections.Generic;
  4. public class GridMovement : MonoBehaviour
  5. {
  6. public float moveDistance = 1f;
  7. public float moveSpeed = 5f;
  8. public float rotationSpeed = 300f;
  9. public LayerMask moveZoneLayer;
  10. public ZoneManager zoneManager;
  11. public LayerMask groundLayer;
  12. public float groundRayDistance = 5f;
  13. public float playerHeightOffset = 0.8f;
  14. public LayerMask obstacleLayer;
  15. public float wallCheckDistance = 1f;
  16. public int currentFloorLevel = 0;
  17. private bool isMoving = false;
  18. private Vector2Int lastGridPosition;
  19. void Update()
  20. {
  21. if (isMoving) return;
  22. if (Input.GetKeyDown(KeyCode.W))
  23. TryMove(transform.forward);
  24. if (Input.GetKeyDown(KeyCode.S))
  25. TryMove(-transform.forward);
  26. if (Input.GetKeyDown(KeyCode.Q))
  27. TryMove(-transform.right);
  28. if (Input.GetKeyDown(KeyCode.E))
  29. TryMove(transform.right);
  30. if (Input.GetKeyDown(KeyCode.A))
  31. StartCoroutine(Rotate(-90));
  32. if (Input.GetKeyDown(KeyCode.D))
  33. StartCoroutine(Rotate(90));
  34. }
  35. void TryMove(Vector3 direction)
  36. {
  37. Vector3 origin = transform.position + Vector3.up * 0.5f;
  38. if (Physics.Raycast(origin, direction, wallCheckDistance, obstacleLayer))
  39. {
  40. return;
  41. }
  42. Vector3 targetPos = transform.position + direction * moveDistance;
  43. if (zoneManager.IsPositionAllowed(targetPos))
  44. {
  45. float groundY = GetGroundHeight(targetPos);
  46. if (groundY != Mathf.NegativeInfinity)
  47. {
  48. targetPos.y = groundY + playerHeightOffset;
  49. Sol sol = GetSolAtPosition(targetPos);
  50. if (sol != null)
  51. {
  52. currentFloorLevel = sol.floorLevel;
  53. }
  54. StartCoroutine(Move(targetPos));
  55. }
  56. }
  57. }
  58. Sol GetSolAtPosition(Vector3 position)
  59. {
  60. Ray ray = new Ray(position + Vector3.up * groundRayDistance, Vector3.down);
  61. if (Physics.Raycast(ray, out RaycastHit hit, groundRayDistance * 2f, groundLayer))
  62. {
  63. return hit.collider.GetComponent<Sol>();
  64. }
  65. return null;
  66. }
  67. float GetGroundHeight(Vector3 position)
  68. {
  69. Ray ray = new Ray(position + Vector3.up * groundRayDistance, Vector3.down);
  70. RaycastHit[] hits = Physics.RaycastAll(ray, groundRayDistance * 2f, groundLayer);
  71. foreach (RaycastHit hit in hits)
  72. {
  73. Sol sol = hit.collider.GetComponent<Sol>();
  74. if (sol != null && sol.floorLevel == currentFloorLevel)
  75. {
  76. return hit.point.y;
  77. }
  78. }
  79. // Aucun sol avec floorLevel trouvé : fallback
  80. if (Physics.Raycast(ray, out RaycastHit fallbackHit, groundRayDistance * 2f, groundLayer))
  81. {
  82. return fallbackHit.point.y;
  83. }
  84. return Mathf.NegativeInfinity;
  85. }
  86. IEnumerator Move(Vector3 targetPos)
  87. {
  88. isMoving = true;
  89. Vector3 startPos = transform.position;
  90. float t = 0;
  91. while (t < 1)
  92. {
  93. t += Time.deltaTime * moveSpeed;
  94. transform.position = Vector3.Lerp(startPos, targetPos, t);
  95. yield return null;
  96. }
  97. transform.position = targetPos;
  98. isMoving = false;
  99. Vector2Int newGridPosition = new Vector2Int(Mathf.RoundToInt(transform.position.x), Mathf.RoundToInt(transform.position.z));
  100. if (newGridPosition != lastGridPosition)
  101. {
  102. lastGridPosition = newGridPosition;
  103. // Fermer le panneau de recrutement si ouvert
  104. if (RecruitDialogueUI.Instance != null)
  105. RecruitDialogueUI.Instance.Hide();
  106. }
  107. }
  108. IEnumerator Rotate(float angle)
  109. {
  110. isMoving = true;
  111. Quaternion startRot = transform.rotation;
  112. Quaternion endRot = startRot * Quaternion.Euler(0, angle, 0);
  113. float t = 0;
  114. while (t < 1)
  115. {
  116. t += Time.deltaTime * (rotationSpeed / 100);
  117. transform.rotation = Quaternion.Slerp(startRot, endRot, t);
  118. yield return null;
  119. }
  120. transform.rotation = endRot;
  121. isMoving = false;
  122. }
  123. public void MoveForward() => TryMove(transform.forward);
  124. public void MoveBackward() => TryMove(-transform.forward);
  125. public void StrafeLeft() => TryMove(-transform.right);
  126. public void StrafeRight() => TryMove(transform.right);
  127. public void TurnLeft() => StartCoroutine(Rotate(-90));
  128. public void TurnRight() => StartCoroutine(Rotate(90));
  129. }