접근 변환기
UE-CSS 4.25.3 빌드 42에서 추가된 새로운 기능으로 인해 게임 헤더를 수정하지 않고도 필드에 대한 접근자를 만들고, friend 클래스를 추가하고, 프로퍼티를 BlueprintReadWrite로 만들 수 있습니다.
접근 변환기 시스템이라고 불리는 이 기능은 나중에 SML과 게임 헤더를 업데이트할 때 병합 충돌을 처리할 필요 없이 헤더 접근자 수정을 할 수 있게 해주므로 유용합니다. 또한 다른 개발자들과의 협업도 더 쉽게 만들어주는데, 일반적인 헤더 수정은 플러그인 디렉터리 외부의 파일에서 이루어지므로 플러그인(모드) 소스 코드 저장소에 포함되지 않기 때문입니다. 접근 변환기는 플러그인 디렉터리 내의 파일에 정의되므로 저장소에 쉽게 포함될 수 있습니다.
UE-CSS 4.26.2 빌드 30부터는 BlueprintCallable도 지원됩니다.
SML 3.8부터는 UStruct도 접근 변환기로 수정할 수 있습니다.
접근 변환기는 C 클래스에만 작동한다는 점을 기억하십시오. 블루프린트 애셋의 특정 프로퍼티를 블루프린트가 읽고 쓰게 만들려면, 해당 프로퍼티를 소유한 부모 C 클래스를 찾아서 접근 변환기에서 사용해야 합니다. 이에 대한 예시는 아래에서 확인할 수 있습니다. |
설정 파일
접근 변환기를 사용하려면 모드참조\Config
디렉터리에 다음 형식의 AccessTransformers.ini
파일을 생성하십시오:
[AccessTransformers]
; 접근 변환기의 목적에 대해 주석을 남기고 싶다면 세미콜론을 사용할 수 있습니다
Friend=(Class="AFGSomeClass", FriendClass="UMyClass")
Accessor=(Class="AFGSomeClass", Property="mSomeProperty")
BlueprintReadWrite=(Class="/Script/FactoryGame.FGSomeClass", Property="mSomeProperty")
BlueprintCallable=(Class="/Script/FactoryGame.FGSomeClass", Function="SomeFunction")
하나의 파일에 각 접근 변환기 유형을 여러 개(또는 없이) 가질 수 있지만,
모두 동일한 [AccessTransformers]
섹션 헤더 아래에 있어야 합니다.
대상 클래스
모든 접근 변환기는 Class 필드에 대상 클래스(또는 구조체)를 지정해야 합니다.
이는 변환기가 수정하는 클래스입니다.
"/Script/CppModuleName.ClassName"
형식으로 지정해야 합니다.
클래스 이름을 Class 필드에 지정할 때 언리얼 유형 접두사(U
, F
, A
등)를 제거하십시오.
예를 들어, FFootstepEffectSurface
구조체는 클래스 이름 필드에서 FootstepEffectSurface
를 사용해야 합니다.
문제 해결
올바르게 작성되지 않았거나 더 이상
존재하지 않는 필드를 참조하는 접근 변환기는
컴파일 시와 출력 로그에서 다음과 같은 오류 메시지를 표시할 것입니다:
Unused <변환기 유형> for class <클래스 이름>, <추가 정보>. Requested by <모드참조>
.
이 오류 메시지가 표시되면 접근 변환기에 오타가 있거나 해당 접근 변환기 유형을 올바르게 사용하지 않은 것일 수 있습니다.
정의
접근기
public 메서드 FORCEINLINE PropertyType GetSomeProperty() { return mSomeProperty; }
와 FORCEINLINE void SetSomeProperty(PropertyType SomeProperty) { mSomeProperty = SomeProperty; }
를 생성합니다.
Friend를 사용할 수 없는 클래스에서 필드에 접근하려 할 때 유용합니다. 아래는 PowerSuit의 FEquipmentStats 구조체에 대한 사용 예시입니다.
// 이렇게 하는 대신...
SuitCostToUse = Parent->EquipmentParent->mCostToUse;
// ...이렇게 하십시오
SuitCostToUse = Parent->EquipmentParent.GetmCostToUse();
BlueprintReadWrite
지정된 UPROPERTY에 BlueprintReadWrite
를 추가하여 블루프린트에서 해당 프로퍼티에 접근할 수 있게 합니다.
UPROPERTY
가 아닌 필드에는 추가할 수 없습니다.
또한 private BPRW 충돌 검사를 우회하여(컴파일 시에만 적용되며 에디터나 게임에는 영향을 미치지 않음)
게임 헤더를 수정할 필요가 없게 합니다.
로딩
SML3.5.0부터 BlueprintReadWrite와 BlueprintCallable 접근 변환기는 런타임에 적용되므로,
적용하기 위해 C++를 다시 빌드하거나 에디터를 다시 시작할 필요가 없습니다.
.ini
파일을 수정하자마자 에디터에서
변경사항이 적용되었다는 알림이 표시될 것입니다.
자세한 내용은 출력 로그를 확인하십시오.
블루프린트 노드를 검색할 때 변경사항이 나타나지 않으면,
노드 검색 팝업에서 "컨텍스트에 따라"를 체크했다가 해제해보고,
그래도 작동하지 않으면 에디터를 다시 시작해 보십시오.
Friend와 접근기 변환기는 적용되려면 C++를 다시 빌드해야 합니다.
주의사항
헤더 생성기는 AccessTransformers.ini
파일의 마지막 수정 날짜를 기준으로
접근 변환기를 다시 빌드할지 결정합니다.
따라서 파일을 수정(예: 세미콜론 주석 추가/제거와 같은 라인 추가나 제거)하여
다시 빌드가 필요하다는 것을 인식하게 해야 할 수 있습니다.
이런 상황이 발생하는 예로는 다른 모드의
코드를 프로젝트로 가져올 때가 있습니다.
해당 파일들의 변경 날짜가 마지막 빌드 시점보다 훨씬 이전일 수 있어서
생성기가 실수로 해당 파일의 변환기를 빌드하지 않을 수 있습니다.
접근 변환기 시스템은 현재 전방 선언을 사용하는 필드를 지원하지 않습니다.
전방 선언을 사용하는 필드의 예로는 AFGSavedWheeledVehiclePath
의 mTargetList
프로퍼티가 있습니다.
접근 변환기는 엔진 클래스를 수정할 수 없습니다.
미리 빌드된 엔진을 사용할 때는 UHT가 엔진 클래스에 대한 |
접근 변환기는 게임 헤더를 수정하지 않고도 private 멤버에 접근할 수 있게 해주지만, 이는 여전히 게임 코드를 수정하는 것입니다. 게임 업데이트로 인해 접근하려는 필드나 함수가 변경되거나 제거될 수 있으므로, 이를 사용할 때는 주의해야 합니다. |
예시
아래는 각 접근자 타입을 사용하는 AccessTransformers.ini의 예시입니다. 일부 Friend 클래스는 Area Actions 모드에서 가져온 것입니다.
[AccessTransformers]
Friend=(Class="AFGBuildableFactory", FriendClass="UAACopyBuildingsComponent")
Friend=(Class="AFGBuildableConveyorBase", FriendClass="UAACopyBuildingsComponent")
Friend=(Class="AFGBuildableConveyorBase", FriendClass="AAAClearInventories")
Friend=(Class="AFGHologram", FriendClass="UAACopyBuildingsComponent")
Accessor=(Class="AFGBuildableFactory", Property="mInventoryPotential")
BlueprintReadWrite=(Class="/Script/FactoryGame.FGSchematicManager", Property="mPurchasedSchematics")
BlueprintCallable=(Class="/Script/FactoryGame.FGDismantleInterface", Function="Dismantle")
EditAnywhere=(Class="/Script/FactoryGame.IconData", Property="ID")
BlueprintType=(Struct="/Script/FactoryGame.WorldScannableData")
블루프린트 에셋 속성 추적 예시
예를 들어, 블루프린트 에셋 Holo_Foundation
의 mMaxZoopAmount
속성을 블루프린트에서 읽고 쓰게 만들고 싶다면,
해당 에셋의 부모 C++ 클래스를 확인해야 합니다
(에셋을 열면 UE 에디터의 오른쪽 상단에 표시됨).
이를 접근 변환기의 Class
로 사용하면 됩니다.
부모 C++ 클래스가 또 다른 부모 클래스를 가질 수 있다는 점에 주의하십시오.
찾고자 하는 속성을 찾기 위해 여러 클래스를 검색해야 할 수 있습니다.
이 예시에서는 속성이 AFGFoundationHologram
클래스에 속하므로,
아래의 접근 변환기를 사용해야 합니다.
이렇게 하면 AFGFoundationHologram
의 자식인 모든 에셋 의 mMaxZoopAmount
속성이 블루프린트에서 읽고 쓸 수 있게 됩니다.
[AccessTransformers]
BlueprintReadWrite=(Class="/Script/FactoryGame.FGFoundationHologram", Property="mMaxZoopAmount")