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>& Vertices
과 const TArray<int32>& Triangles
변수만 신경쓰면 된다.
메시는 기본적으로 삼각형의 집합이므로
Vertices
에 정점을, Triangles
에 어떤 정점들이 모여서 삼각형을 이루는지의 정보를 전달한다.
그리고 이 삼각형들의 집합으로 캐릭터의 시야를 표현하는 부채꼴모양 메시를 만들 것이다.
그리고 메시는 카메라에 보이는 면만 렌더링하기 때문에(연산 최적화) UE에서는 반시계 방향으로 그려야 한다. (Unity에선 시계방향이었음)
즉 위 그림과 같은 메시를 만드려면 Vertices
와 Triangles
는 다음과 같다.
각 앵글마다 LineTrace로 장애물이 있는지 확인하면서 폴리곤을 만들면 되는데, 여기서는 장애물용 Trace를 따로 추가했다.
방금 추가한 ObstacleTrace
를 GetWorld()->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