[UE5] 플레이어 아웃라인 효과 구현

연하·2024년 7월 16일
0

Trapper

목록 보기
23/32
post-thumbnail

게임 플레이 중, 팀원 플레이어의 가시성이 떨어져 팀원 플레이어가 어디있는지 찾기 힘든 상황이 생겼다. 따라서 아웃라인 처리와 함께 추가적인 UI가 새로 기획에 추가되었고, 오늘은 아웃라인을 작업하기로 했다.

기존 자성 기둥에 아웃라인 효과가 있으므로 똑같이 적용만 하면 될거라고 생각했지만, 아웃라인 굵기와 색상을 따로 지정해줘야하고 자성기둥과 달리 플레이어는 다른 액터들이 플레이어를 가리더라도 아웃라인이 표시되어야 했다.

아웃라인 굵기, 색상 설정하기

스탠실 값을 사용하여 아웃라인의 설정을 바꿔주기로 했다.

먼저 프로젝트 세팅에서 Enabled with Stencil로 옵션을 바꿔주고, Mesh의 CustomDepth Stencil Value를 설정해주었다.

if (IsLocallyControlled())
{
	GetMesh()->SetRenderCustomDepth(false);
}

플레이어는 2, 자성기둥은 0으로 설정한 뒤, 플레이어의 BeginPlay 함수에서 로컬플레이어만 RenderCustomDepth 설정을 false로 바꿔주자.

커스텀 스텐실 값은 SceneTexture의 CustomStencil을 선택해 R값으로 마스킹하여 가져올 수 있다. Named Reroutes(이름 경유) 노드를 만들어 어디서든 꺼내쓰기 쉽게끔 만들어주자.

기존 아웃라인의 굵기를 설정하는 곳을 If문을 사용해 이렇게 바꿔주었다. 스텐실 값이 1보다 크다면 자성기둥의 굵기 변수를 사용하도록 하고, 1보다 작다면 캐릭터의 굵기 변수를 사용하도록 했다.

마찬가지로 굵기와 같은 로직을 사용하여 자성 기둥에는 빨간색, 캐릭터는 파란색이 보이도록 해주었다. A==B 에 연결된 Scene Texture 노드는 곧 설명하도록 하겠음!

그럼 스텐실 값에 따라 이렇게 다른 색상과 굵기를 가질 수 있게 된다.

물체 뒤에서도 아웃라인 보이게 하기

우리 게임에서 자성 기둥은 다른 물체에 가렸을 때 아웃라인이 보이지 않아야 하지만, 플레이어는 벽 뒤에 있어도 아웃라인이 보여야 한다. 위의 gif를 보면 자성기둥과 같이 앞의 물체에 의해 가려지는 것을 볼 수 있음.

기존에 사용하고 있던 씬 뎁스와 커스텀 뎁스를 사용해 앞에 물체가 있으면 아웃라인을 그리지 않는 부분을 Occulusion이라는 이름 경유 노드로 만들어 준 뒤,

스탠실 값에 따라 처리되도록 만들어주었다.

이렇게 물체 뒤에서도 잘 보이게 됐다.

로컬 플레이어는 아웃라인이 뚫지 못하게 만들기

뭔가 술술 잘 풀린다고 생각했지만.. (내 기준)치명적인 문제가 하나 있었다.

로컬 플레이어를 뚫고 그려버린다는 것.... 몬스터나 물체를 뚫는거야 기획상에서 당연히 해야되는 것이었지만.. 어떤 게임에서 캐릭터를 저렇게 처리할까?

어떤 물체에 가려졌을 때만 뜬다면 굳이 처리할 필요 없겠지만, 아웃라인이 '항상' 떠있도록 요청하셨기에 무조건 잡아야한다고 생각했다.

이것때문에 장장 몇시간을 서칭했는데도 별다른 방법을 찾지 못했다. 이것저것 따라해보고 방법도 고민해보고 하다가, 아까 로컬플레이어를 SetRenderCustomDepth(false) 로 바꿔줬던걸 이것저것 건들여보는김에 이걸 true로 켜봤다.

흠.... 상대방 아웃라인이 안뚫리네?? 그럼 커스텀 뎁스를 켜둔 상태에서 아웃라인을 안그리면 되지 않을까...?

if (IsLocallyControlled())
{
	GetMesh()->SetCustomDepthStencilValue(1);
}

플레이어의 BeginPlay에서 로컬 플레이어만 스텐실 값을 1로 바꿔주고,

스텐실 값이 1일 경우에는 씬 텍스쳐를 그대로 그리도록 넣어줬다.

엇... 이게 되네...??? 생각보다 꽤 잘 되길래 놀랬다.

기획 / 아트분들께 전달

아무래도 이부분은 아트와 기획쪽에서 건들여보고 값을 지정하는게 좋을 것 같아서, 외부에서 접근해 굵기와 색상을 바꿀 수 있도록 해두고 전달드렸다 :)

0개의 댓글