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
中国翻译
한국어
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 つのクラス (SapituGame
と SapituPC
) が追加されていますが、これらはゲーム内から Sapitu システムを使ってプレイする場合のみ使用します。
Sapitu の 4 つのクラスは以下のとおりです。
-
Sapitu
: savegame システムのさまざまな要素を管理するメインクラス。 -
SapituCharacter
: キャラクター情報を格納するクラス。 -
SapituInventory
:SapituCharacter
に属するインベントリ項目。 -
SapituItem
:SapituInevntory
項目を作成するためのデータベースレコードに使われるクラス。このクラスのインスタンスは、システム内部の読取り専用です。
Sapitu
クラス
このクラスでは、新しいキャラクターの作成とロードを管理するメソッドが定義されています。新しいインベントリ項目の作成メソッドも含まれていて、項目データベースの参照を管理します。
項目データベース
メソッドloadItemDB
は SapituItem
インスタンスのデータベースを初期化し、設定ファイル内のすべての 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 (文字列) を記録し、このリストを代わりに保存します。ということは、インベントリを管理するという追加作業が必要になります。
インベントリ項目の追加と除外は、 addInventory
と removeInventory
メソッドを使って行う必要があります。これらのメソッドは、 inventory
と inventoryRecords
配列の両方を更新します。 inventory
配列を直接変更してはいけません。 Sapitu
クラスがロード中にこれを変更しますが、これは特別なケースです。
さらに、キャラクターの保存は別の方法で行う必要があります。 SaveConfig
はインベントリを適切に保存しないので、これを直接呼び出すことはできません。 save
メソッドはインベントリ配列を反復し、各項目に対して SaveConfig
を呼び出し、次に SaveConfig
を自己呼び出しします。これにより、このキャラクターに属する内容がすべて適切に保存されます。
注意: SapituCharacter
と SapituInventory
のいずれのインスタンスも、Sapitu システム内の他の場所には保存されません。
SapituInventory
クラス
このクラスは、インベントリ項目の実際のインスタンスです。 SapituItem
クラスの特別なインスタンスに基づいて作成され、 SapituCharacter
クラスと同じ方法で宣言されます。
このインスタンスは SapituItem
に基づいているので、適切な参照を作成し直す際には特に注意が必要です。前述したように、この作業は Sapitu
クラスによって行われます。
SapituItem
このクラスでは、インベントリ項目の作成に使用できる項目タイプを定義します。任意のデータベース項目と考えることができます。
SapituCharacter
や SapituInventory
クラスとは異なり、このクラスは 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