구성

키 할당을 구현하고 싶다면, 레지스트리 페이지의 모드 키 할당 레지스트리 섹션을 확인하십시오.

SML은 기본값을 기반으로 구성 구조를 쉽게 정의할 수 있는 편리한 구성 시스템을 제공합니다. 이러한 기본값은 사용자가 게임 내 모드 메뉴에서 또는 파일 시스템에서 json 파일을 편집하여 변경할 수 있습니다.

이러한 구성 파일은 게임 부팅 시 자동으로 로드되어 사용자가 지정한 값으로 기본값을 덮어씁니다.

그러면 모드는 이 설정 데이터에 접근하여 이러한 정적 사용자 입력에 따라 동작을 변경할 수 있습니다.

모드 구성 시스템 사용하기

  1. ModConfiguration을 상속하는 새 블루프린트를 만드십시오. 이름은 "<모드 참조>_Config" 또는 비슷하게 지으십시오.

  2. '모드 참조’를 여러분의 모드 참조로 설정하고 표시 이름과 설명을 원하는 대로 구성하십시오.

  3. 루트 섹션을 BP Config Property Section으로 설정하십시오.

  4. 루트 섹션 > 구성 속성 > "Section Properties"에 구성하고자 하는 항목을 넣으십시오. 왼쪽은 속성 이름, 오른쪽은 유형입니다. 구성에 하위 범주를 만들고 싶다면, 속성 유형으로 BP Config Property Section을 다시 사용하십시오. 원한다면 구성 속성에 대한 맞춤 위젯을 정의할 수 있고, 그렇지 않으면 SML이 속성 타입에 따라 자동으로 위젯을 선택합니다.

  5. 콘텐츠 브라우저에서 구성 애셋을 우클릭하십시오.

    • C‍+‍+에서 구성에 접근하고 싶다면, "Generate C‍+‍+ Configuration Header"를 선택하고, 헤더를 플러그인의 소스 폴더에 저장하십시오.

    • 다음으로, "Regenerate Configuration Structs"를 선택하면, SML이 모드의 설정 구조체를 자동으로 생성합니다. 매우 편리하죠! 설정을 변경할 때마다 이 작업을 다시 해야 한다는 점에 유의하십시오.

  6. 아직 만들지 않았다면 모드를 위한 게임 인스턴스 모듈을 만드십시오. 그리고 그곳의 Mod Configurations 아래에 구성을 지정하십시오. 방금 만들었다면 루트 모듈로 표시하는 것을 잊지 마십시오.

구성 미리보기

멋진 SML 메뉴 미리보기 위젯을 사용하여 게임에서 보이는 것처럼 모드 설정을 미리볼 수 있습니다! 콘텐츠 브라우저에서 SMLEditor Content/Menu Preview로 이동하여 SML_MenuPreviewWidget을 우클릭한 다음, "에디터 유틸리티 위젯 실행"을 선택하십시오. 창을 전체 화면으로 하는 것이 좋습니다.

미리보기에서 모드의 구성을 보려면, 콘텐츠 브라우저에서 ModConfiguration을 선택한 다음, 미리보기 창 안에서 Set Selected Mod Config 버튼을 누르십시오. 아래로 스크롤하여 설정 UI를 확인하십시오.

블루프린트에서 구성 시스템 사용하기

다음 이미지는 블루프린트에서 구성 시스템을 사용하는 방법을 보여줍니다. 이미지

아래는 위 이미지에 대한 텍스트 설명입니다.

구성에 대한 참조 만들기

구성과 상호작용하려면 먼저 참조를 만들어야 합니다:

  • 블루프린트 안에서 'MC to ConfigProperty’라는 노드를 추가하고 입력 클래스를 구성의 클래스로 설정하십시오.

  • 방금 만든 노드에서 출력 핀을 끌어와서 'BP_ConfigPropertySection’으로의 형변환 노드를 만드십시오.

속성에 대한 참조 만들기

구성의 속성에 대한 참조를 만들려면 ConfigPropertySection에 대한 참조가 필요합니다. 아직 하지 않았다면 위 섹션을 참고하십시오.

  • ConfigPropertySection에서 "To Section" 노드를 검색하십시오. 이 노드가 필요로 하는 문자열 입력은 가져오려는 속성의 키입니다.

값 가져오기

구성에서 속성의 값을 가져오려면 해당 속성에 대한 참조가 필요합니다. 아직 하지 않았다면 위 섹션을 참고하십시오.

  • "To Section" 노드의 출력 핀을 끌어와서 "CP to"를 검색하십시오. 이는 유형에 맞는 여러 "CP to " 노드를 나열할 것입니다. 값을 가져오려는 구성 속성의 유형을 선택하십시오. "CP to" 노드의 출력 핀이 구성 속성의 값을 제공합니다.

  • 구성에 Config Section의 중첩 레이어가 있다면, 다른 'BP_ConfigPropertySection’으로의 형변환을 사용하고, 필요에 따라 계속해서 최종 값에 도달할 수 있습니다.

값 설정하기

구성에서 속성의 값을 설정하려면 해당 속성에 대한 참조가 필요합니다. 위의 "속성에 대한 참조 만들기" 섹션을 참고하십시오.

  • 먼저 속성을 올바른 유형으로 형변환해야 합니다. "To Section" 노드 출력 핀을 끌어와서 "BP_ConfigProperty"를 검색하십시오. 이는 다양한 BP_ConfigProperty 클래스로의 형변환 노드를 나열할 것입니다. 값을 가져오려는 구성 속성의 유형을 선택하십시오.

  • 형변환 출력 핀에서 "Set Value"를 검색하고 설정하려는 새 값을 할당하십시오.

값을 변경한 후 구성 저장하기

코드에서 구성 속성을 변경하고 저장하고 싶다면, 구성 시스템에 명시적으로 변경 사항을 저장하라고 알려야 합니다. 구성에 대한 참조가 필요합니다. 위의 "설정에 대한 참조 만들기" 섹션을 참고하십시오.

  • To Instance 노드의 출력 핀에서 끌어와서 "Mark Dirty" 함수를 검색하십시오. 이것이 전체 구성을 저장합니다.

원한다면 하나의 속성만 저장할 수도 있습니다. 그러려면 "To Section" 노드의 출력을 입력으로 사용하여 "Mark Property Dirty" 함수를 사용하십시오.

추가 예시

모든 유효한 필드와 에디터에서 어떻게 보이는지에 대한 훌륭한 시범을 위해 ExampleMod의 설정을 확인하십시오. 맞춤 위젯(맞춤 버튼 포함)도 확인해 보십시오.

블루프린트 코드에서 구성 값을 읽는 방법에 대한 더 자세한 예시는 ExampleModGameInstanceModule에서 ExampleMod가 어떻게 하는지 확인하십시오.

C‍+‍+에서 구성 시스템 사용하기

이 섹션은 SML 구성 시스템이 아직 개발 중일 때 작성되었습니다. 따라서 일부 내용이 오래되었으며, 여전히 작업 중입니다. 이 시스템을 사용하고 싶다면 이 대화를 참고하고 디스코드에서 도움을 요청하십시오.

블루프린트로 설정을 구현하고 싶다면, SML 블루프린트 인터페이스가 제공하는 헬퍼 함수에 대해 읽어보고 ExampleMod를 확인하십시오.

구성 관리자

구성 관리자는 게임에 로드된 모든 구성을 관리하는 게임 인스턴스 서브시스템입니다.

이는 등록된 구성을 로드하고 저장할 수 있습니다.

등록된 모드 구성은 더티로 표시될 수 있습니다. 이는 사용자가 구성 값을 변경했고 이러한 변경 사항을 저장해야 한다는 의미입니다.

구성을 로드할 때, 먼저 기본값을 기반으로 구성 값이 로드됩니다. 그런 다음, 또는 관리자가 지시받을 때, 구성 파일을 로드하고 파싱하여 이러한 구성 파일에 정의된 변경 사항을 로드된 구성 값에 적용합니다.

구성의 '스키마’와 '값’을 구분하는 것이 중요합니다. 스키마는 클래스나 구성이 어떻게 구조화되고 어떤 속성을 가지는지에 대한 선언처럼 작동합니다. 값은 기본적으로 스키마에 설명된 대로 구조화되어야 하는 실제 구성 값입니다.

ReloadModConfigurations(bool bSaveOnSchemaChange)

등록된 모든 모드 구성을 디스크에서 다시 로드합니다. 선택적으로 스키마 변경 사항을 저장합니다.

FlushPendingSaves()

로드된 구성 인스턴스의 모든 변경 사항을 파일 시스템에 저장합니다.

MarkConfigurationDirty(FConfigId ConfigId)

주어진 ID로 참조되는 구성을 더티로 표시하고 저장 대기 상태로 만듭니다.

FillConfigurationStruct(FConfigId ConfigId, <struct>)

주어진 구성 id로 참조되는 활성 구성에서 얻은 데이터로 전달된 구조체를 채웁니다.

UUserWidget CreateConfigurationWidget(FConfigId ConfigId, UUserWidget Outer)

주어진 구성 id로 참조되는 활성 구성에 대한 구성 위젯 계층을 만듭니다.

RegisterModConfiguration(FConfigId ConfigId, SubclassOf<UModConfiguration> Configuration)

주어진 구성을 주어진 구성 ID로 등록합니다.

시작 시에만 호출되어야 합니다.

FConfigId

구성이 속한 모드와 범주로 구성된 구성 식별자입니다.

FString ModReference

이 구성의 부모 모드를 참조하는 모드 참조입니다.

FString ConfigCategory

이 구성의 카테고리나 이름입니다. 이는 기본적으로 동일한 모드에 대한 여러 구성을 추가로 식별할 수 있게 해줍니다.

UModConfiguration

UModConfiguration은 기본적으로 구성의 전체 스키마를 보유하는 객체입니다.

이는 디스크립터처럼 작동하므로, 구조는 클래스(즉, 기본 객체)에만 정의되면 되어 UClass를 전달하는 것만으로도 스키마(즉, 모드 구성)를 참조할 수 있습니다.

즉, 자신만의 구성 스키마를 정의하고 싶다면 이것을 기반으로 새 클래스를 만들어야 합니다. 그런 다음 기본값이나 생성자에서 변경 사항(스키마 자체와 추가 메타데이터 정의)을 적용합니다.

FString DisplayName

사용자에게 보이는 이 구성의 표시 이름입니다.

FString Description

사용자에게 보이는 이 구성의 설명입니다.

UConfigPropertySection RootSection

구성 스키마의 루트 "노드"를 보유합니다.

이는 인스턴스화 가능한 변수로, 에디터의 "defaults" 패널에서 이 객체의 인스턴스를 인라인으로 만들고 기본값을 정의할 수 있습니다.

UConfigProperty

구성 속성은 기본적으로 특정 값을 설명하는 구성 스키마의 노드입니다.

이는 최종적으로 구성 값을 만드는 데 사용됩니다.

자식 클래스의 기본값도 인스턴스화 가능하므로 스키마를 더 정의할 수 있습니다.

FString DisplayName

사용자에게 보이는 이 속성의 표시 이름입니다.

FString Tooltip

사용자가 속성 위에 마우스를 올렸을 때 보이는 이 속성의 짧은 설명입니다.

SubclassOf<UConfigValue> GetValueClass()

속성이 기반으로 하는 구성 값의 유형을 검색할 수 있게 합니다.

ApplyDefaultPropertyValue(UConfigValue Value)

주어진 구성 값 객체를 이 속성의 기본값으로 채웁니다.

UConfigValue CreateNewValue(UObject Outer)

이 속성의 유형을 기반으로 새 구성 값을 만들고 이 속성이 정의한 기본값으로 채웁니다.

UUserWidget CreateEditorWidget(UUserWidget* ParentWidget)

이 속성이 설명하는 구성 값을 편집할 수 있는 위젯 인스턴스를 만듭니다.

FConfigVariableDescriptor CreatePropertyDescriptor(UConfigGenerationContext Context, FString OuterPath)

코드 생성을 위한 구성 속성 디스크립터를 만듭니다.

구성 속성 자식 클래스들

UConfigProperty를 상속하는 여러 클래스들이 있으며, 각각 특정 유형의 속성을 설명합니다.

다음과 같은 모든 주요 프리미티브에 대한 클래스가 있습니다:

  • bool

  • int

  • float

  • string

  • class

  • color

더 복잡한 구성 구조를 가능하게 하는 두 가지 특별한 클래스도 있습니다.

UConfigPropertyArray

구성 값 배열을 사용하면 동일한 유형의 여러 값을 리스트에 저장할 수 있습니다.

이를 위해 ElementValue 속성이 있으며, 이를 통해 이러한 리스트 항목의 유형을 정의할 수 있습니다.

리스트는 동적이므로, 리스트의 항목 수는 사용자가 정의한 내용에 따라 달라질 수 있습니다.

UConfigPropertySection

구성 값 섹션을 사용하면 하나의 객체에 서로 다른 유형의 여러 값을 저장할 수 있습니다.

가질 수 있는 각 항목에 대해 해당 항목의 유형을 설명하는 하나의 속성이 있습니다.

이를 통해 기본적으로 중첩된 구성을 가질 수 있어 더 복잡한 구성 구조가 가능합니다.

설정 값

UConfigProperty에 대한 값이 있습니다.

이는 기본적으로 속성이 설명하는 값을 보유합니다.

실제 상태나…​ 파일/기본값에서 로드된 설정과 같은 것입니다.

UConfigProperty GetAssociatedProperty()

이 값을 설명하는 속성을 반환합니다.

FString DescribeValue()

값을 문자열로 변환합니다.

디버깅 목적으로 유용합니다.

URawFormatValue Serialize(UObject Outer)

값을 원시 구성 형식으로 변환합니다.

Deserialize(URawFormatValue Value)

주어진 원시 구성 형식의 값을 이 값의 유형으로 변환하여 이 값 객체에 저장합니다.

FillConfigStruct(FReflectedObject ReflectedObject, FString VariableName)

주어진 구성 구조체를 참조하는 속성과 이 값이 제공하는 데이터로 채웁니다.

InitializedFromProperty()

구성 값이 연관된 속성으로 초기화될 때 호출됩니다.

MarkDirty()

값을 더티로 표시합니다. 즉, 파일 시스템과 동기화해야 함을 나타냅니다.