기존의 사운드큐보다 더 좋은 기능 제공.
원본 사운드를 통해 다양한 사운드를 임의로 만들고, 변경도 가능함.
Notify 추가
먼저 Sound를 재생시킬 위치(Notify)를 정해줘야 한다.
AM_AttackMontage
에서 Notifies 트랙을 하나 더 추가하고
여기에Play Sound
라는 Notify를 적절한 위치에 배치한다.
우측의Details
패널에서 import한 사운드파일을 선택하면 해당 Notify를 지나갈 때 사운드가 재생된다.
Track명도 적절히 바꿔준다.
MetaSound 생성
없으면 플러그인에서 추가후 사용 가능하다.
SFX_Whoosh
로 이름붙이고 생성한다.
위쪽의 Output 노드는 메타사운드(다방향사운드를 의미하는것 같음), 아래의 Output 노드는 좌우 스피커로 재생가능한 사운드이다.
좌측 상단의Members
패널에서INPUTS
우측의+
버튼을 눌러 input을 하나 생성해준다.
하단의Details
패널에서 이름을 변경해주고, type을WaveAsset
으로,Default Value
에 사운드를 넣어준다.
Whoosh를 드래그해서 노드를 추가해주고,Wave Player
노드를 검색하여 추가해준 뒤 핀을 이어준다(Output Mono 노드는 모든 사운드를 모노(단일채널) 오디오로 출력하게 하는 노드이므로 왼쪽 오른쪽 상관 없다고 함).
사운드의 다양성을 위해Input(On Play)
노드에서 핀을 끌고 와Random(float)
노드를 생성하고,Pitch Shift
에 연결하면 랜덤으로 사운드의 피치조절이 가능해진다.
마찬가지로 랜덤 노드를 복사하고OutLeft
핀을 끌고 와*
노드(Audio by Float
)를 검색하고 핀과 연결하면 볼륨을 무작위로 결정할 수 있다.
다시 AM_AttackMontage로 돌아와서 Whoosh 트랙에 있는 노티파이들을 클릭하고 우측의Details
패널에서Sound
탭에 있는 사운드를 방금 생성한SFX_Whoosh
로 변경하면 메타사운드 적용이 가능하다.
검을 공격을 할때 캐릭터가 나는 사운드도 추가할 수 있다.
똑같이 메타사운드 파일을 생성하고Input
을 생성해준다.
똑같이 타입을WaveAsset
으로 변경하고, 우측의IsArray
체크박스에 체크하면 에셋을 여러개 추가할 수 있다.
필요한 사운드에셋을 전부 추가해준다.
우클릭후Shuffle
을 검색하고WaveAsset
을 선택한다.
핀들을 전부 알맞게 연결하면 캐릭터가 내는 메타사운드 적용이 가능해진다.
적절히 랜덤을 통해 피치랑 볼륨을 랜덤으로 나오게 한다.
물론 notify 추가도 해주어야 한다.
메타사운드 활용
1. 걷는 사운드 재생
(12.113 12.114 지형별 사운드 재생 나중에 추가)
무장해제와 무장시, 무기 PickUp시 사운드 재생
1. 무장해제와 무장시
적절한 사운드를 넣는다.
2. 무기 EquipWeapon시
무기 종류에 따라 재생될 사운드를 다르게 구현하려고 한다.
먼저 Weapon.h에 사운드 관련 변수를 하나 선언한다.// AWeapon.h class USoundBase; ... private: // 무기를 얻을 시 재생될 사운드 UPROPERTY(EditAnywhere, Category = "Weapon Properties") USoundBase* EquipSound;
Weapon.cpp도 코드를 작성한다.
// AWeapon.cpp ... // 사운드 재생을 위한 헤더파일 #include "Kismet/GameplayStatics.h" ... void AWeapon::EquipWeapon(USceneComponent* Inparent, FName InSocketName) { ... if(EquipSound) { // 첫번째 parameter에 왜 GetWorld()말고 this를 쓰는가에 대한 설명 // 찾아보니 GetWorld()보다 this가 더 효율적일 것이다란 답변 있음 UGameplayStatics::PlaySoundAtLocation(this, EquipSound, GetActorLocation()); } }
추가
사운드 관련해서 오버랩때문에 오류가 발생한다는데, 발생안해서 혹시몰라 추가정리
Item.h에 있는 오버랩용 Sphere를 Weapoh에서 사용하기 위해 private에서 protect로 옮기고,
EquipWeapon()에 코드 추가.void AWeapon::EquipWeapon() { ... if(OverlapSphere) { OverlapSphere->SetCollisionEnable(ECollisionEnabled::NoCollision); } } ...