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
- 레베카
- R
- Jinja2
- 파이썬서버
- VUE
- Express
- 프린세스메이커
- JWT
- 게임개발
- Enhanced Input System
- Ajax
- 카렌
- EnhancedInput
- flask
- 마인크래프트뮤지컬
- 으
- 언리얼뮤지컬
- 미니프로젝트
- Unseen
- 스마일게이트
- 알고풀자
- 정글사관학교
- 디자드
- 프메
- 스터디
- Bootstrap4
- 언리얼프로그래머
- 데이터베이스
- 언리얼
- node
Archives
- Today
- Total
Showing
[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 |