🎮Unreal4/C++

[UE4] Hit Sound, Effect (USoundWave, SpawnSoundAtLocation , UFXSystemAsset, UParticleSystem, UNiagaraSystem)

공대 컴린이 2023. 4. 21. 16:53
728x90

Hit 시에 Sound가 출력되고, Effect가 나타나도록 추가적인 Hit 기능들을 구현하였다.

🔊 Hit Sound

Sound 기능은 WeaponStructures 클래스의 HitData 구조체에서 구현하였다.

USoundWave 객체로 Sound를 받고, UGameplayStatics 클래스SpawnSoundAtLocation 함수를 통해 사운드를 출력하였다.

 

이후, DataAsset 객체인 DA_OneHand에 생성되어있는 Sound 속성에 출력하고자하는 오디오 파일을 넣어주었다.

🪄 Hit / Attack Effect

EffectParticle과 Niagara 둘 다 사용될 수 있기 때문에 매개변수로 받아온 UFXSystemAsset* Effect 객체가 파티클인지, 나이아가라인지 확인하는 과정이 필요하다.

 

CHelpers.h

InEffect 객체를 UParticleSystemUNiagaraSystem으로 각각 형변환시켜 저장한 뒤, 형변환 한 객체가 NULL이 아니라면 해당 자료형으로 된 이펙트이기 때문에 이펙트별로 알맞는 Spawn 함수를 호출시켜주었다.

 

먼저, 매개변수로 받아온 USkeletalMeshComponent인 InMesh가 NULL이 아니라면 이펙트를 Attached하여 Mesh에 붙이는 방식으로 출력하고,

InMesh가 NULL이라면, InWorld에 특정 위치에 AtLocation하는 방식으로 출력하였다.

 

Attached 할 때 Particle은 UGameplayStatics::SpawnEmitterAttached 함수를 사용하고, Niagara는 UNiagaraFunctionLibrary::SpawnSystemAttached 함수를 사용한다.

 

AtLocation 할 때는 Particle은 UGameplayStatics::SpawnEmitterAtLocation 함수를 사용하고, Niagara는 UNiagaraFunctionLibrary::SpawnSystemAtLocation 함수를 사용한다.

 

WeaponStructures.cpp

CHelpers 클래스에서 이펙트를 간단히 출력시킬 수 있는 PlayEffect 함수를 모두 작성하였다면, 이제 HitData에서 Effect가 존재할 때 데미지를 입은 캐릭터에 Effect를 출력할 수 있는 PlayEffect 함수를 작성하였다.

 

PlayEffect 함수는 회전을 매개변수로 받는 함수와 받지않는 함수 두가지로 만들어주었고, 회전 값을 받으면 RotateVector 함수를 통해 위치값으로 방향을 보정해서 돌려주었다.

 

CEnemy.cpp :: Hitted()

이제 만들어진 HitData의 함수를 Enemy 클래스의 Hitted 함수에서 호출해주었다.

Enemy가 데미지를 입을 때 사운드와 파티클 데이터가 있다면 출력하게 된다.

 

WeaponStructures::FDoActionData

또한 WeaponStructures 클래스에 존재하는 DoActionData 구조체에서도 Effect 함수를 추가하여 공격 시에도 이펙트를 출력할 수 있게 하였다.

 

이후, DoAction_Combo 클래스의 End_DoAction 함수에서 이펙트를 출력하도록 함수 호출하여 공격이 끝날쯤 이펙트가 나오도록 하였다.

 

마무리로 DA_OneHand 데이터애셋에 마지막 공격에 이펙트를 출력하도록 이펙트 객체를 추가해주었다.

 

컴파일 후 프로그램을 실행시켜보면 추가한 사운드와 이펙트들이 정상적으로 출력되는것을 확인할 수 있었다.

 

728x90