2024-03-20
깃허브! |
---|
https://github.com/ChangJin-Lee/ARproject |
★ https://github.com/ChangJin-Lee/ToonTank |
느낀점
private에서도 블루프린트 이벤트 그래프에 노출 시킬 수 있는 방법이 있다. PROPERTY에서 meta 지정자를 추가해주면 되는데 생각보다 다양한 일들이 가능한 것 같다. 특정 메시의 위치를 가져오거나 위치를 설정하거나 혹은 캡슐콜라이더를 가져와서 재밌는 일들이 가능하다.
https://dev.epicgames.com/documentation/ko-kr/unreal-engine/metadata-specifiers-in-unreal-engine
클래스, 인터페이스, 구조체, 열거형, 열거형 값, 함수 또는 프로퍼티를 선언할 때 메타데이터 지정자 를 추가하여 엔진 및 에디터의 다양한 측면과 상호작용하는 방식을 제어할 수 있습니다. 각 데이터 구조 또는 멤버 타입에는 자체적인 메타데이터 지정자 목록이 있습니다. 라고 한다.
공식 문서에서 엄청 다양한 프로퍼티 메타데이터 지정자가 있는데 그 중에서 AllowPrivateAccess를 사용해보았다.
이전 강의에서 내운 배용에 Private Access 방법, Category 추가 방법을 배웠다. Category는 인스턴스 창에 있는 그 카테고리다.
private에서 블루프린트 이벤트 그래프로 값을 노출시키려면 어떻게 해야 할까? 다음처럼 하면 에러가 발생한다.
private:
UPROPERTY()
class UCapsuleComponent* CapsuleComp;
UPROPERTY()
UStaticMeshComponent* BaseMesh;
UPROPERTY()
UStaticMeshComponent* TurretMesh;
UPROPERTY()
// UStaticMeshComponent* ProjectileSpawnPoint;
USceneComponent* ProjectileSpawnPoint;
UPROPERTY(VisibleAnywhere, BlueprintReadWrite)
int32 VisibleAnywhereInt2 = 32;
D:\Github\ToonTank\ToonTanks\Source\ToonTanks\BasePawn.h(62): Error: BlueprintReadWrite should not be used on private members
UPROPERTY(VisibleAnywhere, BlueprintReadWrite, meta = (AllowPrivateAccess = "true"))
int32 VisibleAnywhereInt2 = 32;
UPROPERTY 매크로를 통해 메타데이터를 사용할 수 있으며 메타데이터는 다른 데이터에 대한 정보를 주는 데이터이다. 즉 meta에서 AllowPrivateAccess를 true로 바꾸면 private이라고 해도 노출이 가능하다.
다만 private 액세스를 메타로 만드는게 좋은 생각이 아니라고 생각할경우 C++ 측에서 캡슐화를 사용하면 블루프린트에서 이를 사용하고 변경할 수 있다. 실제로 블루프린트에서는 별개의 월드로 취급된다. 일반적으로 유저가 값을 변경할지도 모르는 정보는 블루프린트로 노출시키지 않는다.
UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "Components", meta = (AllowPrivateAccess = "true"))
class UCapsuleComponent* CapsuleComp;
UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "Components", meta = (AllowPrivateAccess = "true"))
UStaticMeshComponent* BaseMesh;
UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "Components", meta = (AllowPrivateAccess = "true"))
UStaticMeshComponent* TurretMesh;
UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "Components", meta = (AllowPrivateAccess = "true"))
// UStaticMeshComponent* ProjectileSpawnPoint;
USceneComponent* ProjectileSpawnPoint;