Hit 시에 Sound가 출력되고, Effect가 나타나도록 추가적인 Hit 기능들을 구현하였다.
🔊 Hit Sound
Sound 기능은 WeaponStructures 클래스의 HitData 구조체에서 구현하였다.
USoundWave 객체로 Sound를 받고, UGameplayStatics 클래스의 SpawnSoundAtLocation 함수를 통해 사운드를 출력하였다.
이후, DataAsset 객체인 DA_OneHand에 생성되어있는 Sound 속성에 출력하고자하는 오디오 파일을 넣어주었다.
🪄 Hit / Attack Effect
Effect는 Particle과 Niagara 둘 다 사용될 수 있기 때문에 매개변수로 받아온 UFXSystemAsset* Effect 객체가 파티클인지, 나이아가라인지 확인하는 과정이 필요하다.
InEffect 객체를 UParticleSystem과 UNiagaraSystem으로 각각 형변환시켜 저장한 뒤, 형변환 한 객체가 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 함수를 사용한다.
CHelpers 클래스에서 이펙트를 간단히 출력시킬 수 있는 PlayEffect 함수를 모두 작성하였다면, 이제 HitData에서 Effect가 존재할 때 데미지를 입은 캐릭터에 Effect를 출력할 수 있는 PlayEffect 함수를 작성하였다.
PlayEffect 함수는 회전을 매개변수로 받는 함수와 받지않는 함수 두가지로 만들어주었고, 회전 값을 받으면 RotateVector 함수를 통해 위치값으로 방향을 보정해서 돌려주었다.
이제 만들어진 HitData의 함수를 Enemy 클래스의 Hitted 함수에서 호출해주었다.
Enemy가 데미지를 입을 때 사운드와 파티클 데이터가 있다면 출력하게 된다.
또한 WeaponStructures 클래스에 존재하는 DoActionData 구조체에서도 Effect 함수를 추가하여 공격 시에도 이펙트를 출력할 수 있게 하였다.
이후, DoAction_Combo 클래스의 End_DoAction 함수에서 이펙트를 출력하도록 함수 호출하여 공격이 끝날쯤 이펙트가 나오도록 하였다.
마무리로 DA_OneHand 데이터애셋에 마지막 공격에 이펙트를 출력하도록 이펙트 객체를 추가해주었다.
컴파일 후 프로그램을 실행시켜보면 추가한 사운드와 이펙트들이 정상적으로 출력되는것을 확인할 수 있었다.