UDN
Search public documentation:

ConfigSavegameSystemJP
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

設定システムを用いた Savegames

ドキュメントの概要: 標準の設定システムを使って savegame システムを作成する方法の説明。

ドキュメントの変更ログ: サンプル コードのバグを修正 (オブジェクト名の末尾に数字を使うことはできない)。

概要

Unreal Engine の設定 (configuration) システムは非常に強力なシステムで、各種設定の保存以外にも使い道があります。このドキュメントでは、RPG 系ゲームの savegame (ゲーム保存) システムを作成する方法を紹介します。

この savegame システムは、UI データストアシステムと PerObjectConfig ディレクティブを上手く使って完成させています。

このドキュメントの先に進む前に、ConfigurationFiles ドキュメントに目を通して Unreal Engine における設定ファイルの機能を理解しておいてください。

Sapitu

Sapitu (「Savegames Are Possible In UDK」の短縮形) は、RPG 系ゲーム用の簡単な savegame システムを実装したもので、キャラクターとそのインベントリを格納することができます。

このサンプルの完全なソースコードはここからダウンロードできます

Sapitu は 4 つのクラスに分かれています。ダウンロードファイルには 2 つのクラス (SapituGameSapituPC) が追加されていますが、これらはゲーム内から Sapitu システムを使ってプレイする場合のみ使用します。

Sapitu の 4 つのクラスは以下のとおりです。

  • Sapitu : savegame システムのさまざまな要素を管理するメインクラス。
  • SapituCharacter : キャラクター情報を格納するクラス。
  • SapituInventory : SapituCharacter に属するインベントリ項目。
  • SapituItem : SapituInevntory 項目を作成するためのデータベースレコードに使われるクラス。このクラスのインスタンスは、システム内部の読取り専用です。

Sapitu クラス

このクラスでは、新しいキャラクターの作成とロードを管理するメソッドが定義されています。新しいインベントリ項目の作成メソッドも含まれていて、項目データベースの参照を管理します。

項目データベース

メソッド loadItemDBSapituItem インスタンスのデータベースを初期化し、設定ファイル内のすべての SapituItem インスタンスの定義を要求します。これは Unreal エンジンの UI データストアシステムの一部で、UT3 の GameTypes?、マップや武器に関する情報を取得するのにも使われています。

getItem メソッドは、指定されたオブジェクト名 (Object.name プロパティ) の実際の SapituItem インスタンスを、現在のデータベースで検索する手段を提供するものです。 この名前 (または ID) は内部名で、完成したゲーム画面でこれをプレーヤーに表示することはまずないでしょう。

項目データベースは、インベントリシステムがインベントリ項目の静的定義を調べ、またはこれを参照して新しいインベントリ項目を作成するのに使用されます。

キャラクター

Sapitu クラスは、 SapituCharacter インスタンスのロードおよび作成の開始点にもなります。キャラクターシステムは、通常の設定システムと PerObjectConfig クラスディレクティブを利用します。

getCharacters メソッドは、登録されているすべてのキャラクターの ID リストを返します。 データベース内の項目の ID と同様に、これも Object.name プロパティを参照します。これはユーザーフレンドリーな名前ではなく、内部の識別子で、キャラクターのロードや作成時にこの ID が要求されます。このように使われるため、この名前には重要な制約事項があり、空白文字や英数字以外の文字を含めることはできません。ID には英数文字だけ使用することをお勧めします。

キャラクターのロードと作成は本当に似ていて、どちらも以下のコードを使用します。

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

このトリックは new 演算子の 2 番目のパラメータに隠されていて、作成するオブジェクトの名前をここで定義します。 SapituCharacter キャラクターは PerObjectConfig と定義されているので、指定されたその名前を持つオブジェクトの設定をロードします。

Sapitu におけるキャラクターのロードと新規作成を明確に区別したいので、指定された ID が存在するかどうかの確認を最初に行い、次にロード/作成を承認または拒否します。

適切なインスタンスを作成することでキャラクターのロードが終わるのではなく、そのインベントリを初期化しなければなりません。 SapituCharacter は、 SapityInventory 項目の ID のリスト (SapituCharacter.inventoryRecord) を格納します。これらの項目は同様の方法で作成され、インベントリ項目のインスタンスのリストに追加されます (SapituCharacter.inventory)。完全な実装については、 loadCharacter メソッドを参照してください。

インベントリ項目の作成

インベントリ項目は特別な方法で作成する必要があります。インベントリ項目は特定の SapituItem インスタンスに基づくもので、 createInventory メソッドは、この SapituItem インスタンスから新しいインベントリ項目を作成します。このインベントリ インスタンスに対応する一意の識別子を作成し、特別な new(none, inventoryId) class'SapituInventory' コンストラクタを実行してインベントリ項目を作成します。次に、 SapituItem インスタンスで大まかに定義されている各種の編集 (レベル、ウェイト、値など) を初期化します。

作成されたインベントリ項目はいずれのキャラクターにも属さず、実際のところ save ファイルにも保存されていません。そのため、ここでゲームを終了すると、このインスタンスも失われます。キャラクターインスタンスのインベントリにこのインベントリ項目が存在するときは、これらの項目の保存内容も残ります。

SapituCharacter クラス

このクラスの定義は次のとおりです。

class SapituCharacter extends Object config(Sapitu) perobjectconfig;

これは、クラスの一部の変数が設定ファイル UTSapitu.ini に保存され、各オブジェクトの変数に個別のセクションが作成されることを意味します。後者は perobjectconfig クラスディレクティブに起因します。セクション名はオブジェクト名を元に作成されるので、インスタンスを保存するときにオブジェクトの名前に注意する必要があります。

このクラスでは、キャラクター名 (人間にも識別しやすい名前)、体力などのさまざまな設定変数を定義します。キャラクターのインベントリは異なる方法で格納します。オブジェクト変数は設定変数にできないので、すべてのインベントリ項目の ID (文字列) を記録し、このリストを代わりに保存します。ということは、インベントリを管理するという追加作業が必要になります。

インベントリ項目の追加と除外は、 addInventoryremoveInventory メソッドを使って行う必要があります。これらのメソッドは、 inventoryinventoryRecords 配列の両方を更新します。 inventory 配列を直接変更してはいけません。 Sapitu クラスがロード中にこれを変更しますが、これは特別なケースです。

さらに、キャラクターの保存は別の方法で行う必要があります。 SaveConfig はインベントリを適切に保存しないので、これを直接呼び出すことはできません。 save メソッドはインベントリ配列を反復し、各項目に対して SaveConfig を呼び出し、次に SaveConfig を自己呼び出しします。これにより、このキャラクターに属する内容がすべて適切に保存されます。

注意: SapituCharacterSapituInventory のいずれのインスタンスも、Sapitu システム内の他の場所には保存されません。

SapituInventory クラス

このクラスは、インベントリ項目の実際のインスタンスです。 SapituItem クラスの特別なインスタンスに基づいて作成され、 SapituCharacter クラスと同じ方法で宣言されます。

このインスタンスは SapituItem に基づいているので、適切な参照を作成し直す際には特に注意が必要です。前述したように、この作業は Sapitu クラスによって行われます。

SapituItem

このクラスでは、インベントリ項目の作成に使用できる項目タイプを定義します。任意のデータベース項目と考えることができます。

SapituCharacterSapituInventory クラスとは異なり、このクラスは UTUIResourceDataProvider のサブクラスです。親クラスが既に conifg クラスとして定義されているので、 config として宣言せず、 PerObjectconfig として宣言します。

他のクラスと同様に、このクラスでも config 変数をいくつか定義します。これらは項目定義の作成に使います。

defaultproperties セクションにある bSearchAllInis=true エントリに注意してください。この変数は UI データストアシステムに属し、この項目のオブジェクトを見つけるために、データストアシステムがすべての設定ファイルを調べることを規定しています。

SapituItems のロードには、前述のnew(none,id) コンストラクタを使わないでください。宣言済みの SapituItem をすべてロードするには、以下のコードを使用します。

class'UTUIDataStore_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)

その他の例については、ソースファイル内の UTGame\Config\SapituItemDB.ini ファイルを参照してください。

savegame の格納

キャラクターとインベントリ項目は、ファイル UTGame\Config\UTSapitu.ini に保存されます。 ダウンロードファイルにある同ファイルで、既存の savegame を参照してください。すべてのキャラクターとインベントリは、同じファイルに保存されます。

さらに、これが標準テキスト形式である点にも注意してください。つまり、不正行為の対象となる可能性があります。 しかし、オフラインのシングルプレーヤーゲームなら、savegame の改ざんによってこれを常に行うことができるので、 savegame が標準テキストであってもバイナリファイルであっても関係ありません。

Sapitu を使ってプレイする

このシステムを使ってプレイするには、次の方法でソースをコンパイルしてゲームを開始します。

udk examplemap?game=sapitu.sapitugame

SapituPC クラスには、このシステムでプレイするのに使える多数のコンソールコマンドが定義されています。

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

まとめ

ここに示したシステムは、設定システムを使った savegame システムの作成方法の 1 つにすぎません。