using UnityEngine; using Cinemachine; public class FreeLookCamera360Panning : MonoBehaviour { public CinemachineFreeLook freeLookCamera; public Transform player; // Player's Transform to follow public float panSpeed = 10f; // Speed of panning public float edgeThreshold = 10f; // Edge detection range in pixels private bool isPanning = false; void Update() { HandleEdgeScrolling(); } void HandleEdgeScrolling() { Vector3 mousePos = Input.mousePosition; float screenWidth = Screen.width; float screenHeight = Screen.height; Vector3 moveDirection = Vector3.zero; // Detect if cursor is near screen edges if (mousePos.x <= edgeThreshold) moveDirection += -freeLookCamera.transform.right; // Move left if (mousePos.x >= screenWidth - edgeThreshold) moveDirection += freeLookCamera.transform.right; // Move right if (mousePos.y <= edgeThreshold) moveDirection += -freeLookCamera.transform.forward; // Move backward if (mousePos.y >= screenHeight - edgeThreshold) moveDirection += freeLookCamera.transform.forward; // Move forward if (moveDirection != Vector3.zero) { if (!isPanning) { freeLookCamera.Follow = null; // Stop following the player freeLookCamera.LookAt = null; // Stop aiming at the player isPanning = true; } // Move the camera in world space (360-degree movement) freeLookCamera.transform.Translate(moveDirection * panSpeed * Time.deltaTime, Space.World); } else { if (isPanning) { freeLookCamera.Follow = player; // Re-enable following the player freeLookCamera.LookAt = player; // Re-enable aiming at the player isPanning = false; } } } }