프로그래밍/유니티
유니티 카메라 지터링 안정화 코드
ITJun
2023. 7. 27. 20:35
반응형
using UnityEngine;
using Cinemachine;
public class RoundCameraPos : CinemachineExtension
{
public float PPU = 32;
protected override void PostPipelineStageCallback(
CinemachineVirtualCameraBase vcam,
CinemachineCore.Stage stage,
ref CameraState state,
float deltaTime)
{
// 원하는 로직을 여기에 작성
// 예를 들어, 카메라 스테이트를 조작하거나 처리하는 로직을 구현
// state.Position, state.Orientation 등의 속성을 수정하여 카메라를 원하는 위치와 방향으로 조작.
if(stage == CinemachineCore.Stage.Body)
{
Vector3 pos = state.FinalPosition; // 카메라의 최종 위치를 pos에 저장한다.
Vector3 pos2 = new Vector3(Round(pos.x), Round(pos.y), pos.z); // 얘로 카메라의 좌표를 이동시킴
state.PositionCorrection += pos2 - pos; // 현재 포지션 위치에서 pos2를 더한다 (이동좌표)
// PositionCorrection <-- 최종 위치를 반영하는 코드
}
}
float Round(float x)
{
return Mathf.Round(x*PPU) / PPU;
}
}
인스펙터 창에서 PPU 단위를 낮추면 옛날 게임 처럼 카메라가 이동할 때 버버버버버벅 끊기고, 최대 PPU인 32로 지정하면 스무스 하게 이동한다.
protected override void PostPipelineStageCallback(
CinemachineVirtualCameraBase vcam,
CinemachineCore.Stage stage,
ref CameraState state,
float deltaTime)
{
이 공간에 코드를 입력한다.
}
if(stage == CinemachineCore.Stage.Body)
{
Vector3 pos = state.FinalPosition; // 카메라의 최종 위치를 pos에 저장한다.
Vector3 pos2 = new Vector3(Round(pos.x), Round(pos.y), pos.z); // 얘로 카메라의 좌표를 이동시킴
state.PositionCorrection += pos2 - pos; // 현재 포지션 위치에서 pos2를 더한다 (이동좌표)
// PositionCorrection <-- 최종 위치를 반영하는 코드
pos에 현재 카메라의 최종 위치를 저장하고 pos2에 이동하는 좌표 값을 저장한다. 그리고 이동좌표인 state.PositionCorrection에 pos2의 값 (이동한 좌표 값)에서 pos값 (카메라의 마지막 좌표값)을 빼서 이동 거리를 구한다.
이동 위치 x : 15 y 20 [pos2] / 현재 위치 x:500 y:500 [pos] --> 이동하는 값 만큼 + 또는 - 되며 최종 위치 PositionCorrection에 반영한다.
}
float Round(float x)
{
return Mathf.Round(x*PPU) / PPU;
반올림을 해주는 함수
}
반응형