OldBlueWater/BlueWater/Assets/02.Scripts/CameraManager.cs

188 lines
6.2 KiB
C#
Raw Normal View History

2023-09-18 05:06:11 +00:00
using System;
using System.Collections;
2023-08-08 07:08:41 +00:00
using Cinemachine;
using Sirenix.OdinInspector;
using UnityEngine;
using UnityEngine.InputSystem;
using UnityEngine.Serialization;
2023-08-08 07:08:41 +00:00
2023-08-31 06:46:13 +00:00
// ReSharper disable once CheckNamespace
namespace BlueWaterProject
2023-08-08 07:08:41 +00:00
{
public class CameraManager : Singleton<CameraManager>
2023-08-31 06:46:13 +00:00
{
2023-09-18 05:06:11 +00:00
public Camera MainCam { get; private set; }
2023-08-31 06:46:13 +00:00
[Title("Dredge Cam")]
[Required("드렛지 카메라를 넣어주세요.")]
public CinemachineVirtualCamera dredgeCam;
private CinemachineOrbitalTransposer dredgeCamOrbitalTransposer;
[Range(0,1000)]
public int rotateSpeed = 10;
private Coroutine currentCoroutine;
[Required("보트갑판 카메라를 넣어주세요.")]
public CinemachineVirtualCamera shipDeckCam;
2023-08-08 07:08:41 +00:00
2023-08-31 06:46:13 +00:00
[Required("조준 카메라를 넣어주세요.")]
public CinemachineFreeLook takeAimCam;
[Required("보트안 카메라를 넣어주세요.")]
public CinemachineVirtualCamera inShipCam;
2023-08-31 06:46:13 +00:00
public float sensitivity = 0.01f;
2023-08-31 06:46:13 +00:00
[MinMaxSlider(2, 50, true)]
public Vector2 heightLimits = new Vector2(2, 50);
2023-10-24 02:29:50 +00:00
[Title("InShip Change Offset")]
private Vector3 targetOffset;
private Vector3 startingOffset;
private float elapsedTime = 0;
private float duration = 0.5f;
private bool isTransitioning = false;
2023-10-24 02:29:50 +00:00
protected override void OnAwake()
2023-09-18 05:06:11 +00:00
{
MainCam = Camera.main;
}
2023-08-31 06:46:13 +00:00
private void Start()
{
dredgeCamOrbitalTransposer = dredgeCam.GetCinemachineComponent<CinemachineOrbitalTransposer>();
}
2023-08-31 06:46:13 +00:00
private void Update()
{
TakeCamMovement();
DredgeCamRotate();
}
private void FixedUpdate()
{
if (isTransitioning)
{
SmoothTransitionFixedUpdate();
}
}
2023-08-31 06:46:13 +00:00
public void CamAssaultMode()
{
dredgeCam.Priority = 0;
shipDeckCam.Priority = 0;
2023-09-18 05:06:11 +00:00
inShipCam.Priority = 0;
2023-08-31 06:46:13 +00:00
}
2023-08-08 07:08:41 +00:00
2023-08-31 06:46:13 +00:00
public void CamDredgeMode()
{
dredgeCam.Priority = 1;
shipDeckCam.Priority = 0;
2023-09-18 05:06:11 +00:00
inShipCam.Priority = 0;
2023-08-31 06:46:13 +00:00
}
2023-08-11 16:21:26 +00:00
public void CamShipDeckMode()
{
shipDeckCam.Priority = 1;
dredgeCam.Priority = 0;
inShipCam.Priority = 0;
}
2023-08-31 06:46:13 +00:00
public void CamInShipMode()
{
2023-09-18 05:06:11 +00:00
inShipCam.Priority = 1;
2023-08-31 06:46:13 +00:00
dredgeCam.Priority = 0;
shipDeckCam.Priority = 0;
2023-08-31 06:46:13 +00:00
}
2023-08-31 06:46:13 +00:00
private void TakeCamMovement()
{
var mouseDelta = Mouse.current.delta.ReadValue();
var newPosition = takeAimCam.transform.position;
2023-08-31 06:46:13 +00:00
newPosition.y += mouseDelta.y * sensitivity;
newPosition.y = Mathf.Clamp(newPosition.y, heightLimits.x, heightLimits.y);
2023-10-23 03:12:13 +00:00
newPosition.x = GameManager.Inst.ShipPlayer.transform.position.x;
newPosition.z = GameManager.Inst.ShipPlayer.transform.position.z;
2023-08-31 06:46:13 +00:00
takeAimCam.transform.position = newPosition;
2023-08-31 06:46:13 +00:00
// Rotate around Y axis (Up direction)
takeAimCam.transform.RotateAround(takeAimCam.transform.position, Vector3.up, mouseDelta.x * sensitivity);
}
2023-08-31 06:46:13 +00:00
public void CamTakeAim(bool isTakeAim)
{
2023-08-31 06:46:13 +00:00
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);
}
2023-08-31 06:46:13 +00:00
2023-09-19 16:58:52 +00:00
private void DredgeCamRotate()
{
2023-08-31 06:46:13 +00:00
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;
}
}
2023-09-19 16:58:52 +00:00
private void StartSmoothTransition(Vector3 newTargetOffset)
{
targetOffset = newTargetOffset;
var transposer = inShipCam.GetCinemachineComponent<CinemachineTransposer>();
if (transposer != null)
{
startingOffset = transposer.m_FollowOffset;
}
elapsedTime = 0;
isTransitioning = true;
}
private void SmoothTransitionFixedUpdate()
{
var transposer = inShipCam.GetCinemachineComponent<CinemachineTransposer>();
if (transposer != null)
{
if (elapsedTime < duration)
{
elapsedTime += Time.fixedDeltaTime;
float t = elapsedTime / duration;
transposer.m_FollowOffset = Vector3.Lerp(startingOffset, targetOffset, t);
}
else
{
transposer.m_FollowOffset = targetOffset;
isTransitioning = false;
}
}
}
2023-10-23 03:12:13 +00:00
public void ChangeInShipFollowAndLookAt(Transform target)
{
if (!GameManager.Inst.IsInShipMode) return;
inShipCam.Follow = target;
inShipCam.LookAt = target;
2023-10-24 02:29:50 +00:00
var targetOffset = new Vector3(0, 9, -10);
StartSmoothTransition(targetOffset);
2023-10-23 03:12:13 +00:00
}
public void RestoreInShipFollowAndLookAt()
{
if (!GameManager.Inst.IsInShipMode) return;
var transform1 = GameManager.Inst.InShipPlayer.transform;
inShipCam.Follow = transform1;
inShipCam.LookAt = transform1;
2023-10-24 02:29:50 +00:00
var targetOffset = new Vector3(0, 20, -10);
StartSmoothTransition(targetOffset);
2023-10-23 03:12:13 +00:00
}
}
}