05. 시야 연출 - Elysia-ff/UE4-Custom_Stencil_Tutorial GitHub Wiki

기본 로직

캐릭터의 시야가 닿는 부분만 밝게 렌더링되는 연출을 하려면 커스텀 메시를 생성해서 메시와 겹치는 부분을 검출하면 된다.

UE에서 커스텀 메시를 생성할땐 UProceduralMeshComponent를 사용한다.

void CreateMeshSection_LinearColor(int32 SectionIndex, const TArray<FVector>& Vertices, const TArray<int32>& Triangles, const TArray<FVector>& Normals, const TArray<FVector2D>& UV0, const TArray<FLinearColor>& VertexColors, const TArray<FProcMeshTangent>& Tangents, bool bCreateCollision);

를 호출하면 되는데 지금 단계에선 const TArray<FVector>& Verticesconst TArray<int32>& Triangles 변수만 신경쓰면 된다.

메시는 기본적으로 삼각형의 집합이므로
Vertices에 정점을, Triangles에 어떤 정점들이 모여서 삼각형을 이루는지의 정보를 전달한다.
그리고 이 삼각형들의 집합으로 캐릭터의 시야를 표현하는 부채꼴모양 메시를 만들 것이다.
image

그리고 메시는 카메라에 보이는 면만 렌더링하기 때문에(연산 최적화) UE에서는 반시계 방향으로 그려야 한다. (Unity에선 시계방향이었음)
즉 위 그림과 같은 메시를 만드려면 VerticesTriangles는 다음과 같다.
image


사전 설정

각 앵글마다 LineTrace로 장애물이 있는지 확인하면서 폴리곤을 만들면 되는데, 여기서는 장애물용 Trace를 따로 추가했다.
image
image
image

방금 추가한 ObstacleTraceGetWorld()->LineTraceSingleByChannel에 인자로 전달하면 되는데 이 정보는 /Config/DefaultEngine.ini에 저장된다.

+DefaultChannelResponses=(Channel=ECC_GameTraceChannel1,DefaultResponse=ECR_Ignore,bTraceType=True,bStaticObject=False,Name="ObstacleTrace")

ECC_GameTraceChannel1를 전달하면 되는 것

하지만 트레이스가 많아지면 알아보기 힘들기에 래퍼를 만들었다.

#define ECC_ObstacleTrace ECC_GameTraceChannel1

이제 ECC_GameTraceChannel1 대신 ECC_ObstacleTrace를 전달하면 똑같이 동작한다.


완성된 코드

/StealthTypes.hpp
// Copyright 2021. Elysia-ff

#pragma once

#include "CoreMinimal.h"

#define ECC_ObstacleTrace ECC_GameTraceChannel1
⚠️ **GitHub.com Fallback** ⚠️