声音播放涉及两种方式,一种是直接播放Wave,一种是通过cue进行播放。
先讲解第一种,直接播放音频文件(必须为Wave)。
USoundWave* fireSound; 添加在头文件中。
在源文件中加载声音资源。
1 auto fireSoundAsset = ConstructorHelpers::FObjectFinder<USoundWave>(TEXT("SoundWave'/Game/BP/fireSound.fireSound'"));
2 if (fireSoundAsset.Succeeded()) {
3 fireSound = fireSoundAsset.Object;
4 }
播放声音文件需要通过UGameplayStatics::PlaySound()或者UGameplayStatics::PlaySoundAtLocation()方法实现。
开火时候实现声音的播放,需要填入的参数分别是,在哪里播放,声音文件是什么和播放声音文件的具体位置。
1 void ATank::attack()
2 {
3
4 FTransform shootSpotLocation = shootSpot->GetComponentTransform();
5
6 AMissle* missle = GetWorld()->SpawnActor<AMissle>(AMissle::StaticClass(), shootSpotLocation);
7
8 missle->moves->SetVelocityInLocalSpace(shootSpotLocation.GetLocation().ForwardVector * 80000);
9 missle->moves->Activate(true);
10 fire->Activate(true);
11 UGameplayStatics::PlaySoundAtLocation(GetWorld(),fireSound, shootSpot->GetRelativeLocation());
12
13
14 }
第二种播放声音的方法,通过cue。
新建一个SoundCue文件。
选择WavePlayer,并为之选择一个Wave音频文件。
声明一个USoundCue的对象指针,并与之前一样,加载资源。
播放SoundCue文件需要通过 UGameplayStatics::SpawnSoundAttached方法实现。播放SoundCube时,需要指定一个Attach对象,要么是一个Pawn,要么是一个Location;
1 void ATank::attack()
2 {
3
4 FTransform shootSpotLocation = shootSpot->GetComponentTransform();
5
6 AMissle* missle = GetWorld()->SpawnActor<AMissle>(AMissle::StaticClass(), shootSpotLocation);
7
8 missle->moves->SetVelocityInLocalSpace(shootSpotLocation.GetLocation().ForwardVector * 80000);
9 missle->moves->Activate(true);
10 fire->Activate(true);
11 UGameplayStatics::PlaySoundAtLocation(GetWorld(),fireSound, shootSpot->GetRelativeLocation());
12
13 UAudioComponent *ac = UGameplayStatics::SpawnSoundAttached(soundcue, shootSpot);
14 ac->Activate(true);
15 }
结合上一节的粒子系统与本节的声音系统,效果如下: