접근 변환기

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 <모드참조>. 이 오류 메시지가 표시되면 접근 변환기에 오타가 있거나 해당 접근 변환기 유형을 올바르게 사용하지 않은 것일 수 있습니다.

정의

Friend

클래스에 friend class UMyClass;를 추가하여 UMyClass가 AFGSomeClass의 모든 private 필드와 메서드에 접근할 수 있게 합니다.

접근기

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 충돌 검사를 우회하여(컴파일 시에만 적용되며 에디터나 게임에는 영향을 미치지 않음) 게임 헤더를 수정할 필요가 없게 합니다.

BlueprintCallable

지정된 UFUNCTION에 BlueprintCallable을 추가하여 블루프린트에서 해당 함수를 호출할 수 있게 합니다. UFUNCTION이 아닌 함수에는 추가할 수 없습니다.

EditAnywhere

지정된 UPROPERTY에 EditAnywhere를 추가하여 블루프린트 애셋과 인스턴스의 디테일 패널에서 프로퍼티를 수정할 수 있게 합니다.

BlueprintType

지정된 USTRUCT에 BlueprintType을 추가하여 해당 구조체를 블루프린트 노드로 만들거나 분할할 수 있게 합니다.

로딩

SML3.5.0부터 BlueprintReadWrite와 BlueprintCallable 접근 변환기는 런타임에 적용되므로, 적용하기 위해 C‍+‍+를 다시 빌드하거나 에디터를 다시 시작할 필요가 없습니다. .ini 파일을 수정하자마자 에디터에서 변경사항이 적용되었다는 알림이 표시될 것입니다. 자세한 내용은 출력 로그를 확인하십시오. 블루프린트 노드를 검색할 때 변경사항이 나타나지 않으면, 노드 검색 팝업에서 "컨텍스트에 따라"를 체크했다가 해제해보고, 그래도 작동하지 않으면 에디터를 다시 시작해 보십시오.

Friend와 접근기 변환기는 적용되려면 C‍+‍+를 다시 빌드해야 합니다.

주의사항

헤더 생성기는 AccessTransformers.ini 파일의 마지막 수정 날짜를 기준으로 접근 변환기를 다시 빌드할지 결정합니다. 따라서 파일을 수정(예: 세미콜론 주석 추가/제거와 같은 라인 추가나 제거)하여 다시 빌드가 필요하다는 것을 인식하게 해야 할 수 있습니다. 이런 상황이 발생하는 예로는 다른 모드의 코드를 프로젝트로 가져올 때가 있습니다. 해당 파일들의 변경 날짜가 마지막 빌드 시점보다 훨씬 이전일 수 있어서 생성기가 실수로 해당 파일의 변환기를 빌드하지 않을 수 있습니다.

접근 변환기 시스템은 현재 전방 선언을 사용하는 필드를 지원하지 않습니다. 전방 선언을 사용하는 필드의 예로는 AFGSavedWheeledVehiclePathmTargetList 프로퍼티가 있습니다.

접근 변환기는 엔진 클래스를 수정할 수 없습니다. 미리 빌드된 엔진을 사용할 때는 UHT가 엔진 클래스에 대한 .generated.h 파일을 생성하지 않기 때문입니다. 소스 빌드된 엔진에서 작동할지는 테스트되지 않았습니다.

접근 변환기는 게임 헤더를 수정하지 않고도 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_FoundationmMaxZoopAmount 속성을 블루프린트에서 읽고 쓰게 만들고 싶다면, 해당 에셋의 부모 C‍+‍+ 클래스를 확인해야 합니다 (에셋을 열면 UE 에디터의 오른쪽 상단에 표시됨). 이를 접근 변환기의 Class로 사용하면 됩니다. 부모 C‍+‍+ 클래스가 또 다른 부모 클래스를 가질 수 있다는 점에 주의하십시오. 찾고자 하는 속성을 찾기 위해 여러 클래스를 검색해야 할 수 있습니다.

이 예시에서는 속성이 AFGFoundationHologram 클래스에 속하므로, 아래의 접근 변환기를 사용해야 합니다. 이렇게 하면 AFGFoundationHologram의 자식인 모든 에셋mMaxZoopAmount 속성이 블루프린트에서 읽고 쓸 수 있게 됩니다.

[AccessTransformers]
BlueprintReadWrite=(Class="/Script/FactoryGame.FGFoundationHologram", Property="mMaxZoopAmount")