2023-09-18 05:06:11 +00:00
|
|
|
using System;
|
2023-10-18 02:36:56 +00:00
|
|
|
using System.Collections;
|
2023-08-08 07:08:41 +00:00
|
|
|
using Cinemachine;
|
|
|
|
using Sirenix.OdinInspector;
|
|
|
|
using UnityEngine;
|
2023-08-22 05:31:24 +00:00
|
|
|
using UnityEngine.InputSystem;
|
2023-10-18 02:36:56 +00:00
|
|
|
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
|
|
|
{
|
2023-10-23 03:32:29 +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;
|
2023-10-18 02:36:56 +00:00
|
|
|
private Coroutine currentCoroutine;
|
2023-08-22 05:31:24 +00:00
|
|
|
|
2023-10-18 02:36:56 +00:00
|
|
|
[Required("보트갑판 카메라를 넣어주세요.")]
|
|
|
|
public CinemachineVirtualCamera shipDeckCam;
|
2023-08-08 07:08:41 +00:00
|
|
|
|
2023-08-31 06:46:13 +00:00
|
|
|
[Required("조준 카메라를 넣어주세요.")]
|
|
|
|
public CinemachineFreeLook takeAimCam;
|
2023-10-18 02:36:56 +00:00
|
|
|
|
|
|
|
[Required("보트안 카메라를 넣어주세요.")]
|
|
|
|
public CinemachineVirtualCamera inShipCam;
|
2023-11-20 19:46:47 +00:00
|
|
|
private Vector3 inShipCamOrigenalOffset;
|
2023-11-29 02:39:46 +00:00
|
|
|
private Vector3 inShipCamOrigenalAimOffset;
|
2023-08-22 05:31:24 +00:00
|
|
|
|
2023-08-31 06:46:13 +00:00
|
|
|
public float sensitivity = 0.01f;
|
2023-08-22 05:31:24 +00:00
|
|
|
|
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
|
|
|
|
2023-10-26 08:52:06 +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-11-20 19:46:47 +00:00
|
|
|
inShipCamOrigenalOffset = inShipCam.GetCinemachineComponent<CinemachineTransposer>().m_FollowOffset;
|
2023-11-29 02:39:46 +00:00
|
|
|
inShipCamOrigenalAimOffset = inShipCam.GetCinemachineComponent<CinemachineComposer>().m_TrackedObjectOffset;
|
2023-09-18 05:06:11 +00:00
|
|
|
}
|
|
|
|
|
2023-08-31 06:46:13 +00:00
|
|
|
private void Start()
|
|
|
|
{
|
|
|
|
dredgeCamOrbitalTransposer = dredgeCam.GetCinemachineComponent<CinemachineOrbitalTransposer>();
|
|
|
|
}
|
2023-08-22 05:31:24 +00:00
|
|
|
|
2023-08-31 06:46:13 +00:00
|
|
|
private void Update()
|
|
|
|
{
|
|
|
|
TakeCamMovement();
|
|
|
|
DredgeCamRotate();
|
|
|
|
}
|
2023-08-22 05:31:24 +00:00
|
|
|
|
2023-10-26 08:52:06 +00:00
|
|
|
private void FixedUpdate()
|
|
|
|
{
|
|
|
|
if (isTransitioning)
|
|
|
|
{
|
|
|
|
SmoothTransitionFixedUpdate();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2023-08-31 06:46:13 +00:00
|
|
|
public void CamAssaultMode()
|
|
|
|
{
|
|
|
|
dredgeCam.Priority = 0;
|
2023-10-18 02:36:56 +00:00
|
|
|
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;
|
2023-10-18 02:36:56 +00:00
|
|
|
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
|
|
|
|
2023-10-18 02:36:56 +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;
|
2023-10-18 02:36:56 +00:00
|
|
|
shipDeckCam.Priority = 0;
|
2023-08-31 06:46:13 +00:00
|
|
|
}
|
2023-08-22 05:31:24 +00:00
|
|
|
|
2023-08-31 06:46:13 +00:00
|
|
|
private void TakeCamMovement()
|
|
|
|
{
|
2023-10-26 08:52:06 +00:00
|
|
|
var mouseDelta = Mouse.current.delta.ReadValue();
|
2023-08-22 05:31:24 +00:00
|
|
|
|
2023-10-26 08:52:06 +00:00
|
|
|
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-22 05:31:24 +00:00
|
|
|
|
|
|
|
|
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-22 05:31:24 +00:00
|
|
|
|
2023-08-31 06:46:13 +00:00
|
|
|
public void CamTakeAim(bool isTakeAim)
|
2023-08-22 05:31:24 +00:00
|
|
|
{
|
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-22 05:31:24 +00:00
|
|
|
}
|
2023-08-31 06:46:13 +00:00
|
|
|
|
2023-09-19 16:58:52 +00:00
|
|
|
private void DredgeCamRotate()
|
2023-08-22 05:31:24 +00:00
|
|
|
{
|
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-08-22 05:31:24 +00:00
|
|
|
}
|
2023-09-19 16:58:52 +00:00
|
|
|
|
2023-10-26 08:52:06 +00:00
|
|
|
private void StartSmoothTransition(Vector3 newTargetOffset)
|
2023-10-18 02:36:56 +00:00
|
|
|
{
|
2023-10-26 08:52:06 +00:00
|
|
|
targetOffset = newTargetOffset;
|
|
|
|
var transposer = inShipCam.GetCinemachineComponent<CinemachineTransposer>();
|
|
|
|
if (transposer != null)
|
2023-10-18 02:36:56 +00:00
|
|
|
{
|
2023-10-26 08:52:06 +00:00
|
|
|
startingOffset = transposer.m_FollowOffset;
|
2023-10-18 02:36:56 +00:00
|
|
|
}
|
2023-10-26 08:52:06 +00:00
|
|
|
elapsedTime = 0;
|
|
|
|
isTransitioning = true;
|
2023-10-18 02:36:56 +00:00
|
|
|
}
|
|
|
|
|
2023-10-26 08:52:06 +00:00
|
|
|
private void SmoothTransitionFixedUpdate()
|
2023-10-18 02:36:56 +00:00
|
|
|
{
|
|
|
|
var transposer = inShipCam.GetCinemachineComponent<CinemachineTransposer>();
|
|
|
|
if (transposer != null)
|
|
|
|
{
|
2023-10-26 08:52:06 +00:00
|
|
|
if (elapsedTime < duration)
|
|
|
|
{
|
|
|
|
elapsedTime += Time.fixedDeltaTime;
|
|
|
|
float t = elapsedTime / duration;
|
|
|
|
transposer.m_FollowOffset = Vector3.Lerp(startingOffset, targetOffset, t);
|
|
|
|
}
|
|
|
|
else
|
2023-10-18 02:36:56 +00:00
|
|
|
{
|
2023-10-26 08:52:06 +00:00
|
|
|
transposer.m_FollowOffset = targetOffset;
|
|
|
|
isTransitioning = false;
|
2023-10-18 02:36:56 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2023-10-23 03:12:13 +00:00
|
|
|
|
2023-11-29 02:39:46 +00:00
|
|
|
public void SetInShipCamTrackedObjectOffset(Vector3 newOffset)
|
|
|
|
{
|
|
|
|
var aimComponent = inShipCam.GetCinemachineComponent<CinemachineComposer>();
|
|
|
|
if (aimComponent != null)
|
|
|
|
{
|
|
|
|
aimComponent.m_TrackedObjectOffset = newOffset;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
public void ChangeInShipFollowAndLookAt(Transform npc)
|
2023-10-23 03:12:13 +00:00
|
|
|
{
|
|
|
|
if (!GameManager.Inst.IsInShipMode) return;
|
2023-11-29 02:39:46 +00:00
|
|
|
|
|
|
|
inShipCam.Follow = npc;
|
|
|
|
inShipCam.LookAt = npc;
|
|
|
|
|
|
|
|
var followOffset = new Vector3(0, 6, -10);
|
|
|
|
StartSmoothTransition(followOffset);
|
|
|
|
|
|
|
|
var newAimOffset = new Vector3(0, 2, 0);
|
|
|
|
SetInShipCamTrackedObjectOffset(newAimOffset);
|
2023-10-23 03:12:13 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
public void RestoreInShipFollowAndLookAt()
|
|
|
|
{
|
|
|
|
if (!GameManager.Inst.IsInShipMode) return;
|
2023-11-29 02:39:46 +00:00
|
|
|
var player = GameManager.Inst.InShipPlayer.transform;
|
|
|
|
inShipCam.Follow = player;
|
|
|
|
inShipCam.LookAt = player;
|
|
|
|
var followOffset = inShipCamOrigenalOffset;
|
|
|
|
var aimOffset = inShipCamOrigenalAimOffset;
|
|
|
|
StartSmoothTransition(followOffset);
|
|
|
|
SetInShipCamTrackedObjectOffset(aimOffset);
|
2023-10-23 03:12:13 +00:00
|
|
|
}
|
2023-08-22 05:31:24 +00:00
|
|
|
}
|
|
|
|
}
|