Files
BABA_YAGA/Assets/Scripts/Camera Controller/CameraController.cs
2026-03-27 12:08:16 +07:00

83 lines
3.6 KiB
C#

using UnityEngine;
namespace OnlyScove.Scripts
{
public class CameraController : MonoBehaviour
{
[SerializeField] InputReader inputReader;
[SerializeField] Transform followTarget;
[SerializeField] float positionSmoothTime = 0.12f;
[SerializeField] float rotationSmoothTime = 5f;
[SerializeField] Vector2 framingOffset;
[Header("Components")]
[SerializeField] private CameraRotationHandler rotationHandler = new CameraRotationHandler();
[SerializeField] private CameraZoomHandler zoomHandler = new CameraZoomHandler();
[SerializeField] private CameraCollisionHandler collisionHandler = new CameraCollisionHandler();
[SerializeField] private CameraOcclusionTransparency occlusionTransparency = new CameraOcclusionTransparency();
[SerializeField] private CameraDynamicFOV dynamicFOV = new CameraDynamicFOV();
[SerializeField] private CameraCharacterFading characterFading = new CameraCharacterFading();
[SerializeField] private CameraSideBias sideBias = new CameraSideBias();
[SerializeField] private CameraShakeManager shakeManager = new CameraShakeManager();
private Vector3 _currentVelocity;
private Camera _cam;
private void Start()
{
_cam = GetComponent<Camera>();
Cursor.visible = false;
Cursor.lockState = CursorLockMode.Locked;
rotationHandler.Initialize(transform);
}
private void Update()
{
// Handle Input-related updates first
if (inputReader != null)
{
rotationHandler.HandleRotation(inputReader, followTarget, rotationSmoothTime);
zoomHandler.HandleZoom(inputReader);
sideBias.HandleSideBias(inputReader);
dynamicFOV.HandleDynamicFOV(_cam, inputReader);
}
// Update camera rotation
transform.rotation = rotationHandler.CurrentRotation;
// Calculate focus position with framing offset and side bias
Vector3 focusPosition = followTarget.position + rotationHandler.CurrentRotation * new Vector3(framingOffset.x + sideBias.CurrentSideBias, framingOffset.y, 0);
// Handle collision
float targetDistance = collisionHandler.CheckCollision(focusPosition, rotationHandler.CurrentRotation, zoomHandler.CurrentDistance, zoomHandler.MinDistance);
// Handle character fading
characterFading.HandleCharacterFading(targetDistance);
// Calculate target position
Vector3 targetPosition = focusPosition - rotationHandler.CurrentRotation * new Vector3(0, 0, targetDistance);
// Handle camera shake
shakeManager.HandleShake();
// Apply final position and rotation
transform.position = Vector3.SmoothDamp(transform.position, targetPosition, ref _currentVelocity, positionSmoothTime) + shakeManager.ShakeOffset;
// Handle occlusion transparency (needs camera's final position and rotation)
occlusionTransparency.HandleTransparency(transform, focusPosition);
}
public void Shake(float intensity, float duration)
{
shakeManager.Shake(intensity, duration);
}
public void TriggerFallImpactShake(float fallHeight)
{
shakeManager.TriggerFallImpactShake(fallHeight);
}
public Quaternion PlanarRotation => rotationHandler.PlanarRotation;
}
}