PlayerMovement.cs 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161
  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. Debug.DrawRay(origin, direction * wallCheckDistance, Color.red, 1f);
  39. if (Physics.Raycast(origin, direction, wallCheckDistance, obstacleLayer))
  40. {
  41. Debug.Log("Obstacle détecté devant, déplacement interdit.");
  42. return;
  43. }
  44. Vector3 targetPos = transform.position + direction * moveDistance;
  45. if (zoneManager.IsPositionAllowed(targetPos))
  46. {
  47. float groundY = GetGroundHeight(targetPos);
  48. if (groundY != Mathf.NegativeInfinity)
  49. {
  50. targetPos.y = groundY + playerHeightOffset;
  51. Sol sol = GetSolAtPosition(targetPos);
  52. if (sol != null)
  53. {
  54. currentFloorLevel = sol.floorLevel;
  55. }
  56. StartCoroutine(Move(targetPos));
  57. }
  58. else
  59. {
  60. Debug.Log("Aucun sol détecté sous la position cible.");
  61. }
  62. }
  63. else
  64. {
  65. Debug.Log("Déplacement bloqué : zone interdite.");
  66. }
  67. }
  68. Sol GetSolAtPosition(Vector3 position)
  69. {
  70. Ray ray = new Ray(position + Vector3.up * groundRayDistance, Vector3.down);
  71. if (Physics.Raycast(ray, out RaycastHit hit, groundRayDistance * 2f, groundLayer))
  72. {
  73. return hit.collider.GetComponent<Sol>();
  74. }
  75. return null;
  76. }
  77. float GetGroundHeight(Vector3 position)
  78. {
  79. Ray ray = new Ray(position + Vector3.up * groundRayDistance, Vector3.down);
  80. RaycastHit[] hits = Physics.RaycastAll(ray, groundRayDistance * 2f, groundLayer);
  81. foreach (RaycastHit hit in hits)
  82. {
  83. Sol sol = hit.collider.GetComponent<Sol>();
  84. if (sol != null && sol.floorLevel == currentFloorLevel)
  85. {
  86. return hit.point.y;
  87. }
  88. }
  89. // Aucun sol avec floorLevel trouvé : fallback
  90. if (Physics.Raycast(ray, out RaycastHit fallbackHit, groundRayDistance * 2f, groundLayer))
  91. {
  92. return fallbackHit.point.y;
  93. }
  94. return Mathf.NegativeInfinity;
  95. }
  96. IEnumerator Move(Vector3 targetPos)
  97. {
  98. isMoving = true;
  99. Vector3 startPos = transform.position;
  100. float t = 0;
  101. while (t < 1)
  102. {
  103. t += Time.deltaTime * moveSpeed;
  104. transform.position = Vector3.Lerp(startPos, targetPos, t);
  105. yield return null;
  106. }
  107. transform.position = targetPos;
  108. isMoving = false;
  109. Vector2Int newGridPosition = new Vector2Int(Mathf.RoundToInt(transform.position.x), Mathf.RoundToInt(transform.position.z));
  110. if (newGridPosition != lastGridPosition)
  111. {
  112. lastGridPosition = newGridPosition;
  113. // Fermer le panneau de recrutement si ouvert
  114. if (RecruitDialogueUI.Instance != null)
  115. RecruitDialogueUI.Instance.Hide();
  116. }
  117. }
  118. IEnumerator Rotate(float angle)
  119. {
  120. isMoving = true;
  121. Quaternion startRot = transform.rotation;
  122. Quaternion endRot = startRot * Quaternion.Euler(0, angle, 0);
  123. float t = 0;
  124. while (t < 1)
  125. {
  126. t += Time.deltaTime * (rotationSpeed / 100);
  127. transform.rotation = Quaternion.Slerp(startRot, endRot, t);
  128. yield return null;
  129. }
  130. transform.rotation = endRot;
  131. isMoving = false;
  132. }
  133. public void MoveForward() => TryMove(transform.forward);
  134. public void MoveBackward() => TryMove(-transform.forward);
  135. public void StrafeLeft() => TryMove(-transform.right);
  136. public void StrafeRight() => TryMove(transform.right);
  137. public void TurnLeft() => StartCoroutine(Rotate(-90));
  138. public void TurnRight() => StartCoroutine(Rotate(90));
  139. }