이번 포스팅은 #11-1 유니티 시네머신(Cinemachine)으로 플레이어 추적하기, #11-2 유니티 시네머신(Cinemachine) 제한자의 마무리 포스팅입니다.
#11-1 유니티 시네머신(Cinemachine)으로 플레이어 추적하기 포스트 링크입니다.
#11-2 유니티 시네머신(Cinemachine) 제한자 포스트 링크입니다.
시네머신 제한자 안정화, 테어링, 나무 및 바위 오브젝트에 콜라이더 추가, 물리 모형 수정하는 작업에 관하여 포스팅하겠습니다.
포스팅은 유니티 2D 게임 개발(게임 개발 프로그래밍)에 나온 예제로 진행합니다.
안정화
가상카메라가 천천히 멈출때 Jittering(지터링) 현상이 느껴질 수 있습니다.
지터링현상은 지나치게 정밀한 카메라 좌표가 정밀한 계산을 할때 발생하는 약간의 화면의 떨림입니다.
이러한 지터링 현상을 제거해주는 스크립트를 만들도록 하겠습니다.
RoundCameraPos(C#) 라는 이름으로 스크립트를 만들고 CM vcam1 가상 카메라 오브젝트에 추가하였습니다.
RoundCameraPos(C#) 전체 스크립트 입니다.
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)
{
if(stage == CinemachineCore.Stage.Body)
{
Vector3 pos = state.FinalPosition;
Vector3 pos2 = new Vector3(Round(pos.x), Round(pos.y), pos.z);
state.PositionCorrection += pos2 - pos;
}
}
float Round(float x)
{
return Mathf.Round(x * PPU) / PPU;
}
}
다음은 코드의 설명입니다.
using Cinemachine;
public class RoundCameraPos : CinemachineExtension{}
Cinemachine 프레임워크를 임포트하여 시네머신 가상 카메라에 확장 컴포넌트를 만듭니다.
CinemachineExtension을 상속해야시네머신의 프로세싱 파이프라인을 사용할 수 있습니다.
protected override void PostPipelineStageCallback(CinemachineVirtualCameraBase vcam, CinemachineCore.Stage stage, ref CameraState state, float deltaTime)
{
if(stage == CinemachineCore.Stage.Body)
{
Vector3 pos = state.FinalPosition;
Vector3 pos2 = new Vector3(Round(pos.x), Round(pos.y), pos.z);
state.PositionCorrection += pos2 - pos;
}
}
PostpipelineStageCallback()메서드는 CinemachineExtension 클래스를 상속한 클래스라면 반드시 구현해야 하는 메서드 입니다.
if()문은 현재 카메라의 포스트 프로세싱 단계가 "Body" 단계인지 확인합니다.
"Body"단계인지 확인하였다면 가상카메라에 최종 위치를 얻습니다.
Round() 메서드를 호출하여 위치를 반올림하고, 반올림한 결과로 새로운 벡터를 생성합니다.
이 새롭게 생성된 벡터가 새로운 픽셀 단위 위치입니다.
state.PositionCorrection += pos2 - pos; 는 원래 위치와 반올림한 위치의 차이를 가상카메라의 위치에 반영합니다.
float Round(float x)
{
return Mathf.Round(x * PPU) / PPU;
}
입력값을 반올림하는 Round() 메서드 입니다.
Tearing(테어링)현상을 해결해보도록하겠습니다.
테어링현상은 타일과 타일 사이가 엇갈리는 현상입니다.
이 현상은 타일이 픽셀 단위로 정확하게 딱 들어맞지 않기 때문에 등장합니다.
머터리얼 오브젝트를 사용하겠습니다.
Project창에서 머터리얼을 저장한 Materials 폴더를 생성하였습니다.
앞으로 만들어진 머터리얼을 이 폴더에 저장하도록 하겠습니다.
만드는 방법은 간단합니다.
1. Materials 폴더 > Create >Material 선택하여 머터리얼을 생성합니다.
2. 새로운 머터리얼의 이름을 Sprite2D로 바꾸어줍니다.
3. Inspector창에서 머터리얼의 속성을 사진과 같이 변경해줍니다.
Shader : Sprites/Default
Pixel snap : 체크
Hierarchy창 > Grid 오브젝트의 자식 오브젝트를 모두 선택 > Inspector창에서 Tilemap Renderer > Material > 방금 만든 Sprite2D를 선택합니다.
오브젝트 콜라이더 추가, 물리 모형 수정
나무 및 바위가 있는 오브젝트를 그린 Layer_Tree_and_Rocks 오브젝트를 선택합니다.
Inspector창에서 Tilemap Collider 2D, Composite Collider 2D 컴포넌트를 추가합니다.
자동으로 추가된 Rigidbody 2D의 Body Type을 Static(정적)으로 변경해줍니다.
게임을 실행시켜 보면 나무 및 바위 오브젝트에 플레이가 통과하지 못하게 됩니다.
재생 버튼을 눌러 게임을 실행시켜 보면 플레이어와 바위오브젝트 사이에 공간이 있음에도 더이상 나아가지 못하는 것을 볼 수 있습니다.
이것은 바위의 콜라이더가 바위 모양과 딱 맞지 않아서 그렇습니다.
플레이어 오브젝트 또한 Box Collider 2D의 콜라이더의 크기가 플레이어의 모양보다 크기 때문에 조절을 해주어야 합니다.
해당 포스팅을 참고 하시면 콜라이더의 크기를 조절할 수 있습니다.
바위의 콜라이더를 바위 모양과 맞추기 위하여 스프라이트의 물리모형을 수정하겠습니다.
1. 바위 모양의 스프라이트가 있는 OutdoorsObjects 스프라이트 시트를 선택합니다.
2. Inspector창에서 Spirte Editor를 선택하여 Sprite Editor창을 엽니다.
1. Sprite Editor 창에 왼쪽 상단에 드롭 다운 메뉴에서 Custom Physics Shape 변경합니다.
2. 무리 모형을 수정해야 하는 스프라이트를 클릭합니다.
3. Generate를 클릭하고 하얀색 테두리를 스프라이트 모양에 맞게 수정합니다.
수정을 다했으면 반드시 Apply(적용) 버튼을 눌러 줍니다.
해당 타일맵 오브젝트를 선택하고 Tilemap Collider 2D 컴포넌트에서 Reset(초기화)를 눌러줍니다.
마지막으로 Ctrl + S를 눌러 Scene을 저장합니다!
감사합니다! :)
'유니티2D' 카테고리의 다른 글
#13-1 유니티 아이템 줍기(써클 콜라이더) (0) | 2020.12.10 |
---|---|
#12 유니티 기초 종합, 클래스 구현 (0) | 2020.12.08 |
#11-2 유니티 시네머신(Cinemachine) 제한자 (2) | 2020.12.05 |
#11-1 유니티 시네머신(Cinemachine)으로 플레이어 추적하기 (0) | 2020.12.04 |
#10 유니티 그래픽, 카메라 (0) | 2020.12.03 |