UDN
Search public documentation:

ConfigSavegameSystemKR
English Translation
日本語訳
中国翻译

Interested in the Unreal Engine?
Visit the Unreal Technology site.

Looking for jobs and company info?
Check out the Epic games site.

Questions about support via UDN?
Contact the UDN Staff

UE3 홈 > 인풋 / 아웃풋 > 환경설정 시스템을 사용한 게임 저장

환경설정 시스템을 사용한 게임 저장


문서 요약: 표준 환경설정 시스템을 사용하여 게임저장 시스템을 생성하는 방법에 대한 설명입니다.

개요


언리얼 엔진의 환경설정 시스템은 매우 강력하여 여러가지 설정을 저장하는 용도 이상으로 활용할 수 있습니다. 이 문서에 RPG류 게임용 게임저장 시스템을 만드는 방법을 제시합니다.

게임저장 시스템은 UI 데이터저장 시스템 및 PerObjectConfig 지시어의 효과적인 사용을 기반으로 합니다.

이 문서대로 따르기 전, 언리얼 엔진에서 환경설정 파일이 어떻게 작동하는지를 이해하기 위해 ConfigurationFiles 문서를 참조하십시오.

Sapitu


Sapitu (Savegames Are Possible In The UDK(UDK에서 게임저장 가능)의 약자)는 RPG류 게임용 간단한 게임저장 시스템을 구현합니다. 캐릭터와 인벤토리를 저장하는 기능을 합니다.

여기를 클릭하여 이와 같은 예제의 소스 코드 전부를 다운받을 수 있습니다.

Sapitu는 4개의 클래스로 나뉘어 있습니다. 또한 다운로드는 SapituGameSapituPC 의 2개 추가 클래스로 구성되며, 게임 내에서 Sapitu 시스템으로 플레이할 때만 사용됩니다.

Sapitu의 네 클래스는 다음과 같습니다:

  • Sapitu : 게임저장 시스템의 여러 부분을 관리하는 주 클래스입니다.
  • SapituCharacter : 캐릭터 정보를 저장하는 클래스입니다.
  • SapituInventory : SapituCharacter 에 속할 수 있는 인벤토리 저장 클래스입니다.
  • SapituItem : SapituInevntory 아이템이 생성되는 데이터베이스 레코드로 사용되는 클래스입니다. 이 클래스의 인스턴스는 게임 내에서 읽기 전용입니다.

Sapitu 클래스

이 클래스는 새 캐릭터의 생성 및 로딩을 관리하는 몇몇 메서드를 정의합니다. 또한 새 인벤토리 아이템을 생성하는 메서드를 포함하며, 아이템 데이터베이스의 레퍼런스를 유지합니다.

아이템 데이터베이스

loadItemDB 메서드는 SapituItem 인스턴스의 데이터베이스를 초기화하며, 환경설정 파일에 있는 SapituItem 인스턴스의 모든 정의를 요구합니다. 이는 언리얼 엔진의 UI 데이터저장 시스템의 일부입니다. 이 시스템은 UT3의 게임유형, 맵, 무기에 관한 정보를 얻을 때도 사용됩니다.

getItem 메서드는 현재 데이터베이스의 실제 SapituItem 인스턴스에서 해당 오브젝트의 이름(Object.name 속성)을 찾아볼 수 있는 방법을 제공해 줍니다. 이 이름(이라기 보다는 식별자)은 내부의 이름입니다. 최종 게임에서 플레이어에게 이 이름이 표시될 일은 없을 것입니다.

아이템 데이터베이스는 인벤토리 시스템이 인벤토리 아이템의 정적인 정의를 찾아보는데 쓰입니다. 또한 새 인벤토리 아이템을 만드는데도 참조됩니다.

캐릭터

Sapitu 클래스는 SapituCharacter 인스턴스를 로드하고 생성하는 시작점이기도 합니다. 캐릭터 시스템은 일반 환경설정 시스템과 PerObjectConfig 클래스 지시어를 활용합니다.

getCharacters 메서드는 모든 등록 캐릭터의 ID 목록을 반환합니다. 데이터베이스 상의 아이템 식별자처럼, Object.name 속성을 참조합니다. 사람이 알아보기 위한 것이라기 보다는, 내부 식별자입니다. 이 식별자는 캐릭터의 로딩 및 생성시 요구됩니다. 이름이 사용되는 방법 때문에 중요한 제한 사항이 있습니다. 이름에 공백이나 영숫자가 아닌 문자를 포함시킬 수 없습니다. id 에는 영숫자만 사용하는 것이 최적입니다.

캐릭터의 로딩 및 생성은 실제로 비슷합니다. 이 둘 모두가 사용하는 코드는 다음과 같습니다:

myChar = new(none, "MyCharId") class'SapituCharacter';

마법은 새 연산자에 대한 두 번째 파라미터에 있습니다. 얘가 생성하려는 오브젝트의 이름을 정의합니다. SapituCharacter 캐릭터가 PerObjectConfig 으로 정의되어 있기에, 해당 이름의 오브젝트용 환경설정을 불러오게 됩니다.

Sapitu에서 캐릭터의 생성과 로딩을 명확히 구분하기 위해, 해당 식별자가 존재하는 지를 먼저 검사한 후 로딩이나 생성을 승인 또는 거부합니다.

캐릭터 로딩은 적절한 인스턴스 생성에 의해 끝나지 않습니다. 인벤토리를 초기화할 필요도 있습니다. SapituCharacterSapituInventory 아이템에 대한 식별자 목록(SapituCharacter.inventoryRecord)을 저장합니다. 비슷한 식으로 이 아이템은 SapituCharacter.inventory 인벤토리 아이템 인스턴스의 목록에 생성 및 추가됩니다. 정확한 구현 사항은 loadCharacter 메서드를 참조하십시오.

인벤토리 아이템 생성

인벤토리 아이템은 특별한 방법으로 생성해야 합니다. 인벤토리 아이템은 특정 SapituItem 인스턴스에 기반합니다. createInventory 메서드는 해당 SapituItem 인스턴스에 기반하여 인벤토리 아이템을 신설합니다. 인벤토리 인스턴스에 대한 고유 식별자를 구성한 뒤, 인벤토리 아이템을 생성하기 위한 특수 생성자 new(none, inventoryId) class'SapituInventory' 를 실행합니다. 그 후 SapituItem 인스턴스에 의해 대충 정의되었던 레벨, 무게, 가치와 같은 여러 변수들을 초기화하게 됩니다.

생성된 인벤토리 항목은 실제로 아무 캐릭터에도 소속되지 않으며, 저장 파일에도 저장되지 않습니다. 고로 게임을 나갈 때 이 인스턴스도 잃게 됩니다. 이 아이템 저장 사항은 캐릭터 인스턴스의 인벤토리에 이 인벤토리 아이템이 존재할 때, 캐릭터 인스턴스에 남겨지게 됩니다.

SapituCharacter 클래스

이 클래스는 다음과 같이 정의되어 있습니다:

class SapituCharacter extends Object config(Sapitu) perobjectconfig;

클래스의 특정 변수는 환경설정 파일 UDKSapitu.ini 에 저장되며, 각 오브젝트에 대해 별개의 섹션이 생성된다는 뜻입니다. 후자는 perobjectconfig 클래스 지시어의 결과입니다. 오브젝트 이름은 섹션 이름 일부를 정의하기 때문에, 인스턴스를 저장할 때 중요한 부분입니다.

이 클래스는 캐릭터 이름에 대해 체력 등의 (사람이 알아보기 편한) 여러 환경설정 변수를 정의합니다.캐릭터 인벤토리는 다른 방식으로 저장됩니다. 오브젝트 변수는 환경설정 변수가 될 수 없기 때문에, 모든 인벤토리 아이템의 (문자열) 식별자 레코드를 유지합니다. 그리고 그 목록을 대신 저장합니다. 즉 인벤토리를 관리하기 위해 추가 관리가 필요하다는 뜻입니다.

인벤토리 아이템의 추가 및 제거는 addInventoryremoveInventory 메서드를 사용해야 합니다. 이 메서드는 inventoryinventoryRecords 배열을 다 갱신합니다. inventory 배열을 직접 수정해서는 안됩니다. Sapitu 클래스가 로딩중에 이를 수행하지만, 이는 특별 케이스입니다.

추가적으로 캐릭터의 저장은 별도의 방법으로 해야 합니다. SaveConfig 을 바로 호출하면, 인벤토리를 제대로 저장하지 못합니다. save 메서드는 각 인벤토리 배열을 통해 반복하며 각 아이템마다 SaveConfig 도 호출한 후, 마지막으로 그 자체에 대해 SaveConfig 을 호출합니다. 이 방법으로 캐릭터에 해당하는 모든 것이 제대로 저장됩니다.

주의: 인스턴스 SapituCharacterSapituInventory 도 Sapitu 시스템의 다른 곳에 저장되지 않습니다.

SapituInventory 클래스

이 클래스는 한 인벤토리 아이템의 실제 인스턴스입이며, SapituItem 클래스의 특정 인스턴스에 기반합니다. 이 클래스는 SapituCharacter 클래스와 동일한 방법으로 선언됩니다.

이 인스턴스는 SapituItem 기반이므로, 적절한 리퍼런스를 재생성하는데 있어서 특별한 주의를 요합니다. 이는 위에 언급한 바와 같이 Sapitu 클래스에 의해 수행됩니다.

SapituItem

이 클래스는 인벤토리 아이템이 생성되는데 사용할 아이템 유형을 정의합니다. 이 클래스는 읽기 전용 데이터베이스 항목으로 간주됩니다.

SapituCharacterSapituInventory 클래스와는 달리, 이 클래스는 UDKUIResourceDataProvider 의 하위클래스입니다. 부모 클래스가 환경설정 클래스로 이미 정의되었기 때문에, config 으로 선언되지 않습니다. PerObjectconfig 으로 선언됩니다.

다른 클래스와 마찬가지로 이는 config 변수 한 쌍을 정의하며, 아이템 정의를 생성하는데 사용됩니다.

기본속성 섹션의 bSearchAllInis=true 항목도 주의하십시오. 이 변수는 UI 데이터저장 시스템의 일부이며, 데이터저장 시스템이 이 아이템의 오브젝트를 찾는 데에 모든 환경설정 파일을 거쳐야 함을 정의합니다.

SapituItems 의 로딩은 위에 언급한 new(none,id) 생성자를 사용하지 말아야 합니다. 모든 SapituItem을 선언되게 하려면, 다음 코드를 사용해야 합니다:

class'UDKUIDataStore_MenuItems'.static.GetAllResourceDataProviders(class'SapituItem', ProviderList);

(Sapitu.loadItemDB 메서드 참조)

SapituItems 은 수동으로 설정됩니다. 실행시 절대 바뀌어서는 안됩니다. 아이템을 선언하려면 간단히 환경설정 파일을 생성하십시오. 그리고 이와 같이 항목을 추가하십시오:

[sword1 SapituItem]
DisplayName=Short sword
level=(min=1,max=10)
weight=(base=10,levelMult=0.5)
value=(base=5,levelMult=1)

자세한 예제는 소스의 UDKGame\Config\SapituItemDB.ini 파일을 참조하십시오.

게임저장 보관


캐릭터와 인벤토리 아이템은 UDKGame\Config\UDKSapitu.ini 파일에 저장됩니다. 기존 "savegame"은 다운로드 안의 파일을 살펴 보십시오. 동일한 파일에 모든 캐릭터와 인벤토리가 저장된 것을 확인할 수 있습니다.

평이한 텍스트로 저장된 것도 확인할 수 있습니다. 치트가 걱정되겠지만, 오프라인 싱글 플레이어 게임의 경우 치트를 막을 도리가 없습니다. 고로 파일의 내용이 텍스트냐 이진이냐는 중요하지 않습니다.

Sapitu 상태로 플레이하기


이 시스템으로 플레이하려면, 소스를 컴파일하고 다음과 같이 게임을 시작하십시오:

udk examplemap?game=sapitu.sapitugame

SapituPC 클래스에는 플레이시 사용할 수 있는 여러 콘솔 명령이 다음과 같이 정의되어 있습니다:

  • createChar name
  • saveChar
  • loadChar charId
  • printChars
  • showChar
  • createRandomItem
  • createItem baseItem
  • pickupItem itemId
  • pickupAll
  • findItems
  • listItemTypes

다운로드