CapersProject/Assets/02.Scripts/TycoonCameraManager.cs

202 lines
5.9 KiB
C#
Raw Normal View History

2024-08-14 10:52:35 +00:00
using System;
using System.Collections.Generic;
using Sirenix.OdinInspector;
using Unity.Cinemachine;
using UnityEngine;
2024-11-05 08:26:26 +00:00
using UnityEngine.Serialization;
namespace BlueWater
{
2024-08-14 10:52:35 +00:00
public enum TycoonCameraType
{
Base = 0,
2024-09-24 10:35:49 +00:00
Storage
2024-08-14 10:52:35 +00:00
}
public class TycoonCameraManager : Singleton<TycoonCameraManager>
{
// Components
#region Components
[Title("카메라")]
2024-08-14 10:52:35 +00:00
[field: SerializeField]
public Camera MainCamera { get; private set; }
2024-10-06 23:41:09 +00:00
[field: SerializeField]
public Camera UiCamera { get; private set; }
2024-09-26 11:50:39 +00:00
[field: SerializeField]
public Camera LiquidOverlayCamera { get; private set; }
[SerializeField]
2024-08-14 10:52:35 +00:00
private Transform cameraLocation;
[field: SerializeField]
public CinemachineCamera BaseCamera { get; private set; }
2024-08-14 10:52:35 +00:00
[field: SerializeField]
2024-09-24 10:35:49 +00:00
public CinemachineCamera StorageCamera { get; private set; }
2024-09-26 11:50:39 +00:00
2024-11-05 08:26:26 +00:00
[SerializeField]
private Transform _confinerCollider;
2024-09-26 11:50:39 +00:00
[SerializeField]
private Vector3 _transparencySortAxis;
2024-11-05 08:26:26 +00:00
[Title("줌")]
[SerializeField]
private Vector2 _cameraDistance = new(5f, 10f);
[SerializeField, Range(0.01f, 1f)]
private float _zoomPower = 0.5f;
[SerializeField, Range(1f, 10f)]
private float _zoomLerpSpeed = 5f;
[SerializeField]
private Vector3 _zoomOutConfinerScale = new(1f, 1f, 0f);
[SerializeField]
private Vector3 _zoomInConfinerScale = new(10f, 10f, 10f);
// Variables
2024-08-14 10:52:35 +00:00
private CinemachineBrain _cinemachineBrain;
2024-11-05 08:26:26 +00:00
private CinemachinePositionComposer _baseCameraComposer;
2024-08-14 10:52:35 +00:00
private List<CinemachineCamera> _cinemachineCameras = new();
2024-11-05 08:26:26 +00:00
private float _targetCameraDistance;
#endregion
// Unity events
#region Unity events
2024-10-14 11:13:08 +00:00
private void OnValidate()
{
SetTransparencySortAxis();
}
protected override void OnAwake()
{
Initialize();
}
private void Start()
{
2024-11-05 08:26:26 +00:00
_targetCameraDistance = _baseCameraComposer.CameraDistance;
EventManager.OnCameraZoomOut += ZoomOut;
EventManager.OnCameraZoomIn += ZoomIn;
if (!GameManager.Instance) return;
GameManager.Instance.OnInstantiatePlayer += SetFollow;
}
2024-11-05 08:26:26 +00:00
private void LateUpdate()
{
var lerpTime = Time.deltaTime * _zoomLerpSpeed;
_baseCameraComposer.CameraDistance = Mathf.Lerp(
_baseCameraComposer.CameraDistance,
_targetCameraDistance,
lerpTime
);
var normalizedT = (_baseCameraComposer.CameraDistance - _cameraDistance.x) / (_cameraDistance.y - _cameraDistance.x);
_confinerCollider.localScale = Vector3.Lerp(
_zoomInConfinerScale,
_zoomOutConfinerScale,
normalizedT
);
}
private void OnDestroy()
{
2024-11-05 08:26:26 +00:00
EventManager.OnCameraZoomOut -= ZoomOut;
EventManager.OnCameraZoomIn -= ZoomIn;
if (!GameManager.Instance) return;
GameManager.Instance.OnInstantiatePlayer -= SetFollow;
}
#endregion
// Initialize methods
#region Initialize methods
[Button("셋팅 초기화")]
private void Initialize()
{
2024-08-14 10:52:35 +00:00
cameraLocation = GameObject.Find("CinemachineCameras").transform;
MainCamera = GetComponent<Camera>();
2024-10-06 23:41:09 +00:00
UiCamera = MainCamera.transform.Find("UiCamera").GetComponent<Camera>();
LiquidOverlayCamera = GameObject.Find("LiquidOverlayCamera").GetComponent<Camera>();
2024-08-14 10:52:35 +00:00
_cinemachineBrain = GetComponent<CinemachineBrain>();
2024-08-14 10:52:35 +00:00
BaseCamera = cameraLocation.Find("BaseCamera").GetComponent<CinemachineCamera>();
2024-09-24 10:35:49 +00:00
StorageCamera = cameraLocation.Find("StorageCamera").GetComponent<CinemachineCamera>();
2024-11-05 08:26:26 +00:00
_baseCameraComposer = BaseCamera.GetComponent<CinemachinePositionComposer>();
2024-08-14 10:52:35 +00:00
_cinemachineCameras.Add(BaseCamera);
2024-09-24 10:35:49 +00:00
_cinemachineCameras.Add(StorageCamera);
2024-08-14 10:52:35 +00:00
SetMainCamera(TycoonCameraType.Base);
}
#endregion
// Methods
#region Methods
public void SetFollow(Transform target)
{
BaseCamera.Follow = target;
}
2024-09-23 10:18:47 +00:00
public void SetMainCamera(TycoonCameraType tycoonCameraType)
2024-08-14 10:52:35 +00:00
{
var newMainCamera = tycoonCameraType switch
{
TycoonCameraType.Base => BaseCamera,
2024-09-24 10:35:49 +00:00
TycoonCameraType.Storage => StorageCamera,
2024-08-14 10:52:35 +00:00
_ => throw new ArgumentOutOfRangeException(nameof(tycoonCameraType), tycoonCameraType, null)
};
foreach (var element in _cinemachineCameras)
{
element.Priority = 0;
}
2024-11-05 08:26:26 +00:00
2024-08-14 10:52:35 +00:00
newMainCamera.Priority = 1;
2024-09-26 11:50:39 +00:00
SetTransparencySortAxis();
}
private void SetTransparencySortAxis()
{
var camera = Camera.main;
camera.transparencySortMode = TransparencySortMode.CustomAxis;
camera.transparencySortAxis = _transparencySortAxis;
2024-08-14 10:52:35 +00:00
}
2024-11-05 08:26:26 +00:00
public void ZoomOut(float value)
{
_targetCameraDistance = Mathf.Min(
_targetCameraDistance + value * _zoomPower,
_cameraDistance.y
);
}
2024-10-22 12:41:31 +00:00
2024-11-05 08:26:26 +00:00
public void ZoomIn(float value)
2024-10-22 12:41:31 +00:00
{
2024-11-05 08:26:26 +00:00
_targetCameraDistance = Mathf.Max(
_targetCameraDistance - value * _zoomPower,
_cameraDistance.x
);
2024-10-22 12:41:31 +00:00
}
2024-11-05 08:26:26 +00:00
#endregion
}
}