프로그래밍/유니티

유니티 카메라 지터링 안정화 코드

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;
      반올림을 해주는 함수
   
    }
 
반응형