환경적 위험 요소는 게임플레이를 형성하는 데 중요한 역할을 합니다. 위험 요소와 함정을 사용하면 플레이어가 다른 결과를 맞이하게 하고 퍼즐이나 레벨을 진행하면서 어려움과 긴장감을 높일 수 있습니다.
이 튜토리얼 시리즈에서는 플레이어에게 대미지를 입힐 수 있는 가시 함정과 화염 함정을 만들어 봅니다. 그런 다음 화염 함정을 연결하고 게임플레이 오브젝트를 전환하여 새로운 게임플레이 메커니즘과 퍼즐을 만듭니다.
이제 플레이어가 대미지를 입어 모든 체력을 잃을 수 있으므로, 게임을 종료했다가 재시작하여 플레이어가 다시 시도할 수 있는 실패 조건도 구성해야 합니다.
시작하기 전에
퍼즐 어드벤처 디자인하기의 이전 섹션에서 다룬 다음 주제를 이해하고 있어야 합니다.
변수, 함수, 이벤트 그래프, 노드 추가 등 블루프린트의 기초
블루프린트 인터페이스 이벤트를 사용하여 다른 게임플레이 오브젝트를 토글하는 스위치 만들기
키 만들기 및 퍼즐: 스위치 및 큐브의 다음과 같은 에셋이 필요합니다.
M_BasicColor머티리얼 및M_BasicColor_Red머티리얼 인스턴스BPI_Interaction블루프린트 인터페이스BP_Switch블루프린트 클래스
관련된 블루프린트 클래스 세트 빌드
이 튜토리얼 시리즈에서는 부모-자손 관계 및 상속을 사용하는 언리얼 엔진 에셋을 살펴봤습니다. 상속이란 기존 부모 클래스의 기능을 재사용하고 확장하는 새 자손 클래스를 생성하는 것을 의미합니다. 자손 클래스는 부모를 변경하지 않고도 이러한 기능을 확장할 수 있습니다. 상속을 사용하면 새 에셋마다 수동으로 추가하는 대신 여러 에셋에서 유용한 기능을 재사용하여 시간을 절약할 수 있습니다.
머티리얼 인스턴스 에셋은 부모 머티리얼에서 기능을 상속받습니다. 많은 블루프린트에서 부모 컴포넌트로부터 트랜스폼 데이터를 상속하는 컴포넌트를 생성해 보았습니다.
게임은 서로 다른 타입의 위험 요소를 사용하지만, 핵심 기능은 동일한 경우가 많습니다. 부모 함정 블루프린트는 이러한 공유 기능을 정의할 수 있으며, 각 자손 함정 블루프린트는 이러한 기능을 확장하여 서로 다른 비주얼과 행동을 추가합니다.
기본(부모) 함정은 플레이어 오버랩을 탐지하고 대미지 게임 메커니즘을 사용하여 시간 경과에 따라 플레이어 체력을 감소시켜야 합니다. 그런 다음, 자손 함정을 생성(또는 서브클래싱)하여 베이스 함정의 기능을 확장하고 비주얼 또는 행동을 추가합니다. 가시 함정은 외형에 부가적인 스태틱 메시를 추가하고, 화염 함정은 화염 이펙트와 행동을 추가하여 켜고 끌 수 있습니다.
레벨은 아직 윤곽 작업 단계이므로 향후 비주얼 디자인에 계속 영향을 미치는 각 함정의 간소화된 버전을 만드는 데 집중하세요.
베이스 함정 블루프린트 생성
먼저 베이스 함정 블루프린트 클래스를 특수 함정의 부모 겸 토대로 생성합니다.
일반적인 함정 기능을 정의하는 블루프린트를 생성하려면 다음 단계를 따릅니다.
콘텐츠 브라우저(Content Browser)에서 콘텐츠(Content) > AdventureGame > Designer > Blueprints 폴더로 이동하여
Traps라는 이름의 새 폴더를 생성합니다.Traps 폴더에서 우클릭하거나 추가(Add)를 클릭하여 새 블루프린트 클래스(Blueprint Class)를 생성합니다.
부모 클래스 선택(Pick Parent Class)창에서 액터(Actor)를 클릭합니다.이 클래스를
BP_TrapBase로 명명하고 엽니다.
컴포넌트 추가
베이스 함정의 경우, 함정의 바운더리를 표시하는 윤곽 작업 스타일 스태틱 메시를 만듭니다. 모든 함정에는 플레이어가 함정을 밟았을 때 이를 알 수 있는 콜리전 볼륨도 필요합니다.
베이스 함정의 물리적 컴포넌트를 생성하려면 다음 단계를 따릅니다.
컴포넌트(Components) 탭에서 추가(Add)를 클릭하고 큐브(Cube) 스태틱 메시 셰이프를 검색하여 추가합니다.
메시 컴포넌트를
TrapBase로 명명합니다.디테일(Details) 패널의 트랜스폼(Transform)에서 큐브의 스케일(Scale)을
2,2,0.1로 변경하여 평평한 사각형 베이스를 생성합니다.컴포넌트(Components) 탭에서 TrapBase를 선택한 상태로 추가를 클릭하고 박스 콜리전(Box Collision) 컴포넌트를 검색하여 선택합니다.
콜리전 컴포넌트를
TrapTrigger로 명명합니다. 플레이어가 함정 위에 서 있을 때 탐지하는 데 사용할 콜리전 볼륨입니다.BP_Switch와 마찬가지로 콜리전 컴포넌트를 메시에 어태치하므로, 함정의 크기를 변경하려는 경우 트리거 영역이 자동으로 조정됩니다.디테일 패널의 트랜스폼에서 다음 프로퍼티를 변경하여 베이스 메시 위에 큰 콜리전 박스를 생성합니다.
위치(Location)를
0,0,400으로 설정합니다.스케일을
1.5,1.5,12로 설정합니다.
변수 추가
모든 함정에는 커스터마이징할 수 있는 다음과 같은 편집 가능 프로퍼티도 필요합니다.
위험 요소가 활성 또는 비활성 상태인지 여부
함정이 플레이어에게 주는 대미지
대미지 간격 또는 공격 사이의 시간입니다.
그리고 함정은 누가 자신과 충돌했는지 알아야 합니다.
베이스 함정에 일반 프로퍼티를 추가하려면 다음 단계를 따릅니다.
내 블루프린트(My Blueprint) 탭에서 다음 변수를 생성합니다.
변수 이름(Variable Name)
타입(Type)
카테고리(Category)
기본값(Default Value)
Active
부울
Setup
True
BaseDamage
플로트
Setup
5.0
DamageInterval
플로트
Setup
1.0
변수를 생성한 후 블루프린트를 컴파일하여 기본값을 추가합니다.
각 변수의 눈 아이콘을 클릭하여 눈이 떠지면, 세 변수는 모두 편집 가능한 퍼블릭 변수가 됩니다.
OtherActor라는 변수를 추가하고 타입을 액터 오브젝트 레퍼런스(Object Reference)로 변경합니다.
대미지를 적용하는 함수 생성
이제 함정에 베이스 프로퍼티가 생겼으니, 함정의 행동을 구현할 수 있습니다. 모든 함정은 플레이어가 콜리전 볼륨과 오버랩될 때 일정한 간격으로 플레이어의 체력(HP)을 낮춰야 합니다.
언리얼 엔진에는 대미지를 적용하고 받는 등 여러 일반적인 게임플레이 메커니즘을 위한 기본 제공 솔루션이 있습니다.
함정의 경우, 기본으로 제공되는 Apply Damage 함수 노드를 사용합니다. 대미지 처리 로직을 구성하기 위해, 함정이 활성화된 경우 함정을 터치하는 모든 캐릭터에 Apply Damage을 호출하는 자체 함수를 생성해야 합니다.
플레이어에게 함정 대미지를 적용하는 함수를 생성하려면 다음 단계를 따릅니다.
함수(Functions) 섹션에서 추가를 클릭합니다. 이 함수를
fnApplyDamageToTargets로 명명하고 그래프를 엽니다.함정이 켜져 있고 활성화된 경우에만 대미지를 적용해야 하므로, Condition이 Active 변수에 대한 레퍼런스(Get)인 Branch 노드를 추가합니다.
이 튜토리얼 후반부에서는 NPC 적들을 추가할 것이므로 많은 액터가 한꺼번에 함정에 있을 수 있습니다. 따라서, 함정이 활성화되면, 해당 함정에 닿는 모든 액터의 배열을 루프합니다.
Branch 노드의 True 핀을 For Each Loop 노드에 연결합니다.
루프의 Array 입력의 경우, 오버랩되는 모든 액터의 배열을 생성해야 합니다. 이 작업은 언리얼 엔진이 대신 수행하여 Get Overlapping Actors (TrapTrigger) 노드를 추가합니다. 이 노드는 TrapTrigger에 대한 레퍼런스를 Target으로 제공합니다.
Get Overlapping Actors 노드에서 플레이어 및 NPC 캐릭터를 배열에 추가할 수 있도록 Class Filter를 캐릭터(Character)로 변경합니다.
각 배열 엘리먼트 또는 루프 반복작업마다 BaseDamage 변수에 설정된 대미지 양을 해당 배열 엘리먼트의 액터에 적용합니다. 이렇게 하려면 Apply Damage 노드를 Loop Body에 연결합니다.
Apply Damage 함수는 언리얼 엔진 게임 스태틱 라이브러리에서 가져옵니다. 오른쪽 상단에 있는 아이콘은 함수가 네트워크 게임에서 사용될 수 있고 서버에서 실행될 수 있음을 의미합니다.
Apply Damage 노드를 다음과 같이 구성합니다.
Damaged Actor 핀의 경우, 루프의 Array Element를 연결합니다.
Base Damage 핀의 경우, BaseDamage 변수에 레퍼런스를 연결합니다.
6. 블루프린트를 저장하고 컴파일(Compile)합니다.
완성된 fnApplyDamageToTarget 함수는 다음과 같습니다.
이 스니펫을 복사하여 프로젝트의 해당 그래프에 붙여넣는 경우, 함수 엔트리 노드를 Branch 노드에 연결합니다.
시간 경과에 따라 대미지를 적용하는 타이머 만들기
다음으로, 함정이 규칙적인 시간 간격으로 대미지 적용 함수를 호출하도록 만들어야 합니다. 이를 위해 언리얼 엔진의 타이머 함수 중 하나를 사용하여 타이머를 생성합니다.
이 블루프린트에서는 Set Timer by Function Name을 사용합니다.
이 노드는 타이머를 생성하고 해당 타이머에 함수를 바인딩하여 타이머가 만료되면 노드가 함수를 호출하고 해당 함수의 모든 액션을 실행하도록 합니다.
게임 시작 시 타이머를 설정하려면 다음 단계를 따릅니다.
BP_TrapBase의 이벤트그래프(EventGraph) 탭으로 이동합니다. 제공된 Event ActorBeginOverlap 및 Event Tick 노드를 삭제합니다.함정이 액션을 수행하기 전에 활성 상태인지 확인해야 합니다. Event BeginPlay 노드에서 Condition이 Active 변수에 대한 레퍼런스인 Branch 노드를 추가합니다.
Branch 노드의 True 핀에서 Set Timer by Function Name 노드를 생성합니다.
타이머 노드를 다음과 같이 구성합니다.
Time 핀의 경우, DamageInterval 변수에 대한 레퍼런스를 연결합니다.
함수 이름(Function Name) 옆의 텍스트 박스를 클릭하고
fnApplyDamageToTarget을 입력합니다.함수 이름의 철자가 올바른지 확인하세요. 그렇지 않으면 로직이 제대로 실행되지 않습니다.
Looping을 활성화합니다.
Set Timer 노드는 타이머의 트래킹 번호 또는 컨트롤러 역할을 하는 Timer Handler라는 반환 값을 출력합니다. 타이머를 중지, 일시정지 또는 재개하려면 이 타이머 핸들을 참조해야 하므로 새 변수에 저장합니다.
내 블루프린트 패널에서
TimerHandler라는 새 변수를 생성합니다. 타입을 타이머 핸들(Timer Handle)로 변경합니다.Set Timer Handler 노드를 추가하고 Set Timer by Event의 반환 값과 실행 핀에 연결합니다.
언리얼 엔진에서 타이머가 생성되면 타이머가 즉시 실행되기 시작하므로 캐릭터가 함정을 밟을 때까지 타이머를 일시정지해야 합니다. Pause Timer by Handle 노드를 연결하고 TimerHandler를 제공합니다.
블루프린트를 저장하고 컴파일(Compile)합니다.
Set Timer by Event 노드를 사용하여 타이머를 생성할 수도 있습니다. 여기서는 노드 액션 목록을 사용하여 Add Custom Event를 생성하고 이를 델리게이트로 사용하여 액션을 타이머에 바인딩합니다.
커스텀 이벤트는 재사용 가능하며 함수와 유사한 명명된 로직 블록입니다. 함수와 달리 딜레이, 타임라인 노드, 기타 레이턴트 액션을 포함할 수 있으므로 게임이 복잡해지면 이 메서드를 사용해야 할 수도 있습니다.
이벤트의 사각형 델리게이트 핀을 연결하여 해당 이벤트의 레퍼런스를 타이머 노드에 전달합니다. 이는 이벤트를 트리거하는 것이 아니라 나중을 위해 이벤트와 해당 액션을 저장합니다(시간 간격이 만료될 때).
대미지 시작 및 중지
대미지 타이머를 만들고 일시정지하여 준비를 마쳤습니다. 이제 캐릭터가 함정의 콜리전 볼륨을 밟으면 대미지가 재개되고, 캐릭터가 볼륨 오버랩을 멈추면 대미지가 일시정지됩니다.
대미지를 시작하는 로직을 추가하려면 다음 단계를 따릅니다.
컴포넌트 패널에서 TrapTrigger 컴포넌트를 우클릭하고 이벤트 추가(Add Event)로 이동하여 OnComponentBeginOverlap 추가(Add OnComponentBeginOverlap)를 선택합니다.
이벤트 뒤에 Set Other Actor 노드를 연결하여 변수에 오버랩되는 액터를 저장합니다.
이벤트와 Set 노드의 Other Actor 핀을 연결합니다.
fnApplyDamageToTarget 노드를 연결하여 캐릭터가 함정을 터치하는 즉시 대미지를 입도록 합니다.
Unpause Timer by Handle 노드를 연결하여 타이머와 대미지 간격을 재개합니다. Handle 입력의 경우, TimerHandler 변수에 대한 레퍼런스를 연결합니다.
시간 경과에 따라 대미지를 멈추는 로직을 추가하려면 다음 단계를 따릅니다.
TrapTrigger 컴포넌트를 우클릭하고 이벤트 추가 > On Component End Overlap으로 이동합니다.
이벤트 뒤에 Pause Timer by Handle 노드를 연결하고, 다시 TimerHandler에 대한 레퍼런스를 제공합니다.
블루프린트를 저장하고 컴파일(Compile)합니다.
이제 함정이 대미지 타이머를 생성, 시작, 일시정지합니다.
완성된 BP_TrapBase 이벤트 그래프는 다음과 같습니다.
타이머 및 타이머 관리에 대한 자세한 내용은 게임플레이 타이머를 참고하세요.
베이스 함정 테스트
함정을 테스트하려면, 함정이 대미지를 적용할 때 화면에 표시되는 Print String 메시지를 추가합니다.
함정이 의도한 대로 작동하고 있다는 메시지를 화면에 출력하려면 다음 단계를 따릅니다.
BP_TrapBase에서 fnApplyDamageToTarget 탭으로 이동합니다.함수의 그래프에서 Print String 노드를 Apply Damage 노드 뒤에 연결합니다.
In String을
Player hit!로 변경합니다.Print String 노드 하단의 화살표를 클릭하여 더 많은 옵션을 표시하고 Duration을
5로 변경합니다. 이를 통해 시간 경과에 따른 대미지 히트를 보다 손쉽게 확인할 수 있습니다.블루프린트를 컴파일하고 저장합니다. 콘텐츠 브라우저에서
BP_TrapBase인스턴스를 레벨로 드래그합니다.레벨을 플레이하고 함정을 밟습니다. 새로운 'Player hit!' 메시지가 매초 표시되어야 합니다.
가시 함정 서브클래싱하기
부모 클래스를 완료했으니, 이제 서브클래싱을 시작할 차례입니다!
먼저 베이스 함정의 외형을 수정하는 가시 함정을 만들어 셰이프 언어를 추가해 보겠습니다. 평범하고 평평한 함정은 위험해 보이지 않지만, 플레이어는 뾰족한 물체가 자신을 다치게 할 수 있다고 해석할 것입니다.
가시 함정을 만들려면 다음 단계를 따릅니다.
콘텐츠 브라우저의 Traps 폴더에서
BP_TrapBase를 우클릭하고 자손 블루프린트 클래스 생성(Create Child Blueprint Class)을 선택합니다.블루프린트 클래스를
BP_TrapSpikes로 명명하고 엽니다.컴포넌트 탭에서 DefaultSceneRoot를 선택한 상태로 추가를 클릭하고 원뿔(Cone)을 검색하여 선택합니다.
원뿔의 크기와 위치를 조정하여 각각 4개의 원뿔이 있는 4개의 행(총 16개)에 맞춥니다.
원뿔의 디테일 패널에 있는 트랜스폼 섹션에서 다음 프로퍼티를 변경합니다.
위치를
-75,-75,25로 변경합니다.스케일을
0.5,0.5,0.4로 변경합니다.
이제 베이스 메시의 구석에 작은 가시가 생겼습니다.
시각적 대비를 위해 머티리얼(Materials) 섹션에서 드롭다운 메뉴를 사용하여 원뿔의 머티리얼을
M_BasicColor_Red로 변경합니다.원뿔을 선택하여 세 번 복제(Ctrl + D)하고, 각 원뿔을 50유닛만큼 이동시켜 베이스 메시의 한 면을 가로질러 일렬로 정렬되도록 합니다.
Ctrl을 길게 누른 상태로 4개의 원뿔을 모두 선택하고 복제합니다. 컴포넌트 패널에서 접미사 숫자가 가장 큰 새 원뿔 4개를 선택하고 50유닛만큼 옮깁니다. 이를 두 번 더 반복하여 4x4 원뿔 그리드를 생성합니다.
가시의 경사와 각도로 인해 플레이어가 함정에서 벗어나기가 곤란할 수 있습니다. 플레이어가 가시 사이로 떨어지지 않게 하려면 가시 상단에 보이지 않는 바닥을 추가합니다.
컴포넌트 탭에서 TrapBase 메시를 복제하고
InvisFloor로 명명합니다.가시의 끝부분만 바닥에서 보이도록 바닥을 위로 이동합니다.
디테일 패널의 콜리전(Collision) 섹션에서 콜리전 프리셋(Collision Presets)이 BlockAllDynamic으로 설정되어 있는지 확인합니다. 모든 액터가 메시를 통과하지 못하도록 차단합니다.
렌더링(Rendering) 섹션에서 표시(Visible)를 비활성화합니다. 그러면 뷰포트에서 메시가 숨겨져 게임플레이 중에 보이지 않습니다.
컴포넌트 탭에서 TrapBase 메시를 선택합니다. 디테일 패널의 렌더링 섹션에서 게임에서 숨김(Hidden in Game)을 활성화합니다. 이렇게 하면 메시가 뷰포트에 계속 표시되지만 게임플레이 중에는 숨겨지므로 가시만 보입니다.
블루프린트를 저장하고 컴파일(Compile)합니다.
가시 함정 서브클래스에는 베이스 함정의 모든 행동이 있으므로 함정이 작동 중일 때 'Player hit!' 메시지가 출력됩니다. BP_TrapSpikes 인스턴스를 레벨로 드래그하여 테스트합니다!
화염 함정 서브클래싱하기
다음으로, 베이스 함정의 행동을 확장하는 함정을 만들어 봅니다. 화염 함정은 플레이어가 스위치로 끌 수 있는 위험 요소를 추가하며, 이는 새로운 퍼즐로 바꿀 수 있는 게임플레이 메커니즘입니다.
퍼즐: 스위치 및 큐브에서는 스위치가 다른 게임플레이 오브젝트를 켜고 끄는 데 사용할 수 있는 BPI_Interaction 블루프린트 인터페이스를 만들었습니다. 또한, 이 인터페이스를 함정 블루프린트에서 사용하여 스위치가 게임플레이 중에 함정의 활성 변수를 변경하도록 할 수도 있습니다.
먼저, 함정이 비활성화되었을 때 사용할 새 머티리얼이 필요합니다.
화염 함정에 사용할 검은색 머티리얼을 만들려면 다음 단계를 따릅니다.
콘텐츠 브라우저에서 AdventureGame > Designer > Materials 폴더로 이동합니다.
M_BasicColor를 우클릭하고 머티리얼 인스턴스 생성(Create Material Instance)을 선택합니다.머티리얼 인스턴스를
M_BasicColor_Black으로 명명하고 엽니다.글로벌 벡터 파라미터 값(Global Vector Parameter Values)을 펼치고 컬러(Color)를 활성화한 다음, 컬러 스와치를 클릭하여 어두운 회색(Hex sRGB =
3D3B3BFF)으로 변경합니다. 순수한 검은색보다 게임 내에서 더 잘 보입니다.머티리얼 인스턴스를 저장하고 닫습니다.
화염 함정을 서브클래싱하려면 다음 단계를 따릅니다.
콘텐츠 브라우저에서
BP_TrapBase를 우클릭하고 자손 블루프린트 클래스 생성을 선택합니다.블루프린트를
BP_TrapFire로 명명하고 엽니다.베이스 메시의 컬러를 변경하여 화염 함정을 나타냅니다. TrapBase 컴포넌트를 선택하고 디테일 패널의 머티리얼 섹션에서 머티리얼을
M_BasicColor_Red로 변경합니다.뷰포트 위에서 클래스 세팅(Class Settings)을 클릭합니다.
디테일 패널의 인터페이스(Interfaces) 섹션에서 구현된 인터페이스(Implemented Interfaces) 옆의 추가를 클릭하고
BPI_Interaction을 검색하여 선택합니다.내 블루프린트 패널에서 fnBPISwitchOff 및 fnBPISwitchOn 이벤트 함수가 인터페이스 섹션에 표시됩니다.
BP_Switch와 마찬가지로 화염 함정에 다음과 같이 커스터마이징 가능한 머티리얼을 구성합니다.내 블루프린트 패널의 변수(Variables) 섹션에서
OffMaterial과OnMaterial이라는 두 개의 변수를 생성합니다.타입을 머티리얼 인터페이스(Material Interface) (오브젝트 레퍼런스)로 변경합니다.
눈 아이콘을 클릭하여 편집 가능한 퍼블릭 변수로 만듭니다.
카테고리를 Setup으로 변경합니다.
다음 기본값을 컴파일하고 설정합니다.
OffMaterial:
M_BaseColor_BlackOnMaterial:
M_BaseColor_Red
블루프린트를 저장 및 컴파일하여 함정의 이벤트 그래프에서 인터페이스 이벤트를 사용할 수 있도록 합니다.
함정의 행동 확장
퍼즐: 이동하는 플랫폼에서 이동하는 플랫폼을 만들 때와 마찬가지로, 스위치가 fnBPISwitchOn 및 fnBPISwitchOff를 호출할 때 다음 액션을 취하도록 함정의 이벤트 그래프를 구성해야 합니다.
함정 활성화 또는 비활성화
함정의 머티리얼 변경
이동하는 플랫폼에서는 플레이어가 스위치를 활성화하면 플랫폼이 이동하기 시작해야 했습니다. 함정의 경우, 그 반대가 필요합니다. 레벨이 시작되면 함정이 활성화되고 플레이어가 스위치를 활성화하면 함정이 꺼집니다.
플레이어가 스위치를 누를 때 화염 함정을 비활성화하는 로직을 추가하려면 다음 단계를 따릅니다.
화염 함정의 이벤트 그래프 탭으로 이동합니다. 내 블루프린트 패널의 인터페이스 목록에서 fnBPIButtonOn을 더블클릭하여 그래프에 이벤트 노드를 추가합니다.
BP_TrapBase변수는 내 블루프린트 패널에 표시되지 않지만, 노드 액션 목록을 통해 액세스할 수 있습니다. Event fnBPISwitchOn 노드의 exec 핀에서 드래그하여active variable를 검색한 다음, Set Active를 선택합니다. Active를 비활성화된 상태로 유지합니다.Set 노드 뒤에 Set Material (TrapBase) 노드를 연결합니다(액션 목록의 렌더링 > 머티리얼 섹션).
Set Material 노드에서 OffMaterial 변수에 대한 레퍼런스를 머티리얼 핀에 연결합니다.
스위치가 비활성화된 경우 화염 함정을 활성화하는 로직을 추가하려면 다음 단계를 따릅니다.
인터페이스 섹션에서 Event fnBPISwitchOff를 더블클릭하여 해당 노드를 추가합니다.
이벤트 이후에 Set Active 변수 노드를 연결하되, 이번에는 Active를 활성화합니다.
Set 노드 뒤에 Set Material (TrapBase) 노드를 연결하고 레퍼런스를 OnMaterial에 연결합니다.
블루프린트를 저장하고 컴파일(Compile)합니다.
완성된 화염 함정 이벤트 그래프는 다음과 같습니다.
레벨에 BP_TrapFire 인스턴스를 추가하고 사용해 보세요!
플레이어 HP로 HUD 업데이트
이제 이러한 Print String 노드를 플레이어에게 실제 피드백으로 대체할 차례입니다. 플레이어의 HP를 실시간으로 보고하도록 HUD를 변경해 보겠습니다.
HUD에 HP 변수 추가
HUD에 다이내믹 플레이어 체력을 추가하려면 다음 단계를 따릅니다.
콘텐츠 브라우저에서
WBP_PlayerHUD위젯 블루프린트를 엽니다. 현재 디자이너 뷰인지 확인합니다.계층구조(Hierarchy)에서 txtHP 위젯을 클릭합니다. 디테일 패널에서 변수 여부(Is Variable)를 활성화하고 텍스트(Text) 프로퍼티에서 100을 삭제합니다.
그래프(Graph) 뷰로 이동하여 txtHP 값을 설정하는 새 함수를 구성합니다.
함수 섹션에서 fnSetHP라는 새 함수를 추가합니다.
함수를 선택한 상태로 디테일 패널에서 입력(Inputs) 옆의 +를 클릭합니다.
입력을
NewHP로 명명하고 타입을 플로트(Float)로 변경합니다.나중에 플레이어 캐릭터가 대미지를 입을 때 이 함수를 호출하도록 변경할 것입니다.
fnSetHP 함수의 그래프에서 함수 엔트리 노드 뒤에 SetText (Text) 노드를 연결합니다.
노드 액션 목록에서 노드를 찾을 수 없는 경우, 컨텍스트에 따라(Context Sensitive)를 비활성화합니다.
SetText (Text) 노드를 다음과 같이 구성합니다.
Target의 경우, 레퍼런스를 txtHP 변수에 연결합니다. 이는 플레이어의 체력을 표시하는 텍스트 위젯입니다.
In Text의 경우, 함수 엔트리 노드의 New HP 입력 핀을 연결합니다. 언리얼 엔진에서 To Text (Float) 노드가 자동으로 추가되어 값을 변환합니다.
위젯 블루프린트를 저장 및 컴파일합니다.
완성된 fnSetHP 함수의 그래프는 다음과 같습니다.
이 블루프린트 스니펫을 그래프에 복사하는 경우, 함수 엔트리 노드를 SetText 및 To Text 노드에 연결해야 합니다.
플레이어의 시작 HP 표시
표시하기 전에 사용 가능한 HUD 변수를 구성합니다. 이 경우 플레이어의 시작 HP를 알 수 있으므로 게임 시작 시 해당 정보를 표시할 수 있습니다.
플레이어 캐릭터 블루프린트가 HUD에 HP를 표시하도록 업데이트하려면 다음 단계를 따릅니다.
콘텐츠 브라우저에서
BP_AdventureCharacter블루프린트를 엽니다. 이벤트 그래프에서 Event Possessed 로직을 찾습니다.내 블루프린트 패널에서 그래프(Graphs) > EventGraph를 펼치고 Event Possessed를 더블클릭하여 그래프에서 포커스를 맞춥니다.
Set 노드와 Add to Viewport 노드 사이에 fnSetHP 노드를 연결합니다.
Target의 경우, Set 노드의 출력 핀을 사용하여 HUD를 타깃으로 만듭니다.
새 New HP의 경우, 레퍼런스를 플레이어의 Health 변수에 연결합니다.
Add to Viewport 노드의 Target 핀이 HUD 변수 노드에도 연결되어 있는지 확인합니다.
내 블루프린트 패널에서 Health 변수를 클릭합니다. 디테일 패널에서 기본값을 변경하거나 유지합니다. 이 튜토리얼에서는 100의 시작 체력을 사용합니다.
저장 및 컴파일합니다.
플레이어의 새 Event Possessed 로직은 다음과 같습니다.
이 로직을 프로젝트에 복사하는 경우, 먼저 기존 Event Possessed 로직 그룹을 삭제합니다.
이제 게임이 시작되면 HUD에 플레이어의 체력이 표시됩니다. 마지막으로 필요한 로직은 플레이어가 대미지를 입었을 때 HUD를 업데이트하는 것입니다. 이렇게 하려면 캐릭터의 기존 대미지 처리 로직이 HUD와 함께 작동하도록 수정해야 합니다.
대미지를 입은 후 플레이어의 HP 업데이트
플레이어의 대미지를 처리하려면 다음 단계를 따릅니다.
BP_AdventureCharacter의 이벤트 그래프 왼쪽 하단에서 'Damage and death handling'이라는 라벨이 지정된 로직 섹션 중 Event AnyDamage 노드로 시작하는 것을 찾습니다. 이 섹션을 수정하여 자체 로직을 대신 실행합니다.Branch 노드 뒤에 오는 모든 노드를 삭제합니다. Branch 노드를 유지합니다.
이 로직 섹션은 오퍼레이터 노드를 사용하여 계산을 수행합니다. 캐릭터가 대미지를 입으면 Event AnyDamage 노드가 트리거되어 입힌 대미지, 대미지 타입, 대미지를 유발한 컨트롤러 및 액터에 대한 정보를 전달합니다. 다음으로, 캐릭터의 Health 변수에서 대미지를 뺍니다. 체력이 차감되면 Branch 노드가 플레이어의 체력이 0에 도달했는지 확인합니다.
여기서는 플레이어의 체력이 0보다 클 때 HUD를 업데이트하는 로직을 빌드하려고 합니다. 따라서 False 핀에서 FnSetHP 노드를 연결하여 새 체력 값을 HUD로 전송합니다.
fnSetHP 노드를 다음과 같이 구성합니다.
Target의 경우, 레퍼런스를 캐릭터의 HUD 변수에 연결합니다.
New HP 입력의 경우, 레퍼런스를 Health 변수에 연결합니다.
블루프린트를 저장하고 컴파일(Compile)합니다.
이제 HUD가 플레이어의 현재 체력을 표시하고 플레이어가 대미지를 입으면 해당 체력 값을 업데이트합니다.
BP_TrapBase 블루프린트로 돌아가 베이스 함정의 이벤트 그래프에 추가한 Print String 노드를 모두 삭제합니다.
게임을 다시 플레이하고 테스트해 보세요!
실패 및 리스폰 조건 생성
플레이어의 체력이 소진되어 처치되면 게임을 중단하고 다시 시도할 기회를 주는 것이 좋습니다. 이 튜토리얼에서는 플레이어의 컨트롤을 비활성화하고, 게임에서 졌음을 플레이어에게 알리고, 레벨을 로드해 봅니다.
먼저, 플레이어에게 처치되었음을 알리는 게임 오버 위젯 블루프린트를 제작해 보겠습니다.
게임 오버 화면 추가
게임 오버 화면의 위젯 블루프린트를 생성하려면 다음 단계를 따릅니다.
콘텐츠 브라우저의 AdventureGame > Designer > Blueprints > Widgets 폴더에서 우클릭하고 유저 인터페이스(User Interface)로 이동하여 위젯 블루프린트(Widget Blueprint)를 선택합니다.
부모 클래스 선택 창에서 사용자 위젯(User Widget)을 클릭합니다.
위젯 블루프린트를
WBP_EliutedScreen으로 명명하고 엽니다.
게임 오버 UI를 구성하려면 다음 단계를 따릅니다.
팔레트(Palette) 탭에서 캔버스(Canvas)를 검색하고 캔버스 패널(Canvas Panel)을 계층구조의 [WBP_EliutedScreen]으로 드래그합니다. HUD와 마찬가지로 캔버스는 루트 위젯입니다.
캔버스에서는 텍스트를 읽기 쉽도록 게임 오버 메시지가 블러 이펙트 위에 레이어링됩니다. 팔레트 탭에서 오버레이(Overlay)를 드래그하여 캔버스의 자손으로 만듭니다.
오버레이를 선택한 상태로 디테일 패널의 슬롯(캔버스 패널 슬롯) 섹션에서 앵커(Anchors)를 펼치고 최대(Maximum) 값(X와 Y)을 모두
1로 변경합니다.앵커 아래의 다른 슬롯 프로퍼티는 오프셋(Offset) 세팅으로 변경됩니다.
HUD를 제작할 때 모든 앵커 포인트를 한쪽 구석에 유지했으므로 화면 크기가 변경되어도 해당 오브젝트는 앵커 포인트에 계속 고정됩니다. 이제 오버레이가 전체 캔버스 바운딩 박스에 고정되었으므로 오버레이가 화면 크기에 맞게 줄어들거나 늘어납니다.
앵커 세팅을 변경하면 에디터에서 오버레이 패널의 디폴트 셰이프를 유지하기 위해 일부 오프셋 값이 변경됩니다. 이를 제거하려면 오프셋 우측(Offset Right) 및 오프셋 하단(Offset Bottom)을
0으로 변경합니다. 이제 화면이 오버레이로 채워집니다.팔레트 탭에서 배경 블러(Background Blur) 위젯을 드래그하여 오버레이 패널의 자손으로 만듭니다.
블러 이펙트를 선택한 상태로 디테일 패널의 슬롯(오버레이 슬롯)(Slot (Overlay Slot)) 섹션에서 다음과 같이 변경합니다.
가로 정렬(Horizontal Alignment) = 가로로 채우기(Fill Horizontal)
세로 정렬(Vertical Alignment) = 세로로 채우기(Fill Vertical)
외형(Appearance) 섹션에서 블러 강도(Blur Strength)를
5로 변경합니다.팔레트 탭에서 텍스트 위젯을 오버레이의 자손으로 추가합니다.
텍스트 위젯을 선택한 상태로 디테일 패널의 슬롯(오버레이 슬롯) 섹션에서 다음과 같이 변경합니다.
가로 정렬 = 가운데 가로 정렬(Center Align Horizontally)
세로 정렬 = 가운데 세로 정렬(Center Align Vertically)
콘텐츠 섹션에서 텍스트를
You are eliminated…restarting the level.로 변경합니다.외형(Appearance) 섹션에서 다음과 같은 프로퍼티를 환경설정하여 텍스트를 더 크고 읽기 쉽게 만듭니다.
컬러 및 오파시티(Color and Opacity) 옆의 컬러 스와치를 클릭하고 텍스트의 컬러를 선택합니다. 이 튜토리얼에서는 분홍색(컬러 Hex sRGB =
FF4D7AFF)을 사용합니다.폰트(Font) 헤더를 펼치고 크기(Size)를
60으로 변경합니다.폰트 > 윤곽선 세팅(Outline Settings)을 펼치고 윤곽선 크기(Outline Size)를
1로 변경합니다.
12. 블루프린트를 저장하고 컴파일(Compile)합니다.
실패 조건에 대한 로직 빌드
이제 게임 오버 화면이 생겼으니, 캐릭터 클래스를 수정하여 플레이어의 체력이 떨어지면 표시되도록 할 수 있습니다. 이 경우 실행은 앞서 작업했던 Branch 노드의 True 결과를 통해 전달됩니다.
플레이어 패배를 처리하려면 다음 작업을 수행해야 합니다.
플레이어가 움직일 수 없도록 플레이어 입력을 비활성화합니다.
게임 오버 화면을 표시합니다.
일정 시간이 지난 후 레벨을 재시작합니다.
플레이어가 처치되었을 때 게임을 중지 및 로드하려면 다음 단계를 따릅니다.
BP_AdventurePlayer에서 캐릭터 블루프린트의 (Event AnyDamage로 시작하는) 대미지 처리 로직으로 돌아갑니다.Branch 노드의 True 실행 핀 뒤에 Do Once 노드와 Disable Input 노드를 연결합니다.
플레이어는 체력이 소진된 후에도 계속 공격을 받을 수 있으므로 Do Once 노드는 이후의 로직이 한 번만 실행되도록 합니다.
Disable Input 노드의 Player Controller 핀에 Get Player Controller 노드를 연결합니다(노드 액션 목록의 게임(Game) > 플레이어(Player) 섹션).
Get Player Controller라는 이름의 노드가 몇 개 있습니다. 노드에 Player Index 입력 핀이 있는지 확인합니다. 인덱스 0은 레벨에 처음으로 스폰된 플레이어 캐릭터의 디폴트 인덱스입니다.
플레이어 컨트롤러를 비활성화한 후, 게임 오버 화면을 생성하고 표시합니다.
Create Widget 노드를 연결합니다. 노드에서 Class를
WBP_EliminatedScreen으로 변경합니다.위젯 노드의 실행 및 Return Value 핀을 Add to Viewport 노드에 연결합니다.
시간 딜레이를 추가하고 현재 레벨 이름을 구한 다음, 해당 레벨을 로드합니다.
Add to Viewport 노드 뒤에 Delay 노드를 연결하고 Duration을
5초로 변경합니다.Delay 뒤에 Get Current Level Name 노드를 연결합니다.
Get Current Level Name 뒤에 Open Level (by Name) 노드를 연결합니다.
Return Value 핀을 Level Name 핀에 연결합니다. 에디터에서 스트링을 이름으로 변환하는 노드가 자동으로 추가됩니다.
블루프린트를 저장 및 컴파일합니다.
이제 이 BP_AdventureCharacter 이벤트 그래프 섹션의 모습은 다음과 같습니다.
이 로직을 프로젝트에 복사하는 경우, 먼저 기존의 대미지 처리 노드 그룹(Event AnyDamage 및 Event Destroyed 로직 포함)을 삭제합니다.
레벨을 플레이하여 테스트해 보세요. 함정을 밟아 캐릭터의 HP를 모두 잃게 하여 게임이 의도한 대로 리셋되도록 합니다.
퍼즐에 위험 요소 추가
퍼즐: 스위치 및 큐브에서는 난이도, 긴장감, 결과, 위험 보상 결정을 추가하는 게임플레이 메커니즘을 디자인하는 방법을 배웠습니다. 플레이어에게 피해를 주는 환경적 위험 요소는 이러한 결과를 초래하는 메커니즘 중 하나입니다. 가시 함정을 사용하면 레벨의 이전 퍼즐과 장애물에 위험과 부가적인 결과를 추가할 수 있으며, 스위치로 작동하는 화염 함정을 사용하면 플레이어가 안전한 경로를 밝혀내기 위해 환경과 상호작용하도록 만드는 보다 다이내믹한 퍼즐을 제작할 수 있습니다.
게임을 디자인할 때 오버헤드를 줄이고 개발 속도를 높이는 핵심 요소는 게임플레이 오브젝트를 사용하고 결합하는 다양한 방법을 찾는 것입니다. 이 튜토리얼 시리즈의 이전 섹션에서 스위치는 플랫폼을 구동하여 앞으로 나아가는 경로를 만들어 주었습니다. 여기서 동일한 스위치로 화염 함정을 비활성화하여 플레이어의 경로를 밝혀낼 수 있습니다. 이렇게 하면 고유한 시스템을 무한히 사용할 필요 없이 레벨에 다양성을 더할 수 있습니다.
이 튜토리얼 시리즈의 앞부분에서 만든 문과 열쇠 게임 메커니즘과 마찬가지로, 화염 함정은 플레이어의 진행 속도와 환경 액세스를 관리하는 또 하나의 메커니즘입니다.
화염 함정으로 미로 퍼즐 만들기
Room 2에서는 스위치와 화염 함정을 조합하여 미로 퍼즐을 만들게 됩니다. 미로 퍼즐에서 플레이어는 마지막 키를 발견하고 수집하기 위해 위험 요소를 조심스럽게 비활성화해야 합니다.
먼저 종이에 퍼즐을 스케치하는 것이 도움이 되기도 합니다. 함정의 크기는 1m x 1m이므로 샘플 Room 2는 7 x 9 그리드의 함정에 맞을 수 있습니다. 키에서 끝나는 그리드에 경로를 그리는 것부터 시작합니다. 그런 다음, 경로를 세그먼트로 분할하고 스위치를 배치하여 각 세그먼트를 제어합니다.
어려움을 더하고 더 많은 발견과 놀라움을 불러일으키려면 시야를 차단하는 건축 구조물을 추가하세요. 예를 들어, 벽이나 기둥 뒤에 스위치를 배치하여 플레이어가 경로를 따라 찾을 수 있도록 합니다.
이 순환 경로를 통해 플레이어는 키를 한눈에 볼 수 있으므로 경로의 첫 번째 세그먼트를 이동하면서 목표를 찾을 수 있습니다.
계획을 마쳤으면 레벨 에디터에서 퍼즐 윤곽 작업을 시작합니다.
키와 새 윤곽 작업 셰이프에 대한 경로를 생성한 다음에는 방의 나머지 부분을 화염 함정으로 채워서 올바른 경로가 보이지 않게 합니다.
아웃라이너(Outliner)에서 레벨 오브젝트의 이름을 변경하여 각 스위치가 제어하는 화염 함정을 구분할 수 있도록 합니다. 예를 들어, BP_Switch1이 3개의 함정을 끄는 경우, BP_FireTrap_S1_0, BP_FireTrap_S1_1, BP_FireTrap_S1_2로 명명합니다. 추가 화염 함정의 이름을 BP_FireTrap_Extra와 같은 이름으로 변경하여 퍼즐의 일부가 아니라는 것을 보여줍니다.
원하는 경우 키 아래에 최종 스위치를 추가하여 플레이어가 퍼즐을 완성할 때 일부 함정을 비활성화하여 탈출하는 데 도움이 될 수 있습니다.
퍼즐을 자주 테스트하면서 시야, 좌절 포인트, 가능한 지름길에 주의를 기울이세요. 친구에게 도움을 요청하면 여러분이 예상하지 못한 허점을 발견할 수도 있습니다. 플레이 테스트 중에 플레이어가 퍼즐의 일부를 건너뛰는 것을 막거나 억제하기 위해 조정이 필요할 수 있습니다.
취약점을 발견한 경우 다음과 같은 몇 가지 옵션을 사용할 수 있습니다.
경로 또는 퍼즐을 재정렬합니다.
더 많은 차단용 구조물을 추가합니다.
화염 대미지를 증가시켜 경로를 벗어나면 더 가혹한 결과를 초래합니다.
취약점은 그대로 두고 대가를 늘리면 플레이어에게 선택권과 자율성이 주어집니다. 안전한 경로를 밝혀내는 데 더 많은 시간을 할애할지, 아니면 키를 향해 돌진하기 위해 체력을 희생할지 선택할 수 있습니다.
샘플 레벨의 퍼즐에서는 플레이어가 키를 볼 수 있지만 바로 건너뛸 수는 없도록 아치형 통로 밑에 돌무더기를 추가했습니다. 또한 스위치를 숨겨서 발견했을 때 보람을 느끼게 할 뿐만 아니라 경로의 해당 부분을 건너뛰는 것을 방지했습니다.
지난 장애물에 가시 추가
지난 퍼즐에 가시를 추가하여 낙하로 인한 결과를 추가해 보겠습니다.
Room 1의 퍼즐부터 시작합니다. 처음 이동하는 플랫폼의 경우, 말뚝을 낮게 유지하여 플레이어가 떨어지면 다시 올라가서 다시 시도할 수 있도록 합니다. 새로운 메커니즘을 소개할 때는 플레이어가 학습에 집중할 수 있도록 안전한 공간에서 학습할 여지를 주어야 합니다.
마찬가지로, Start Room에서 첫 번째 키 아래의 구덩이에 가시를 추가할 수 있습니다. 플레이어는 처음 두 플랫폼에서 점프를 연습하여 키를 향해 더 위험한 마지막 점프를 준비할 수 있습니다. 이제 손상되지 않은 첫 번째 키를 획득하는 것이 조금 더 흥미진진해집니다.
플레이어가 기본 사항을 이해하고 있으며 플랫폼과 스위치에서 블록 이동을 연습했다면 이제 결과를 추가할 차례입니다. 두 번째 플랫폼 또는 세 번째 버튼 아래에 가시 함정을 배치합니다. 이제 플레이어가 떨어지면 대미지를 입기 때문에 긴장감이 올라갔지만, 함정에서 빠르게 벗어나 대미지를 최소화하고 계속 진행할 수 있습니다.
마지막으로, 마지막 플랫폼과 스위치의 경우 위험도를 계속 높입니다. 아래 영역을 가시로 덮으면 가시에서 벗어나기 위해 더 멀리 달려가서 더 많은 대미지를 입게 됩니다. 이 시점에서 플레이어는 메커니즘에 더 능숙해야 하며, 이미 연습했기 때문에 실수로 인한 결과가 더 공정하게 느껴집니다.
이 디자인은 플레이어에게 게임플레이 메커니즘을 소개하기 위해 널리 사용되는 다음과 같은 구조를 따릅니다.
소개(Introduce): 첫 번째 플랫폼에서는 안전한 상황에서 게임 메커니즘을 가르쳐 줍니다.
발전(Develop): 두 번째 플랫폼과 큐브를 통해서는 중간 수준의 위험으로 플레이어의 기술 성장을 테스트합니다.
전환(Twist): 최종 플랫폼은 위험을 높이고 새로운 방향의 이동을 추가하여 메커니즘을 긴장감 넘치는 도전 과제로 만듭니다.
퍼즐: 이동하는 플랫폼의 게임플레이 디자인 강좌에서 배운 것처럼 퍼즐 전반에 걸쳐 결과를 늘리면 공정성과 흥미로움 사이에서 균형을 잡을 수 있습니다.
함정의 대미지 변경
한 가지 함정 타입의 대미지를 높이거나 낮춰서 난이도를 변경할 수 있습니다. 이는 다음과 같은 두 가지 방법 중 하나로 수행할 수 있습니다.
아웃라이너에서 'spike' 또는 'fire'를 검색하고 해당 타입의 함정을 모두 선택합니다. 디테일 패널에서 구성(Setup) > 베이스 대미지(Base Damage)를 원하는 대로 변경합니다. 이 방법을 사용하면 레벨에 추가하는 해당 함정의 새 인스턴스에 대한 베이스 대미지도 변경해야 합니다. 또는 기존 함정을 복제하여 레벨에 새 함정 인스턴스를 추가하면 각각의 새 인스턴스를 편집할 필요가 없습니다.
또는
자손 함정 블루프린트 중 하나를 열고 Construction Script 탭으로 이동합니다. 내 블루프린트 패널에서는 상속된 변수를 편집할 수 없지만, 그래프에서 변수를 설정할 수 있습니다. 두 개의 Construction Script 노드 뒤에 Set Base Damage 노드를 연결합니다. 노드에서 Base Damage 값을 원하는 대로 변경합니다.
플레이어가 게임플레이 오브젝트를 예측할 수 있도록 하려면 한 타입의 모든 함정이 동일한 대미지를 입힐 수 있어야 합니다.
이 튜토리얼의 샘플 레벨에서 화염 함정은 초당 5 대미지를 입히고, 가시 함정 인스턴스는 초당 10 대미지를 입히도록 수정됩니다.
샘플 레벨 사용해 보기
방을 직접 만드는 대신 튜토리얼의 이 파트에서 디자인한 방의 일부를 사용하려면 아래 스니펫을 복사하세요.
Room 2의 윤곽 작업
이 텍스트 스니펫에는 Room 2의 바닥, 벽, 그리고 이 방의 퍼즐을 만들기 위해 추가된 새로운 윤곽 작업 셰이프가 포함되어 있습니다. 아웃라이너에서 모든 셰이프는 Room2 폴더에 있습니다.
Begin Map
Begin Level
Begin Actor Class=/Script/Engine.TextRenderActor Name=TextRenderActor_19 Archetype="/Script/Engine.TextRenderActor'/Script/Engine.Default__TextRenderActor'" ExportPath="/Script/Engine.TextRenderActor'/Game/AdventureGame/Designer/Lvl_Adventure.Lvl_Adventure:PersistentLevel.TextRenderActor_19'"
Begin Object Class=/Script/Engine.TextRenderComponent Name="NewTextRenderComponent" Archetype="/Script/Engine.TextRenderComponent'/Script/Engine.Default__TextRenderActor:NewTextRenderComponent'" ExportPath="/Script/Engine.TextRenderComponent'/Game/AdventureGame/Designer/Lvl_Adventure.Lvl_Adventure:PersistentLevel.TextRenderActor_19.NewTextRenderComponent'"
End Object
Begin Object Class=/Script/Engine.BillboardComponent Name="Sprite" Archetype="/Script/Engine.BillboardComponent'/Script/Engine.Default__TextRenderActor:Sprite'" ExportPath="/Script/Engine.BillboardComponent'/Game/AdventureGame/Designer/Lvl_Adventure.Lvl_Adventure:PersistentLevel.TextRenderActor_19.Sprite'"
End Object
Begin Object Name="NewTextRenderComponent" ExportPath="/Script/Engine.TextRenderComponent'/Game/AdventureGame/Designer/Lvl_Adventure.Lvl_Adventure:PersistentLevel.TextRenderActor_19.NewTextRenderComponent'"
Text=NSLOCTEXT("[3C535F7772EB3B3657484B5E2D5B925D]", "2347F80B407C68C27836E990A20143CF", "Room 2")
HorizontalAlignment=EHTA_Center
Room 2의 모든 윤곽 작업을 복사하려면 다음 단계를 따릅니다.
이미 Room 2에 있는 항목(또는 Hallway 2 끝에 있는 항목)을 제거합니다.
아웃라이너를 사용하여 Room 2의 기존 콘텐츠 선택:
Room2폴더를 우클릭하고 선택(Select) > 직계 자손(Immediate Children)을 선택합니다. Delete를 누릅니다.또는 뷰포트를 상단(Top) 직교 뷰로 전환하여 기존 방을 수동으로 선택하고 삭제합니다.
전체 스니펫 복사하기(Copy Full Snippet)를 클릭합니다.
언리얼 에디터에서 뷰포트가 활성 패널인지 확인한 다음(뷰포트 또는 아웃라이너에서 아무 곳이나 클릭하고 Esc를 누름) Ctrl + V를 누릅니다.
레벨과 아웃라이너의 모습은 다음과 같습니다.
Room 2의 스위치, 함정, 키
이 텍스트 스니펫에는 퍼즐의 스위치, 함정, 빨간색 키가 포함되어 있습니다. 아웃라이너에서 모든 오브젝트는 Room2라는 폴더에 있습니다.
프로젝트 간에 블루프린트 인스턴스를 복사하려면 부모 블루프린트 에셋이 완전히 동일하고 파일 이름 및 위치가 동일해야 합니다. 프로젝트에서 블루프린트의 컴포넌트, 변수 이름 또는 프로퍼티를 변경한 경우, 스니펫이 예상대로 복사되지 않을 수 있으며, 이러한 레벨 오브젝트를 수동으로 구성해야 합니다.
Begin Map
Begin Level
Begin Actor Class=/Game/AdventureGame/Designer/Blueprints/Traps/BP_TrapFire.BP_TrapFire_C Name=BP_FireTrap_C_261 Archetype="/Game/AdventureGame/Designer/Blueprints/Traps/BP_TrapFire.BP_TrapFire_C'/Game/AdventureGame/Designer/Blueprints/Traps/BP_TrapFire.Default__BP_TrapFire_C'" ExportPath="/Game/AdventureGame/Designer/Blueprints/Traps/BP_TrapFire.BP_TrapFire_C'/Game/AdventureGame/Designer/Lvl_Adventure.Lvl_Adventure:PersistentLevel.BP_FireTrap_C_261'"
Begin Object Class=/Script/Engine.SceneComponent Name="DefaultSceneRoot" Archetype="/Script/Engine.SceneComponent'/Game/AdventureGame/Designer/Blueprints/Traps/BP_TrapFire.BP_TrapFire_C:ICH-DefaultSceneRoot_GEN_VARIABLE'" ExportPath="/Script/Engine.SceneComponent'/Game/AdventureGame/Designer/Lvl_Adventure.Lvl_Adventure:PersistentLevel.BP_FireTrap_C_261.DefaultSceneRoot'"
End Object
Begin Object Class=/Script/Engine.StaticMeshComponent Name="TrapBase" Archetype="/Script/Engine.StaticMeshComponent'/Game/AdventureGame/Designer/Blueprints/Traps/BP_TrapFire.BP_TrapFire_C:TrapBase_GEN_VARIABLE'" ExportPath="/Script/Engine.StaticMeshComponent'/Game/AdventureGame/Designer/Lvl_Adventure.Lvl_Adventure:PersistentLevel.BP_FireTrap_C_261.TrapBase'"
End Object
Begin Object Class=/Script/Engine.BoxComponent Name="TrapTrigger" Archetype="/Script/Engine.BoxComponent'/Game/AdventureGame/Designer/Blueprints/Traps/BP_TrapFire.BP_TrapFire_C:TrapTrigger_GEN_VARIABLE'" ExportPath="/Script/Engine.BoxComponent'/Game/AdventureGame/Designer/Lvl_Adventure.Lvl_Adventure:PersistentLevel.BP_FireTrap_C_261.TrapTrigger'"
End Object
Begin Object Name="DefaultSceneRoot" ExportPath="/Script/Engine.SceneComponent'/Game/AdventureGame/Designer/Lvl_Adventure.Lvl_Adventure:PersistentLevel.BP_FireTrap_C_261.DefaultSceneRoot'"
퍼즐의 블루프린트 조각을 구성하려면 다음 단계를 따릅니다.
전체 스니펫 복사하기를 클릭합니다.
언리얼 에디터에서 뷰포트 또는 아웃라이너가 활성 패널인지 확인하고 Ctrl + V를 누릅니다.
각 스위치의 구성 프로퍼티를 확인하고, 필요한 경우 각 스위치를 화염 함정에 다시 연결합니다.
아웃라이너의
Room2폴더에서BP_Switch4를 클릭합니다.디테일 패널의 구성 섹션에서 Interact Object List를 펼칩니다.
목록 내 각 엘리먼트의 드롭다운을 클릭하고
S4를 검색한 다음S4라벨이 지정된 화염 함정 중 하나를 선택합니다.각 스위치에 이 단계를 반복합니다.
BP_Switch5가BP_FireTrap_S5_0-7을 트리거합니다.BP_Switch6이BP_FireTrap_S6_0-3을 트리거합니다.BP_Switch7이BP_FireTrap_S7_0-4를 트리거합니다.BP_Switch8이BP_FireTrap_S8_0-3을 트리거합니다.키 아래의
BP_Switch9가BP_FireTrap_S9_0-4를 트리거합니다.
레벨과 아웃라이너의 모습은 다음과 같습니다.
다음 단계
다음으로, 게임에 또 다른 일반적인 위험 요소인 적 NPC를 추가하는 방법을 알아봅니다! AI 적 캐릭터를 만들고 레벨에 내비게이션 메시를 추가하여 적이 플레이어를 찾아 대미지를 주는 방법을 알아봅니다.