CameraController.cs 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200
  1. using UnityEngine;
  2. using UnityEngine.InputSystem;
  3. public class CameraController : MonoBehaviour
  4. {
  5. [Header("Movement Settings")]
  6. public float moveSpeed = 10f;
  7. public float fastMoveSpeed = 20f;
  8. public float mouseSensitivity = 2f;
  9. [Header("Zoom Settings")]
  10. public float zoomSpeed = 5f;
  11. public float minZoom = 5f;
  12. public float maxZoom = 20f;
  13. [Header("Boundaries")]
  14. public bool useBoundaries = true;
  15. public Vector2 mapBounds = new Vector2(50f, 50f);
  16. [Header("Mouse Controls")]
  17. public bool enableMouseDrag = true;
  18. public bool invertMouseY = false;
  19. private Camera playerCamera;
  20. private Vector2 lastMousePosition;
  21. private bool isMouseDragging = false;
  22. private float currentZoom;
  23. void Start()
  24. {
  25. playerCamera = GetComponent<Camera>();
  26. if (playerCamera == null)
  27. {
  28. Debug.LogError("CameraController requires a Camera component!");
  29. return;
  30. }
  31. currentZoom = playerCamera.orthographicSize;
  32. }
  33. void Update()
  34. {
  35. HandleKeyboardMovement();
  36. HandleMouseControls();
  37. HandleZoom();
  38. EnforceBoundaries();
  39. }
  40. void HandleKeyboardMovement()
  41. {
  42. Vector3 moveDirection = Vector3.zero;
  43. // WASD movement
  44. var keyboard = Keyboard.current;
  45. if (keyboard.wKey.isPressed || keyboard.upArrowKey.isPressed)
  46. moveDirection += Vector3.forward;
  47. if (keyboard.sKey.isPressed || keyboard.downArrowKey.isPressed)
  48. moveDirection += Vector3.back;
  49. if (keyboard.aKey.isPressed || keyboard.leftArrowKey.isPressed)
  50. moveDirection += Vector3.left;
  51. if (keyboard.dKey.isPressed || keyboard.rightArrowKey.isPressed)
  52. moveDirection += Vector3.right;
  53. // Apply movement
  54. if (moveDirection != Vector3.zero)
  55. {
  56. float currentMoveSpeed = keyboard.leftShiftKey.isPressed ? fastMoveSpeed : moveSpeed;
  57. // Adjust speed based on zoom level (more zoomed out = faster movement)
  58. float zoomSpeedMultiplier = currentZoom / 10f;
  59. currentMoveSpeed *= zoomSpeedMultiplier;
  60. transform.Translate(moveDirection.normalized * currentMoveSpeed * Time.deltaTime, Space.World);
  61. }
  62. }
  63. void HandleMouseControls()
  64. {
  65. if (!enableMouseDrag) return;
  66. // Middle mouse button or right mouse button for dragging
  67. var mouse = Mouse.current;
  68. var keyboard = Keyboard.current;
  69. if (mouse.middleButton.wasPressedThisFrame || (mouse.rightButton.wasPressedThisFrame && keyboard.leftCtrlKey.isPressed))
  70. {
  71. lastMousePosition = mouse.position.ReadValue();
  72. isMouseDragging = true;
  73. }
  74. if (mouse.middleButton.wasReleasedThisFrame || mouse.rightButton.wasReleasedThisFrame)
  75. {
  76. isMouseDragging = false;
  77. }
  78. if (isMouseDragging)
  79. {
  80. Vector2 mouseDelta = mouse.position.ReadValue() - lastMousePosition;
  81. // Convert mouse movement to world movement
  82. Vector3 worldDelta = playerCamera.ScreenToWorldPoint(new Vector3(mouseDelta.x, mouseDelta.y, playerCamera.nearClipPlane));
  83. worldDelta = transform.TransformDirection(worldDelta);
  84. // Invert movement (moving mouse right should move camera left)
  85. Vector3 moveVector = new Vector3(-worldDelta.x, 0, invertMouseY ? worldDelta.z : -worldDelta.z);
  86. // Scale by zoom level and sensitivity
  87. float zoomSpeedMultiplier = currentZoom / 10f;
  88. moveVector *= mouseSensitivity * zoomSpeedMultiplier * 0.1f;
  89. transform.Translate(moveVector, Space.World);
  90. lastMousePosition = mouse.position.ReadValue();
  91. }
  92. }
  93. void HandleZoom()
  94. {
  95. var mouse = Mouse.current;
  96. var keyboard = Keyboard.current;
  97. float scrollInput = mouse.scroll.ReadValue().y / 120f; // Convert to old Input.GetAxis scale
  98. if (scrollInput != 0)
  99. {
  100. currentZoom -= scrollInput * zoomSpeed;
  101. currentZoom = Mathf.Clamp(currentZoom, minZoom, maxZoom);
  102. if (playerCamera.orthographic)
  103. {
  104. playerCamera.orthographicSize = currentZoom;
  105. }
  106. else
  107. {
  108. // For perspective camera, adjust distance from ground
  109. Vector3 pos = transform.position;
  110. pos.y = currentZoom;
  111. transform.position = pos;
  112. }
  113. }
  114. // Keyboard zoom controls
  115. if (keyboard.equalsKey.isPressed || keyboard.numpadPlusKey.isPressed)
  116. {
  117. currentZoom -= zoomSpeed * Time.deltaTime;
  118. currentZoom = Mathf.Clamp(currentZoom, minZoom, maxZoom);
  119. playerCamera.orthographicSize = currentZoom;
  120. }
  121. if (keyboard.minusKey.isPressed || keyboard.numpadMinusKey.isPressed)
  122. {
  123. currentZoom += zoomSpeed * Time.deltaTime;
  124. currentZoom = Mathf.Clamp(currentZoom, minZoom, maxZoom);
  125. playerCamera.orthographicSize = currentZoom;
  126. }
  127. }
  128. void EnforceBoundaries()
  129. {
  130. if (!useBoundaries) return;
  131. Vector3 pos = transform.position;
  132. // Clamp camera position within map bounds
  133. pos.x = Mathf.Clamp(pos.x, -mapBounds.x, mapBounds.x);
  134. pos.z = Mathf.Clamp(pos.z, -mapBounds.y, mapBounds.y);
  135. transform.position = pos;
  136. }
  137. public void FocusOnPosition(Vector3 worldPosition)
  138. {
  139. Vector3 newPosition = worldPosition;
  140. newPosition.y = transform.position.y; // Keep current height
  141. transform.position = newPosition;
  142. }
  143. public void SetZoom(float zoom)
  144. {
  145. currentZoom = Mathf.Clamp(zoom, minZoom, maxZoom);
  146. playerCamera.orthographicSize = currentZoom;
  147. }
  148. public void ResetToDefault()
  149. {
  150. transform.position = new Vector3(0, 10, 0);
  151. transform.rotation = Quaternion.Euler(45, 0, 0);
  152. SetZoom(15f);
  153. }
  154. void OnDrawGizmosSelected()
  155. {
  156. if (useBoundaries)
  157. {
  158. // Draw map boundaries
  159. Gizmos.color = Color.red;
  160. Vector3 center = Vector3.zero;
  161. Vector3 size = new Vector3(mapBounds.x * 2, 1, mapBounds.y * 2);
  162. Gizmos.DrawWireCube(center, size);
  163. }
  164. }
  165. }