게임 개발 (언리얼 엔진)

UE4 게임 개발 EscapeGame - 14 : 각종 효과음

종황이 2020. 12. 24. 23:45

소리를 넣어주니 훨씬 그럴듯해졌습니다.

1. 돌 떨어지는 소리, 굴러오는 소리, 땅이 꺼지는 소리

2. 좀비 -> 거리에 따라서 감쇄 효과

USoundWave를 활용하는 방법과, USoundCue와 AudioComponent를 활용하는 방법으로 나눠서 작업했습니다.

1. USoundWave

한번 재생해줘야하는 상황에서 활용했습니다.

// ObstacleFloor.cpp

// Sets default values
AObstacleFloor::AObstacleFloor()
{
 	// Set this actor to call Tick() every frame.  You can turn this off to improve performance if you don't need it.
	PrimaryActorTick.bCanEverTick = true;

	static ConstructorHelpers::FObjectFinder<USoundWave> SoundAsset(TEXT("SoundWave'/Game/GameContent/Sound/effect/Destroy.Destroy'"));

	if (SoundAsset.Succeeded())
	{
		DestroySound = SoundAsset.Object;
	}
}

float AObstacleFloor::TakeDamage(float DamageAmount, struct FDamageEvent const& DamageEvent, class AController* EventInstigator, AActor* DamageCauser)
{
	float fDamage = Super::TakeDamage(DamageAmount, DamageEvent, EventInstigator, DamageCauser);
	
	if (IsValid(Mesh))
	{
		// 받은 데미지를 적용해줘야함. Z축 -1 방향으로.
		Mesh->ApplyDamage(DamageAmount, GetActorLocation(), FVector(0.f, 0.f, -1.f), 100.f);
	}

	// 전체 사운드 재생 
	// UGameplayStatics::PlaySound2D(this, DestroySound, 1.f);
	// 특정 지점에서 사운드 재생
	UGameplayStatics::PlaySoundAtLocation(this, DestroySound, GetActorLocation());

	return fDamage;
}

전체 사운드 재생인 PlaySound2D, 특정 지점에서 사운드 재생인 PlaySoundAtLocation이 있습니다.

2. USoundCue, UAudioComponent

// Zombie.cpp

AZombie::AZombie()
{
 	// Set this character to call Tick() every frame.  You can turn this off to improve performance if you don't need it.
	PrimaryActorTick.bCanEverTick = true;
    
	static ConstructorHelpers::FObjectFinder<USoundCue> BreathAsset(TEXT("SoundCue'/Game/GameContent/Zombie/ZombieSound/ZombieBreathingCue.ZombieBreathingCue'"));

	if (BreathAsset.Succeeded())
	{
		ZombieBreathingCue = BreathAsset.Object;
	}

	static ConstructorHelpers::FObjectFinder<USoundCue> ScreamAsset(TEXT("SoundCue'/Game/GameContent/Zombie/ZombieSound/ZombieScreamingCue.ZombieScreamingCue'"));

	if (ScreamAsset.Succeeded())
	{
		ZombieScreamingCue = ScreamAsset.Object;
	}

	AudioComponent = CreateDefaultSubobject<UAudioComponent>(TEXT("AudioComponent"));
	AudioComponent->bAutoActivate = false;
	AudioComponent->SetupAttachment(GetMesh());
}

void AZombie::BeginPlay()
{
	Super::BeginPlay();
	
	// 소리 재생
	AudioComponent->SetSound(ZombieBreathingCue);
	AudioComponent->Play();
}

void AZombie::ChangeAnim(EZombieAnim eAnim)
{
	ZombieAnim->ChangeAnim(eAnim);

	if (eAnim == EZombieAnim::Patrol)
	{
		AudioComponent->SetSound(ZombieBreathingCue);
		AudioComponent->Play();
	}
	else if (eAnim == EZombieAnim::Walk)
	{
		AudioComponent->SetSound(ZombieScreamingCue);
		AudioComponent->Play();
	}
}

위와 같이 오디오 컴포넌트를 플레이어에게 달아주고, 실행시켜주었습니다. 오디오컴포넌트에는 Play() 말고도 Stop() 이라는 유용한 함수도 있습니다.

큐를 생성하면 여러가지 편리한 기능들을 추가할 수 있습니다.

저는 Loop와 Attenuation이라는 감쇄효과를 많이 사용했습니다. 원하는 세팅을 해주고 저장해서 사용하면됩니다.

 

무료 사운드는 freesound.org/search/?q=Drawer&f=&s=score+desc&advanced=0&g=1 여기에서 다운받았습니다.