Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
Tags
- 디자드
- JWT
- flask
- 게임개발
- 스터디
- Express
- 미니프로젝트
- Ajax
- 언리얼뮤지컬
- Bootstrap4
- 파이썬서버
- 언리얼
- 카렌
- R
- 으
- 프메
- 알고풀자
- EnhancedInput
- VUE
- 스마일게이트
- 언리얼프로그래머
- 데이터베이스
- 프린세스메이커
- Unseen
- 마인크래프트뮤지컬
- 정글사관학교
- node
- 레베카
- Enhanced Input System
- Jinja2
Archives
- Today
- Total
Today, I will
[Unreal] 클래스 캐스팅 바로 접근시 nullptr 사례 본문
오류 상황
멀티플레이어(Lan 리슨 서버) 게임에서, 총알로 다른 플레이어를 쏠 때 nullptr error가 뜨면서 언리얼 강제 종료

오류 코드
void ABulletActor::OnOverlap(UPrimitiveComponent* OverlappedComponent, AActor* OtherActor, UPrimitiveComponent* OtherComp, int32 OtherBodyIndex, bool bFromSweep, const FHitResult& SweepResult)
{
// 스폰도 서버가 담당하듯이 지우는 것도 서버가 지워주기
if (HasAuthority()) {
if (AMyProjectCharacter* player = Cast<AMyProjectCharacter>(OtherActor)) {
// 때린(맞은) 아이
player->Damaged(damage);
// 플레이어 점수를 10점 올린다
// 나자신의 오너
ANetPlayerState* ownerPlayer = Cast<AMyProjectCharacter>(GetOwner())->GetPlayerState<ANetPlayerState>();
ownerPlayer->SetScore(ownerPlayer->GetScore() + 10);
UE_LOG(LogTemp, Warning, TEXT("ABulletActor::OnOverlap %d"), damage);
}
Destroy();
}
}
- if (AMyProjectCharacter* player = Cast<AMyProjectCharacter>(OtherActor)) 부분:
- 이 코드는 OtherActor를 AMyProjectCharacter 클래스로 캐스팅하려고 시도하였고 OtherActor가 nullptr일 경우 캐스팅은 실패하며 런타임 오류를 발생시킬 여지가 있다. 하지만 직접적인 원인은 아니었다.
- Cast<AMyProjectCharacter>(GetOwner())->GetPlayerState<ANetPlayerState>() 부분:
- GetOwner() 함수의 결과에서 플레이어스테이트까지 가져오는 경우로 직접적인 원인이었다.
코드 수정
캐릭터에서 바로 플레이어스테이트로 넘어가지 않고, 플레이어가 nullptr이 아닌지 한번 더 검토해주고 playerstate를 받아온다.
void ABulletActor::OnOverlap(UPrimitiveComponent* OverlappedComponent, AActor* OtherActor, UPrimitiveComponent* OtherComp, int32 OtherBodyIndex, bool bFromSweep, const FHitResult& SweepResult)
{
if (!OtherActor)
return;
if (HasAuthority()) {
if (AMyProjectCharacter* player = Cast<AMyProjectCharacter>(OtherActor)) {
// 때린(맞은) 아이
player->Damaged(damage);
// 플레이어 점수를 10점 올린다
// 나자신의 오너
AMyProjectCharacter* OwnerCharacter = Cast<AMyProjectCharacter>(GetOwner());
if (OwnerCharacter) {
ANetPlayerState* ownerPlayer = OwnerCharacter->GetPlayerState<ANetPlayerState>();
if (ownerPlayer) {
ownerPlayer->SetScore(ownerPlayer->GetScore() + 10);
}
}
UE_LOG(LogTemp, Warning, TEXT("ABulletActor::OnOverlap %d"), damage);
}
// 서버에서만 파괴
Destroy();
}
}
'Issue Solving' 카테고리의 다른 글
[Unreal] const FInputActionValue& InValue 인자 빌드가 안되는 경우 (1) | 2024.01.06 |
---|---|
[Unreal 5.2] LINK : fatal error LNK1181: cannot open input file (1) | 2023.11.17 |