using System.Collections.Generic; using System.Runtime.CompilerServices; using UnityEngine; using UnityEngine.EventSystems; using UnityEngine.InputSystem; using UnityEngine.InputSystem.Controls; public class MoveCamera : Singleton { /// /// 카메라 시점 변경 속도 /// public float CameraRotationSpeed = 4; ///// ///// 마우스 휠 줌 속도 ///// //public float ZoomSpeewd = 5000.0f; ///// ///// 줌 최솟값, 작을 수록 확대할 수 있는 수치가 커짐 ///// //public float MinZoomValue = 10; ///// ///// 줌 최대값, 클 수록 축소할 수 있는 수치가 커짐 ///// //public float MaxZoomValue = 60; /// /// 카메라 이동 속도 /// [Range(1f, 10f)] public float CameraMoveSpeed = 4; /// /// 마우스를 움직였을때의 x,y 좌표값 /// [SerializeField] float mouseY = 0; [SerializeField] float mouseX = 0; //bool mouseOverCanvas = false; /// /// 마우스 왼쪽버튼 클릭에 대한 컨트롤 /// private ButtonControl mouseLeftButton; [SerializeField] private float m_CanMoveDistance = 3f; [SerializeField] /// /// 포인트 이동 시 초기 위치 값 저장 /// private Vector3 m_CameraInitOffset; public override void Awake() { } void Start() { mouseLeftButton = Mouse.current.leftButton; MouseInitialize(transform); } void Update() { CameraInputMove(); if (mouseLeftButton.isPressed && !IsPointerOverCanvas()) { Cursor.SetCursor(null, Vector2.zero, CursorMode.Auto); mouseY += Input.GetAxis("Mouse Y") * CameraRotationSpeed; mouseY = Mathf.Clamp(mouseY, -90, 90); mouseX += Input.GetAxis("Mouse X") * CameraRotationSpeed; transform.localEulerAngles = new Vector3(-mouseY, mouseX, 0); } } bool IsPointerOverCanvas() { if (EventSystem.current == null) return false; PointerEventData eventData = new PointerEventData(EventSystem.current); eventData.position = Input.mousePosition; var results = new List(); EventSystem.current.RaycastAll(eventData, results); return results.Count > 0; } public void SetCameraInitOffset(Vector3 pos) { m_CameraInitOffset = pos; } float getMouseY(float x) { if (x > 90) { if (x > 270) { //360도 까지만 있다는 전제하에 return (x - 360); } return (180 - (x)); } else if (x < -90) { if (x < -270) { return (x + 360); } return (180 + (x)); } else { return x; } } public void MouseInitialize(Transform CameraTransform) { mouseX = CameraTransform.localEulerAngles.y; mouseY = -getMouseY(CameraTransform.localEulerAngles.x); } public void MouseInitialize() { mouseX = 0; mouseY = 0; } //private void DistanceBasedInteriorDisplay(Vector3 vector) //{ // foreach (TrainInterior interior in ModelTypeManager.Inst.CurrentTrain.TrainInteriors) // { // float distance = Vector3.Distance(vector, interior.CentralAxis.transform.position); // if(distance > m_InteriorDistance) // { // interior.gameObject.SetActive(false); // } else // { // interior.gameObject.SetActive(true); // } // } //} private void CameraInputMove() { Vector3 directionMovePos(Vector3 direction) { return direction * CameraMoveSpeed * Time.deltaTime; } Vector3 movePosition = Vector3.zero; if (Input.GetKey(InputManager.Forward)) movePosition = directionMovePos(transform.forward); if (Input.GetKey(InputManager.Backword)) movePosition = -(directionMovePos(transform.forward)); if (Input.GetKey(InputManager.Right)) movePosition = directionMovePos(transform.right); if (Input.GetKey(InputManager.Left)) movePosition = -(directionMovePos(transform.right)); if (Input.GetKey(InputManager.Up)) movePosition = directionMovePos(transform.up); if (Input.GetKey(InputManager.Down)) movePosition = -(directionMovePos(transform.up)); transform.position += movePosition; if (transform.position.x > m_CameraInitOffset.x + m_CanMoveDistance) { transform.position = new Vector3(transform.position.x - movePosition.x, transform.position.y, transform.position.z); } else if (transform.position.x < m_CameraInitOffset.x - m_CanMoveDistance) { transform.position = new Vector3(transform.position.x - movePosition.x, transform.position.y, transform.position.z); } if (transform.position.y > m_CameraInitOffset.y + m_CanMoveDistance) { transform.position = new Vector3(transform.position.x, transform.position.y - movePosition.y, transform.position.z); } else if (transform.position.y < m_CameraInitOffset.y - m_CanMoveDistance) { transform.position = new Vector3(transform.position.x, transform.position.y - movePosition.y, transform.position.z); } if (transform.position.z > m_CameraInitOffset.z + m_CanMoveDistance) { transform.position = new Vector3(transform.position.x, transform.position.y, transform.position.z - movePosition.z); } else if (transform.position.z < m_CameraInitOffset.z - m_CanMoveDistance) { transform.position = new Vector3(transform.position.x, transform.position.y, transform.position.z - movePosition.z); } } }