1. Cast<T> / IsValid() / Succeeded() (+ FObjectFinder<T>)

JUSTICE_DER·2023년 7월 19일
0

🌵UNREAL

목록 보기
32/42

🐸

CPP로 게임을 제작하면서 가장 자주 봤었던 예약어들이다.

실제 사용했던 코드들

Succeeded()

IsValid / Cast<>


1. Cast<>

1-1.CPP

CPP의 Cast는 일반적으로

(int)tmpString

위처럼 명시적으로 형변환을 하던가, 묵시적인 형변환이 된다.
위를 C스타일 캐스팅이라고도 한다.

CPP는 4개의 형변환 연산자를 추가로 제공한다.
CPP스타일 캐스팅이라고도 한다.

  • dynamic_cast
  • static_cast
  • const_cast
  • reinterpret_cast

모두 형변환이긴 하나 세부기능이 다르다.

1-2. UE

2가지의 글을 참고하였다.

Unreal에선 C나 CPP의 Cast를 그대로 사용해도 된다.
하지만 Cast<>를 사용하곤 한다.

1번째 글의 내용을 요약한다면,

  • Cast<>를 사용하는 이유는 Cast실패시, nullptr을 반환하기 때문에 안정성을 가진다.
  • Cast<>의 비용은 에디터환경에서 느린편에 속한다.
    다른 빠른 Cast들이 존재하나, 안정성을 위주로 하기에 사용한다.
  • Cast<>는 UObject에 쓰여야 한다.

2번째 글의 내용을 요약한다면,

결론
따라서 안전성이 있는 캐스팅을 하기 위해서 사용하게 된다.

2. IsValid() / Succeeded()

https://algorfati.tistory.com/75

2-1. IsValid

IsValid() 대신에, nullptr을 사용하여
해당 포인터가 nullptr인지 if문을 돌릴 수도 있다.

하지만 IsValid를 사용하는 이유는,
nullptr인지 확인하는 기능에 더해,
추가적으로 해당 객체가 유효한지 확인까지 한다.

해당 객체가 유효한지는 IsPendingKill이라는 함수가 따로 존재하는데,
즉 IsValid는 nullptr검사 + IsPendingKill
2가지를 한 번에 처리하는 방식이다.

nullptr이 아니고, PendingKill상태가 아니면 true

IsPendingKill은 해당 UObject가 PendingKill상태인지 확인한다.

PendingKill상태는 UObject가 소멸되어야 하거나, 소멸된 상태를 의미한다.
따라서 실제로 삭제 되었는지 + 삭제 대기중인지 를 확인하게 된다.

PendingKill상태의 UObject에 접근하는 것 자체로도 오류가 발생할 수 있기 때문에
확인하는 것이 안정적이다.

결론
따라서 간략하게 원래의 목적대로 사용하려면 그냥 nullptr을 사용하고,
안정성을 위해서 IsValid를 사용하여 PendingKill상태까지 검사할 수도 있다는 말이다.

2-2. Succeeded()

https://ansohxxn.github.io/ue4docs/unreal-cpp/

에셋을 로드할 때 항상 Succeeded를 썼다.

ConstructorHelpers::FObjectFinder
  • ConstructorHelpers는 언리얼에서 제공하는 utility 클래스이다.
  • 그 중 FObjectFinder는 생성자에서만 사용할 수 있고,
    메모리에서 에셋을 찾아서 로드하는 기능을 수행한다.
  • 클래스 템플릿으로서, 해당 클래스에 대해 Succeeded를 제공한다.


    단항연산자 ! 가 2번 쓰인 모습으로 보인다.
    그냥 Object를 반환한다고 보면되고, 존재하면 true를 반환한다.

A. FObjectFinder

ConstructorHelpers라는 클래스 내에
FObjectFinder라는 템플릿클래스가 존재하는 특이한 구조로 보인다.

UObject추가
https://kyoun.tistory.com/131
https://kyoun.tistory.com/125

B. .Object

위의 경우에 ConstructorHelpers::FObjectFinder로
FObjectFinder클래스의 인스턴스를 생성하는데,
해당 SK_Pawnboard라는 인스턴스는 리소스에 대한 참조값만을 가지고 있다.

결론
SK_Pawnboard.Object를 하면,
FObjectFinder라는 템플릿클래스로 저장한 참조값을 바탕으로 포인터를 생성한다.
즉 리소스 참조값에 대한 실제 객체를 반환하게 된다.

예제는 실제 객체를 받아서 SkeletalMesh에 적용시키는 코드

profile
Time Waits for No One

1개의 댓글

comment-user-thumbnail
2023년 7월 19일

정말 깊이 있는 글이었습니다.

답글 달기