⭐ Unreal Engine/UE Debugging Log

[UE] SpawnActor 시점에 에러 발생

Designerd 2024. 7. 26. 16:08

 

SpawnActor 시점에 에러 발생

 


 

 

문제 상황

 

SpawnActor로 총알을 스폰 시키는 시점에 에러가 발생하며 터졌다.

 

 


 

 

원인

 

스폰을 시키는 해당 클래스는 UObject 상속의 클래스 AActor 상속 클래스와 달리 실체가 없다.

 

그래서 GetWord()를 부를 때 문제가 된다.

 


 

해결방안

 

스폰 시키는 주체가 캐릭터가 되게 하면 문제를 해결할 수 있다. 

 

 

변경 전

 SpawnedProjectile = GetWorld()->SpawnActor<AXZProjectile>(ActionDatas[Idx].ProjectileClass, SocketTransform.GetLocation(), TargetRotation, SpawnParams);

 

 

변경 후

SpawnedProjectile = OwnerCharacter->GetWorld()->SpawnActor<AXZProjectile>(ActionDatas[Idx].ProjectileClass, SocketTransform.GetLocation(), TargetRotation, SpawnParams);

 

OwnerCharacter가 주체가 되어 액터를 스폰한다.

 

 

void UXZCombat::OnFireBullet()
{
	// 무기 Nozzle에서 총알 발사

    if (IsValid(XZAttachment) && IsValid(XZAttachment->GetWeaponMesh()))
    {
        const USkeletalMeshSocket* MuzzleFlashSocket = XZAttachment->GetWeaponMesh()->GetSocketByName(ActionDatas[Idx].MuzzleSocketName);
        if (MuzzleFlashSocket)
        {
            FTransform SocketTransform = MuzzleFlashSocket->GetSocketTransform(XZAttachment->GetWeaponMesh());
            FRotator TargetRotation = (HitTargetLocation - SocketTransform.GetLocation()).Rotation();

            if (IsValid(OwnerCharacter) && IsValid(OwnerCharacter->GetWorld()) && IsValid(ActionDatas[Idx].ProjectileClass))
            {
                UE_LOG(LogTemp, Warning, TEXT("Spawning projectile at location: %s with rotation: %s"), *SocketTransform.GetLocation().ToString(), *TargetRotation.ToString());

                FActorSpawnParameters SpawnParams;
                SpawnParams.Owner = XZAttachment->GetOwner();
                SpawnParams.Instigator = Cast<APawn>(XZAttachment->GetOwner());
                SpawnParams.SpawnCollisionHandlingOverride = ESpawnActorCollisionHandlingMethod::AlwaysSpawn;

                SpawnedProjectile = OwnerCharacter->GetWorld()->SpawnActor<AXZProjectile>(ActionDatas[Idx].ProjectileClass, SocketTransform.GetLocation(), TargetRotation, SpawnParams);
                if (SpawnedProjectile)
                {
                    SpawnedProjectile->SetActorEnableCollision(false);
                    UE_LOG(LogTemp, Warning, TEXT("Projectile spawned successfully"));
                }
            }
        }
    }
}