|
using System.Collections.Generic;
|
using System.Runtime.CompilerServices;
|
using UnityEngine;
|
using UnityEngine.EventSystems;
|
using UnityEngine.InputSystem;
|
using UnityEngine.InputSystem.Controls;
|
|
|
public class MoveCamera : Singleton<MoveCamera>
|
{
|
/// <summary>
|
/// 카메라 시점 변경 속도
|
/// </summary>
|
public float CameraRotationSpeed = 4;
|
///// <summary>
|
///// 마우스 휠 줌 속도
|
///// </summary>
|
//public float ZoomSpeewd = 5000.0f;
|
///// <summary>
|
///// 줌 최솟값, 작을 수록 확대할 수 있는 수치가 커짐
|
///// </summary>
|
//public float MinZoomValue = 10;
|
///// <summary>
|
///// 줌 최대값, 클 수록 축소할 수 있는 수치가 커짐
|
///// </summary>
|
//public float MaxZoomValue = 60;
|
/// <summary>
|
/// 카메라 이동 속도
|
/// </summary>
|
[Range(1f, 10f)]
|
public float CameraMoveSpeed = 4;
|
|
|
|
/// <summary>
|
/// 마우스를 움직였을때의 x,y 좌표값
|
/// </summary>
|
[SerializeField]
|
float mouseY = 0;
|
[SerializeField]
|
float mouseX = 0;
|
//bool mouseOverCanvas = false;
|
|
/// <summary>
|
/// 마우스 왼쪽버튼 클릭에 대한 컨트롤
|
/// </summary>
|
private ButtonControl mouseLeftButton;
|
|
|
[SerializeField]
|
private float m_CanMoveDistance = 3f;
|
|
|
[SerializeField]
|
/// <summary>
|
/// 포인트 이동 시 초기 위치 값 저장
|
/// </summary>
|
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<RaycastResult>();
|
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);
|
}
|
|
|
|
}
|
}
|