OldBlueWater/BlueWater/Assets/02.Scripts/CameraController.cs
2023-09-18 14:06:11 +09:00

113 lines
3.7 KiB
C#

using System;
using Cinemachine;
using Sirenix.OdinInspector;
using UnityEngine;
using UnityEngine.InputSystem;
// ReSharper disable once CheckNamespace
namespace BlueWaterProject
{
public class CameraController : MonoBehaviour
{
public Camera MainCam { get; private set; }
[Title("Dredge Cam")]
[Required("드렛지 카메라를 넣어주세요.")]
public CinemachineVirtualCamera dredgeCam;
private CinemachineOrbitalTransposer dredgeCamOrbitalTransposer;
[Range(0,1000)]
public int rotateSpeed = 10;
[Required("습격모드 카메라를 넣어주세요.")]
public CinemachineVirtualCamera assaultCam;
[Required("보트내부 카메라를 넣어주세요.")]
public CinemachineVirtualCamera inShipCam;
[Required("조준 카메라를 넣어주세요.")]
public CinemachineFreeLook takeAimCam;
public float sensitivity = 0.01f;
[MinMaxSlider(2, 50, true)]
public Vector2 heightLimits = new Vector2(2, 50);
private void Awake()
{
MainCam = Camera.main;
}
private void Start()
{
dredgeCamOrbitalTransposer = dredgeCam.GetCinemachineComponent<CinemachineOrbitalTransposer>();
}
private void Update()
{
TakeCamMovement();
DredgeCamRotate();
}
public void CamAssaultMode()
{
assaultCam.Priority = 1;
dredgeCam.Priority = 0;
inShipCam.Priority = 0;
}
public void CamDredgeMode()
{
dredgeCam.Priority = 1;
assaultCam.Priority = 0;
inShipCam.Priority = 0;
}
public void CamInShipMode()
{
inShipCam.Priority = 1;
dredgeCam.Priority = 0;
assaultCam.Priority = 0;
}
private void TakeCamMovement()
{
Vector2 mouseDelta = Mouse.current.delta.ReadValue();
Vector3 newPosition = takeAimCam.transform.position;
newPosition.y += mouseDelta.y * sensitivity;
newPosition.y = Mathf.Clamp(newPosition.y, heightLimits.x, heightLimits.y);
newPosition.x = GameManager.Inst.player.transform.position.x;
newPosition.z = GameManager.Inst.player.transform.position.z;
takeAimCam.transform.position = newPosition;
// Rotate around Y axis (Up direction)
takeAimCam.transform.RotateAround(takeAimCam.transform.position, Vector3.up, mouseDelta.x * sensitivity);
}
public void CamTakeAim(bool isTakeAim)
{
takeAimCam.Priority = isTakeAim ? 2 : 0;
float yRotation = dredgeCam.transform.rotation.eulerAngles.y;
takeAimCam.transform.rotation =
Quaternion.Euler(takeAimCam.transform.rotation.eulerAngles.x, yRotation, takeAimCam.transform.rotation.eulerAngles.z);
}
public void DredgeCamRotate()
{
if (Input.GetMouseButtonDown(1))
{
//dredgeCam의 X Axis의 Speed를 변경
dredgeCamOrbitalTransposer.m_XAxis.m_MaxSpeed = rotateSpeed;
dredgeCamOrbitalTransposer.m_XAxis.m_InputAxisName = "Mouse X";
dredgeCamOrbitalTransposer.m_RecenterToTargetHeading.m_enabled = false;
}
else if (Input.GetMouseButtonUp(1))
{
//dredgeCam의 X Axis의 Speed를 원래대로
dredgeCamOrbitalTransposer.m_XAxis.m_MaxSpeed = 0;
dredgeCamOrbitalTransposer.m_XAxis.m_InputAxisName = "";
dredgeCamOrbitalTransposer.m_RecenterToTargetHeading.m_enabled = true;
}
}
}
}