이 섹션에서는 플레이어 캐릭터에 발소리를 추가하여 레벨을 돌아다닐 때의 현실감을 높입니다. 플레이어가 걷는 표면 타입에 따라 서로 다른 사운드를 생성하기 위해 사운드 큐를 사용합니다.
표면 타입을 나타내기 위해 피지컬 머티리얼을 생성합니다. 예를 들어 금속 위를 걸을 때의 소리는 석재 위를 걸을 때와 달라야 합니다.또한 표면과 사운드 정보를 저장하는 커스텀 데이터 에셋을 생성합니다. 데이터 에셋을 사용하면 블루프린트 코드를 수정하지 않고도 향후 더 많은 표면 타입과 사운드를 손쉽게 추가할 수 있습니다.
마지막으로, 게임에 이미 포함된 블루프린트 함수 라이브러리인 BPL_FPGame에 함수를 생성합니다. 이 함수는 탐지된 표면 타입에 따라 적절한 사운드 이펙트를 반환하는 데이터 에셋 내부의 함수를 호출합니다.
시작하기 전에
퍼즐 어드벤처 게임을 위한 아트 패스 및 신규 사용자를 위한 언리얼 엔진의 이전 섹션에서 다룬 다음 주제를 충분히 이해하고 있어야 합니다.
사운드 큐 및 사운드 어테뉴에이션 에셋 생성하기
변수 및 함수 생성, 노드 생성 및 연결을 포함한 블루프린트 기초
샘플 프로젝트 및 콘텐츠 팩에서 다음과 같은 에셋을 사용합니다.
S_Metal-1 사운드 웨이브
S_Metal-2 사운드 웨이브
S_Metal-3 사운드 웨이브
S_Stone-1 사운드 웨이브
S_Stone-2 사운드 웨이브
S_Stone-3 사운드 웨이브
S_DefaultStep-1 사운드 웨이브
S_DefaultStep-2 사운드 웨이브
S_DefaultStep-3 사운드 웨이브
BPL_FPGame 블루프린트 함수 라이브러리
BP_AdventureCharacter 블루프린트
ABP_Unarmed 애니메이션 블루프린트
발소리가 있는 사운드 큐 생성
먼저 금속 표면의 발소리와 석재 표면의 발소리를 위한 두 개의 사운드 큐를 생성합니다.
사운드 큐를 생성하려면 다음 단계를 따릅니다.
콘텐츠 브라우저에서 AdventureGame > Artist > Audio로 이동합니다.
Audio 폴더에서 우클릭하고 새 폴더(New Folder)를 선택한 다음 이름을 Footsteps로 명명합니다.
Footsteps 폴더에서 우클릭한 다음 오디오(Audio) > 사운드 큐를 선택합니다. 이름을 SC_Footsteps_Metal로 명명하고 엽니다. 이 에셋에는 이미 Output 노드가 있으며, 연결된 노드에 따라 사운드를 재생합니다.
그래프의 아무 위치나 우클릭하고 Wave Player 노드를 추가합니다.
Wave Player 노드를 선택한 다음 왼쪽 패널에서 사운드 웨이브(Sound Wave)를 S_Metal-1로 변경합니다.
Wave Player 노드를 두 개 더 추가한 다음, 동일한 방법으로 S_Metal-2 및 S_Metal-3 사운드 웨이브 파일을 선택합니다. 이러한 파일은 프로젝트 구성 및 콘텐츠 임포트에서 임포트한 것입니다.
그래프에서 우클릭한 다음 Random 노드를 추가합니다. Random 노드에서 입력 추가(Add input)를 한 번 클릭하여 세 번째 입력을 추가합니다.
각 Wave Player 노드를 Random 노드의 핀에 연결합니다.
Random 노드를 Output 노드에 연결합니다.
사운드 큐를 저장합니다.
다음으로는, 석재 표면에서 발소리를 랜덤 재생하는 사운드 큐 에셋과 디폴트 발소리를 위한 사운드 큐 에셋을 각각 생성해 보겠습니다.
SC_Footsteps_Stone이라는 이름의 사운드 큐 에셋을 생성합니다.
Wave Player 노드에는 S_Stone-1, S_Stone-2, S_Stone-3 오디오 에셋(프로젝트 구성 및 콘텐츠 임포트에서 임포트)을 사용합니다.
SC_Footsteps_Default라는 이름의 사운드 큐 에셋을 생성합니다.
Wave Player 노드에는 S_Default-1, S_Default-2, S_Default-3 오디오 에셋을 사용합니다.
피지컬 머티리얼 생성
이제 사운드 큐를 생성했으므로, 각 표면 타입을 나타내기 위해 두 개의 피지컬 머티리얼을 생성합니다. 나중에 발소리를 이 피지컬 머티리얼과 매칭하게 됩니다.
피지컬 머티리얼은 오브젝트가 월드와 동적으로 인터랙션할 때의 물리적인 반응을 정의하는 데 사용됩니다. 이러한 머티리얼은 게임플레이 동안 서로 다른 표면 타입을 식별하는 데에도 사용됩니다.
예를 들어 이 튜토리얼에서는 금속과 석재 표면을 나타내기 위해 PM_Metal과 PM_Stone이라는 피지컬 머티리얼을 생성합니다. 그런 다음, 플레이어가 어떤 표면 위를 걷고 있는지 확인하고 해당 정보에 따라 사운드 큐를 재생합니다.
피지컬 머티리얼을 생성하려면 다음 단계를 따릅니다.
콘텐츠 브라우저에서 AdventureGame > Artist > Materials 폴더로 이동합니다.
Materials 폴더에서 우클릭하고 피직스(Physics)로 이동하여 피지컬 머티리얼(Physical Material)을 선택합니다.
피지컬 머티리얼 클래스 선택(Pick Physical Material Class) 창에서 PhysicalMaterial을 선택하고 '선택(Select)'을 클릭합니다.
이 에셋의 이름을 PM_Metal로 명명합니다.
PM_Stone이라는 피지컬 머티리얼을 하나 더 생성합니다.
피지컬 머티리얼은 마찰과 같은 다양한 표면 세팅을 변경할 수 있는 데이터 에셋입니다. 이러한 피지컬 머티리얼의 경우, 에셋 자체에서 프로퍼티를 수정할 필요는 없습니다. 이러한 에셋을 서로 다른 머티리얼에 할당하여 각 머티리얼의 표면 타입을 변경합니다.
데이터 에셋 블루프린트 클래스로 발소리 할당
다음으로는, 발소리를 저장할 새로운 블루프린트 데이터 에셋 클래스를 생성하고, 오브젝트의 머티리얼에 할당된 피지컬 머티리얼을 기반으로 적절한 발소리를 반환하는 함수를 생성해 보겠습니다.
발소리를 제어하기 위한 블루프린트 데이터 에셋을 구성하려면 다음 단계를 따릅니다.
콘텐츠 브라우저에서 AdventureGame > Artist > Audio > Footsteps 폴더로 이동합니다.
우클릭하고 블루프린트 클래스(Blueprint Class)를 생성합니다.
부모 클래스 선택(Pick Parent Class) 창에서 모든 클래스(All Classes) 드롭다운을 펼친 다음 PrimaryDataAsset을 검색하여 선택합니다.
이 에셋의 이름을 BP_DA_FootSteps로 명명하고 엽니다.
내 블루프린트 패널에서 새 변수를 추가합니다.
이름을 FootStepSounds로 명명합니다.
해당 변수를 선택하고 디테일 패널에서 다음과 같이 설정합니다.
변수 타입(Variable Type)을 피지컬 머티리얼(오브젝트 레퍼런스)(Physical Material (Object Reference))로 변경합니다.
컨테이너(Container)를 맵(Map)으로 변경합니다.
맵 값 타입(Map Value Type)을 사운드 큐(오브젝트 레퍼런스)(Sound Cue (Object Reference))로 변경합니다.
디폴트 변수 타입은 부울입니다. 부울 타입은 매핑할 수 없으므로, 변수 타입을 먼저 변경하지 않으면 맵 컨테이너 옵션이 표시되지 않습니다.
변수를 하나 더 추가합니다.
이름을 DefaultFootSteps로 명명합니다.
타입을 사운드 큐로 변경합니다.
디폴트 발소리용 사운드 큐는 하나뿐이며, 오브젝트 머티리얼에 피지컬 머티리얼이 할당되지 않았을 때만 재생되므로 이 변수의 컨테이너 타입은 단일 변수로 변경하면 됩니다.
맵 변수는 한 타입의 에셋을 다른 타입의 에셋과 링크하는 데이터 쌍 목록입니다. 'FootStepSounds' 변수는 각 피지컬 머티리얼을 해당 사운드 큐와 매핑합니다.
머티리얼과 사운드를 링크하도록 'FootStepSounds'를 구성하려면 다음 단계를 따릅니다.
변수의 디폴트 값을 편집할 수 있도록 블루프린트를 컴파일합니다.
FootStepSounds 변수를 선택합니다. 디테일(Details) 패널의 디폴트 값(Default Value)에서 새 엘리먼트를 추가합니다.
피지컬 머티리얼 필드에서 PM_Stone 에셋을 선택합니다.
'사운드 큐(Sound Cue)' 필드에서 SC_Footsteps_Default 에셋을 선택합니다.
위 단계를 반복하여 PM_Metal과 SC_Footsteps_Metal이 할당된 엘리먼트를 추가합니다.
FootStepSounds 변수를 선택합니다. 디테일 패널의 디폴트 값에서 SC_Footsteps_Default를 추가합니다.
블루프린트 로직을 빌드하려면 다음 단계를 따릅니다.
내 블루프린트 패널에서 fnGetFootStepSounds라는 이름의 새 함수를 추가합니다. 새 탭에서 해당 함수 전용 그래프가 열립니다.
함수를 선택하고 디테일 패널을 사용하여 다음과 같이 설정합니다.
새 입력을 추가하고 이름은 PhysicalMaterial, 타입은 피지컬 머티리얼로 설정합니다.
새 출력을 추가하고 이름은 SoundCue, 타입은 사운드 큐로 설정합니다.
그래프에서 함수 시작 노드(fnGetFootStepSounds)와 Return Node 사이의 와이어 연결을 끊습니다.
FootStepSounds 변수를 함수 그래프로 드래그한 다음 Get을 선택합니다.
Foot Step Sounds 노드의 핀에서 드래그하여 Find 노드를 추가합니다.
Find 노드의 두 번째 입력 핀을 fnGetFootStepSounds 노드의 피지컬 머티리얼 핀에 연결합니다. 이 핀은 앞에서 추가한 입력 파라미터입니다.
fnGetFootStepSounds 노드의 실행 핀에서 드래그하여 Branch 노드를 추가합니다. 조건(Condition) 핀을 Find 노드의 하단(빨간색) 출력 핀에 연결합니다.
Branch 노드에서 True 핀을 Return Node에 연결합니다.
Return Node에서 사운드 큐 핀을 드래그하여 Find 노드의 상단(파란색) 출력 핀에 연결합니다.
Branch 노드에서 False 핀을 드래그하여 또 다른 Return Node를 추가합니다.
새 Return Node에서 사운드 큐 핀을 드래그하여 Get Default Foot Steps 노드를 추가합니다.
블루프린트를 컴파일하고 저장합니다.
이 함수는 함수 입력으로 전달된 피지컬 머티리얼이 FootStepSounds 맵에 존재하는지 확인합니다. 피지컬 머티리얼이 존재하면 해당 피지컬 머티리얼에 연결된 사운드 큐를 함수의 출력 변수로 반환합니다.
피지컬 머티리얼을 찾지 못하면 DefaultFootSteps 사운드 큐가 대신 반환됩니다.
디폴트 발소리 사운드 설정
다음으로는, 블루프린트에서 사용하는 값을 관리하기 위한 데이터 에셋을 생성해 보겠습니다. 이 에셋은 환경설정 레이어 역할을 하며, 블루프린트를 수정하거나 리컴파일하지 않고도 피지컬 머티리얼과 사운드 큐를 추가, 제거 및 업데이트할 수 있게 합니다. 다음 단계를 따르면 됩니다.
콘텐츠 브라우저에서 AdventureGame > Artist > Audio > Footsteps 폴더로 이동합니다.
우클릭하고 기타(Miscellaneous) > 데이터 에셋(Data Asset)을 선택합니다. (원형 아이콘이 있는 데이터 에셋 타입을 선택합니다.)
BP_DA_FootSteps 데이터 클래스를 데이터 에셋 인스턴스로 선택합니다.
이 에셋의 이름을 DA_FootSteps로 명명하고 엽니다.
Default Foot Steps에 SC_Footsteps_Default를 설정합니다.
Foot Step Sounds를 펼쳐 두 개의 FootStepSounds 맵 엘리먼트가 모두 채워져 있는지 확인합니다.
데이터 에셋을 저장합니다.
발소리를 재생하는 함수 빌드
다음으로는, 함수 라이브러리에서 발소리를 재생하는 함수를 생성해 보겠습니다. 프로젝트의 모든 블루프린트 클래스는 블루프린트 함수 라이브러리에 정의된 함수를 사용할 수 있습니다.
새 함수를 생성하고 구성하려면 다음 단계를 따릅니다.
콘텐츠 브라우저에서 AdventureGame > Designer > Blueprints > Core로 이동한 다음 BPL_FPGame 블루프린트 함수 라이브러리를 엽니다.
내 블루프린트(My Blueprint) 패널에서 새 함수를 추가하고 이름을 fnBPLPlayFootStepSound로 명명합니다.
새 함수를 선택한 다음 디테일 패널에서 새 입력을 추가하고 이름은 PlayerReference, 타입은 폰(Pawn)으로 지정합니다.
플레이어와 지면 사이에 라인 트레이스를 구성하려면 다음 단계를 따릅니다.
fnBPLPlayFootStepSound 노드의 실행 핀에서 드래그하여 Line Trace By Channel 노드를 추가합니다.
Line Trace By Channel 노드의 시작(Start) 핀에서 드래그하여 Get Actor Location 노드를 추가합니다.
노드를 찾기 어려우면 '노드 액션(Node Actions)' 목록에서 컨텍스트 구분(Context Sensitive)을 비활성화합니다.
Get Actor Location 노드의 타깃(Target)에서 드래그하여 Get Player Reference 노드를 추가합니다.
Get Player Reference 노드의 출력 핀에서 드래그하여 Make Array 노드를 추가합니다.
Make Array 노드의 배열 출력 핀을 Line Trace By Channel 노드의 무시할 액터(Actors to Ignore) 핀에 연결합니다.
Get Actor Location 노드의 반환 값(Return Value) 핀에서 드래그하여 Subtract 노드를 추가합니다.
Subtract 노드의 출력 핀을 Line Trace By Channel 노드의 끝(End) 핀에 연결합니다.
Subtract 노드에서 Z 값을 500으로 설정합니다.
이는 플레이어 위치에서 아래 방향으로 500 유닛만큼 라인을 트레이스하며, 플레이어 캐릭터는 무시합니다. 다음 단계에서는 라인 트레이스가 탐지한 표면 타입에 따라 적절한 발소리를 할당합니다.
앞에서 생성한 데이터 에셋을 사용하여 올바른 발소리를 할당하려면 다음 단계를 따릅니다.
Line Trace By Channel 노드의 Out 히트(Out Hit) 핀에서 드래그하여 Break Hit Results를 선택합니다.
로컬 변수를 생성하고 이름을 FootStepsAsset으로 명명한 다음 타입을 BP_DA_FootSteps(오브젝트 레퍼런스)로 설정합니다. 디폴트 값을 DA_FootSteps로 설정합니다.
FootStepsAsset 변수를 이벤트 그래프로 드래그한 다음 Get FootStepAsset을 선택합니다.
FootStepsAsset 노드에서 드래그한 다음 fnGetFootStepSounds를 검색하여 선택합니다.
LineTraceByChannel 노드의 실행 핀을 FnGetFootStepSounds 노드에 연결합니다. Break Hit Results 노드를 펼친 다음 피직스 머티리얼(Phys Mat) 핀을 FnGetFootStepSounds 노드의 피지컬 머티리얼 핀에 연결합니다.
FnGetFootStepSounds 노드에서 드래그한 다음 Play Sound At Location을 검색하여 선택합니다.
PlaySoundAtLocation 노드의 사운드(Sound) 핀을 FnGetFootStepSounds 노드의 사운드 큐 핀에 연결합니다.
PlaySoundAtLocation 노드의 위치(Location) 핀에서 드래그한 다음 Get Actor Location을 검색하여 선택합니다. 타깃 핀에서 드래그하여 Get Player Reference 노드를 추가합니다.
함수를 저장하고 컴파일합니다.
이 과정은 데이터 에셋 함수 fnGetFootStepSounds를 사용하여 피지컬 머티리얼을 전달하고, 재생할 사운드 큐를 구합니다.
발소리로 애니메이션 블루프린트 업데이트
다음 단계에서는 캐릭터의 각 발이 지면에 닿을 때 FnBPLPlayFootStepSound 함수를 호출하도록 플레이어 캐릭터의 애니메이션 블루프린트를 수정합니다.
이 프로젝트에서 사용하는 Manny 캐릭터와 같이, 대부분의 Manny 캐릭터는 기본적으로 알림이 포함된 애니메이션을 사용합니다. 애니메이션 알림(애니메이션 노티파이) 또는 줄여서 노티파이는 애니메이션 시퀀스와 동기화된 반복 가능한 이벤트를 생성할 수 있도록 합니다. 이러한 이벤트에는 걷거나 달리는 애니메이션의 발소리, 파티클 스폰 등 다양한 요소가 포함될 수 있습니다.
애니메이션 시퀀스에 노티파이를 추가할 수 있지만, 언리얼 엔진 템플릿에 포함된 대부분의 로코모션 애니메이션에는 캐릭터의 발이 지면에 닿는 시점(FootPlant)에 맞춘 디폴트 애니메이션 노티파이가 이미 포함되어 있습니다.
디폴트 애니메이션 노티파이를 확인하려면 다음 단계를 따릅니다.
콘텐츠 브라우저에서 플레이어 캐릭터가 사용하는 애니메이션 블루프린트를 엽니다. 샘플 프로젝트의 BP_AdventureCharacter에 대해 콘텐츠(Content) > Characters > Mannequins > Anims > Unarmed로 이동한 다음 ABP_Unarmed를 엽니다.
오른쪽 상단에서 애니메이션(Animation) 버튼(초록색의 달리는 사람 아이콘)을 클릭합니다. 이렇게 하면 해당 블루프린트 애니메이션이 언리얼 에디터의 새 탭에서 열립니다.
재생 중인 애니메이션을 변경하려면 애니메이션 버튼 옆의 점 세 개를 클릭한 다음 걷기 또는 달리기 애니메이션을 선택합니다. 예를 들어 MF_Unarmed_Jog_Fwd를 선택합니다.
팁: 조깅하는 애니메이션은 콘텐츠 브라우저에서 직접 열 수도 있습니다.
타임라인에서 FootPlant 노티파이를 확인할 수 있습니다.
새로운 노티파이를 추가하거나 기존 노티파이를 수정하여 여러 이벤트를 실행하는 고유한 시스템을 만들 수 있습니다. 이 튜토리얼에서는 캐릭터 애니메이션에 포함된 디폴트 노티파이를 사용합니다. 이러한 노티파이의 이름은 AN_FootPlant_Right와 AN_FootPlant_Left입니다.
애니메이션의 노티파이를 블루프린트에 추가하고 발소리를 재생하려면 다음 단계를 따릅니다.
ABP_Unarmed로 돌아갑니다.
이벤트 그래프에서 우클릭한 다음 AnimNotify_AN_FootPlant_Left 노드를 추가합니다.
Notify 노드의 핀에서 드래그한 다음 FnBPLPlayFootStepSound를 검색하여 선택합니다.
AnimNotify_AN_FootPlant_Right 노드를 추가하고 FnBPLPlayFootStepSound 노드의 실행 입력 핀에 연결합니다.
FnBPLPlayFootStepSound 노드의 플레이어 레퍼런스(Player Reference) 핀에서 드래그하여 Get Player Pawn 노드를 추가합니다.
애니메이션 블루프린트를 컴파일하고 저장합니다.
이렇게 하면 애니메이션 블루프린트에서 FootPlant 노티파이가 트리거될 때마다 발소리가 재생됩니다.
캐릭터가 다른 애니메이션 블루프린트를 사용하는 경우, 해당 애니메이션 BP에도 동일한 코드를 추가해야 합니다.
발소리 재생을 위해 플레이어 캐릭터 블루프린트 업데이트
다음으로는, 플레이어 블루프린트를 수정하여 플레이어가 낙하 또는 점프 후 지면에 착지할 때 사운드를 재생하도록 로직을 추가해 보겠습니다. FnBPLPlayFootStepSound 함수를 블루프린트 함수 라이브러리에서 생성했으므로, 이를 플레이어 캐릭터 블루프린트에서도 재사용할 수 있습니다.
플레이어 블루프린트를 수정하려면 다음 단계를 따릅니다.
콘텐츠 브라우저에서 AdventureGame > Designer > Blueprints > Characters 폴더로 이동합니다.
BP_AdventureCharacter 블루프린트를 열고 이벤트 그래프 탭으로 이동합니다.
그래프의 빈 공간을 우클릭한 다음 Event On Landed 노드를 추가합니다.
EventOnLanded 노드의 실행 핀에서 드래그한 다음 FnBPLPlayFootStepSound를 검색하여 선택합니다.
FnBPLPla FootStepSound 노드의 플레이어 레퍼런스 핀에서 드래그하여 Self 노드를 추가합니다.
블루프린트를 컴파일하고 저장합니다.
바닥에 피지컬 머티리얼 할당
다음으로는, 여러 표면에 피지컬 머티리얼을 할당해 보겠습니다. 다음 단계를 따르면 됩니다.
레벨에서 바닥 오브젝트와 같은 표면을 선택합니다.
디테일 패널의 콜리전(Collision) 섹션에서 피직스 머티리얼 오버라이드(Phys Material Override)를 앞에서 생성한 피지컬 머티리얼 중 하나로 변경합니다.
위 단계를 반복하여 레벨의 여러 바닥에 두 가지 피지컬 머티리얼 타입을 각각 할당합니다.
또는 다음과 같은 방법으로 머티리얼 인스턴스에 피지컬 머티리얼을 추가할 수도 있습니다.
머티리얼 인스턴스를 열고 디테일 패널로 이동합니다.
일반(General) 섹션으로 스크롤한 다음 피직스 머티리얼 드롭다운을 클릭하여 원하는 피지컬 머티리얼을 선택합니다.
머티리얼 인스턴스를 저장합니다.
발소리 테스트
게임을 실행한 후 피지컬 머티리얼이 적용된 표면 위를 걷거나 점프하여 올바른 발소리가 나는지 확인합니다.
표면에 피지컬 머티리얼이 할당되어 있으면 해당 표면에 해당하는 발소리가 재생됩니다. 피지컬 머티리얼을 찾지 못하면 디폴트 발소리가 재생됩니다.
다음 순서
다음 단원에서는 나이아가라 VFX 시스템을 사용하여 불꽃 비주얼 이펙트를 생성하고 이를 화염 함정에 적용하는 방법을 학습합니다.