⭐ 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"));
}
}
}
}
}