Mini

[UE5] 발사체 이펙트, 소리, 수명 구현 본문

UE5/Ability Tasks

[UE5] 발사체 이펙트, 소리, 수명 구현

Mini_96 2024. 6. 15. 22:06

* 필요한 변수, 함수 추가

class AURA_API AAuraProjectile : public AActor
{
    GENERATED_BODY()
    
p...
    virtual void Destroyed() override;

   ...
    
private:
    bool bHit=false;
    
   ...

    UPROPERTY(EditAnywhere)
    TObjectPtr<UNiagaraSystem> ImpactEffect; //충격효과 =>체력깍기

    UPROPERTY(EditAnywhere)
    TObjectPtr<USoundBase> ImpactSound; //부딪히면 소리

    UPROPERTY(EditAnywhere)
    TObjectPtr<USoundBase> LoopingSound;

    UPROPERTY()
    TObjectPtr<UAudioComponent> LoopingSoundComponent;

    
};

- 구현

void AAuraProjectile::Destroyed()
{
    //클라의경우 && 복제안된경우
    if(!bHit && !HasAuthority())
    {
       //오버랩되면 소리재생
       UGameplayStatics::PlaySoundAtLocation(this,ImpactSound,GetActorLocation(),FRotator::ZeroRotator);

       //오버랩되면 효과실행
       UNiagaraFunctionLibrary::SpawnSystemAtLocation(this,ImpactEffect,GetActorLocation());  
    }
    Super::Destroyed();
}

void AAuraProjectile::OnSphereOverlap(UPrimitiveComponent* OverlappedComponent, AActor* OtherActor,
                                      UPrimitiveComponent* OtherComp, int32 OtherBodyIndex, bool bFromSweep, const FHitResult& SweepResult)
{
    //오버랩되면 소리재생
    UGameplayStatics::PlaySoundAtLocation(this,ImpactSound,GetActorLocation(),FRotator::ZeroRotator);

    //오버랩되면 효과실행
    UNiagaraFunctionLibrary::SpawnSystemAtLocation(this,ImpactEffect,GetActorLocation());

    //서버에있으면 파괴 => 클라에복제안되게
    if(HasAuthority())
    {
       Destroy();
    }
    else //클라에서 파괴되기전 겹치는경우, bHit=true이면 이미 복제된거임 / bHit=false이면 복제안된거임, play
    {
       bHit=true;
    }
}

 

BP에서 에셋선택
결과 : 포션도 때려버리는 버그(-)

 

* 불발사 시작할때, 소리 노티파이 추가

결과 : 불 발사시 소리재생

 

 

* 루핑사운드 => 불에서 계속소리나도록

- 변수추가

UPROPERTY(EditAnywhere)
TObjectPtr<USoundBase> LoopingSound; //불자체에서 반복해서 나느소리

UPROPERTY()
TObjectPtr<UAudioComponent> LoopingSoundComponent; //멈추기 위해 저장

- SpawnSoundAttached는 return 으으로 LSC를 뱉는다.

이를 저장하고 오버랩되면, 종료시키면 된다.

void AAuraProjectile::BeginPlay()
{
    Super::BeginPlay();
    Sphere->OnComponentBeginOverlap.AddDynamic(this, &AAuraProjectile::OnSphereOverlap); //오버랩 이벤트 달기, 실행될함수

    LoopingSoundComponent = UGameplayStatics::SpawnSoundAttached(LoopingSound,GetRootComponent());
}
void AAuraProjectile::OnSphereOverlap(UPrimitiveComponent* OverlappedComponent, AActor* OtherActor,
                                      UPrimitiveComponent* OtherComp, int32 OtherBodyIndex, bool bFromSweep, const FHitResult& SweepResult)
{
    ...
    LoopingSoundComponent->Stop(); // 적과오버랩되면 불 자체에서나는 루핑사운드 중지

 

- 변수에 의존성주입 (안하면 nullptr)

결과 : 정상 / but, 안사라지고 무한히 이동함

 

* 발사체에 수명설정

private:
    UPROPERTY(EditDefaultsOnly)
    float LifeSpan = 15.f;
void AAuraProjectile::BeginPlay()
{
    Super::BeginPlay();
    SetLifeSpan(LifeSpan); //이 발사체의 수명을 정함

 

https://github.com/DongHoonYu96/GameplayAbilitySystem_Aura/commit/51ccd4d066a475e89de46d671328a1d44ff0a2e1

 

feat : 발사체 이펙트, 소리, 수명 구현 · DongHoonYu96/GameplayAbilitySystem_Aura@51ccd4d

Bisu96 committed Jun 15, 2024

github.com

 

* 적만 때리도록 fix -> next step