ReplayPuzzleGame/Assets/Resources/Scripts/Utility/CameraEffect.cs
qoralstmd6825 ebabe72e56 버그 픽스
애니메이션 스프라이트 이상하게 나오는 부분 수정, 물에 빠졌을때 3초간 리플레이 기능 사용 가능하게 변경
2026-02-25 16:02:21 +09:00

112 lines
3.0 KiB
C#

using System;
using System.Collections;
using UnityEngine;
using UnityEngine.Rendering.Universal;
using UnityEngine.U2D;
public class CameraEffect : MonoBehaviour
{
private Camera _camera;
private PixelPerfectCamera _ppc;
private Transform target;
[SerializeField] float smoothTime = 0.3f;
[SerializeField] private float lookDownAmount = 4f;
[SerializeField] private float lookUpAmount = 4f;
[SerializeField] private Vector3 offset = new Vector3(0, 0, -10f);
private float defaultYOffset;
private Vector3 _velocity = Vector3.zero;
private void Start()
{
defaultYOffset = offset.y;
_camera = GetComponent<Camera>();
_ppc = GetComponent<PixelPerfectCamera>();
GameObject player = GameObject.FindGameObjectWithTag("Player");
if (player != null)
{
target = player.transform;
}
}
private void LateUpdate()
{
if (target == null) return;
Vector3 targetPosition = target.position + offset;
transform.position = Vector3.SmoothDamp(transform.position, targetPosition, ref _velocity, smoothTime);
}
public void SetTarget(Transform target)
{
this.target = target;
}
public void SetCameraLook(bool isUp, bool isDown)
{
if (isUp)
{
offset.y = defaultYOffset + lookUpAmount;
}
else if (isDown)
{
offset.y = defaultYOffset - lookDownAmount;
}
else
{
offset.y = defaultYOffset;
}
}
public async void ZoomUpPlayer(float zoomAmount, float time)
{
if (_ppc == null) return;
_ppc.enabled = false;
float startSize = _camera.orthographicSize;
float timer = 0f;
while (timer < time)
{
timer += Time.deltaTime;
float t = timer / time;
_camera.orthographicSize = Mathf.Lerp(startSize, zoomAmount, t);
await Awaitable.NextFrameAsync();
}
_camera.orthographicSize = zoomAmount;
int targetResY = Mathf.RoundToInt(zoomAmount * 2 * _ppc.assetsPPU);
int targetResX = Mathf.RoundToInt(targetResY * (16f / 9f));
_ppc.refResolutionX = targetResX;
_ppc.refResolutionY = targetResY;
_ppc.enabled = true;
}
public void PlayPreViewSequence(Action onComplete)
{
StartCoroutine(PreviewSequence(onComplete));
}
public IEnumerator PreviewSequence(Action onComplete)
{
Transform player = GameObject.FindGameObjectWithTag("Player")?.transform;
if (player != null) target = player;
yield return new WaitForSeconds(2f);
GameObject cheese = GameObject.FindGameObjectWithTag("Cheese");
if (cheese != null)
{
target = cheese.transform;
yield return new WaitForSeconds(2f);
}
if (player != null) target = player;
yield return new WaitForSeconds(1f);
onComplete?.Invoke();
}
}