UDN
Search public documentation:

MasteringUnrealScriptBaptismByFireJP
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

第 2 章 : UNREALSCRIPT における最初の試練

始めてプログラムの作成を学んだり、もっと単純に新しい言語を学んだりする時は、新たな旅の開始ということを意識して、とても気が滅入ってしまうかもしれません。 UnrealScript のプログラミングの中には、数々の複雑な多くの概念についての知識が必要になります。 UnrealScript の深みに飛び込む前に、かなり簡単なスクリプトを作成して、準備をしておきましょう。スクリプトの作成で使用される概念の詳細な説明は行いません。その代わりに、本章は、UnrealScript を使って実際にどのようなものかアイデアが浮かんでクルのと同時に、計画から実行のための実装までのスクリプト作成のプロセスに慣れるための機会を提供してくれます。この練習問題を完了するには UnrealScript 言語の知識は不要ですが、始めるに触れておくべき、いくつかの将来利用する基本的な概念があります。

2.1 基本構文

UnrealScript の開発者は、 C++ および Java プログラマに馴染み深い言語を要求しましたので、新規の言語の設計時に C 形式の言語としました。この基本的な意味は、 (基本的に 1 行のコードの) 文はセミコロン (;) で終了する、また、中かっこ内 ({ }) で命令のグループを囲むというような同じ様な構文を言語に対して持つということです。

コードを入力する際には、本質的に、希望する機能を作成するために、識別子、キーワード、演算子およびコメントの組を何度も繰り返します。これらの概念のそれぞれについて簡単に見て行きましょう。

識別子およびキーワード

識別子は、クラス、変数および関数の名前のような参照を行いたい項目に対してプログラマが与える名前です。 UnrealScript では、すべての識別子は、大文字と小文字を区別しません、すなわち、 RegenPerSecond、 REGENperSECOND および ReGeNpErSeCoNd は、すべて同じ識別子とみなされます。

識別子の名前の提供時には、識別のため若干のルールがあります :

1. すべて識別子は、文字または下線 (_) で始まらなければなりません

2. その後ろには、文字、数字または下線の任意の組み合わせが続きます

3. 識別子には、空白を含むことはできません

4. 識別子は、キーワードと同じものにはできません。

有効な識別子のいくつかの例を以下に示します :

  ___ValidIdentifier
  Valid_Identifier
  Valid123Identifier456
  

いくつかの無効な識別子の例です :

  3_Invalid
  Inv@lid
  Invalid Identifier
  class
  

キーワードは、特定の機能に関連してコンパイラによって予約された特別な単語です。サンプルスクリプト内で、次のような、いくつかの異なるキーワードを今まで見てきました : class function var defaultproperties。識別子と同様に、キーワードも大文字と小文字を区別しません。

式および演算子

式は、値、演算子のグループであり、評価された時に保存可能なある意味のある値を生成するエンティティを形成するグループ化されたシンボルです。以下にいくつかの式の例を挙げます :

  100
  8 + (3 – 2) * 7
  2 * PI
  

演算子は、オペランドと呼ばれる項目の値を操作する特別な関数です。すべての興味深い式が利用するオペランドは、式には不可欠な部分です。上記の式の例にも次の演算子が使われていました : + () *

演算子および式は、どのプログラムでも基本的な部分です。そのため、これらは、以降の章でかなり詳しく取り上げられます。今は、本章の残りに進む際に、十分理解できる範囲を提供しましょう。

コメント

コメントはソースコードに対する説明を提供するために使用されますが、コンパイラでは完全に無視されます。それらは、しばしば、関数が何を行い、その引数が何に使われるかを説明するために使用されます。コメントは、プロジェクトで共同作業している時に特に重要で、他のプログラマはコメントを読み、簡単にコードを理解できます。コードは、すぐに、他人に、また、作成者でさえも、時間が経ってからは、適切な文書や説明書がなければさっぱりわからないものになりがちです。

コメント付けは、更に、テストおよびデバッグの際に利用されます。コードの一部分は "コメントアウト" できます、すなわち、もはや認識されず実行されなくなります。この方法は、コードの問題のある部分を見つけるため、また、 2 つの似た部分のコードの差異を見つけるために使用できます。この用途で、コメントを使用すると、コードの削除および再入力の手間が省かれ、全体の処理がより簡単で効率的になります

UnrealScript は、 2 つのタイプのコメント構造をサポートしています :

  // ラインコメント
  /* ブロックコメント */
  

ラインコメントは、スラッシュのペア (//) で始まり、行の終わりに到達するまでのコメントです。ブロックコメントは、コンパイラに、開き (/*) および閉じ (*/) コメントタグの間の任意の内容を無視するように指示します。

以下は、コメントを追加した時にスクリプトの例の一部がどのようになるかを示しています。

  /* 本クラスは、健康値を毎秒自動回復する機能をプレーヤーに
     提供しています。 */
  class UTMutator_SuperRegen extends UTMutator;
  
  // ヒットポイントの数は毎秒リストアされるべきです。
  var() float RegenPerSecond;
  
  function InitMutator(string Options, out string ErrorMessage)
  {
     SetTimer( 1.0, true /* 本タイマーは、繰り返し呼び出されるべきです */ );
     Super.InitMutator( Options, ErrorMessage );
  }
  

2.2 REGENERATION(自動回復) Mutator

コースの次のいくつかのセクションでは、新規のMutatorを作成しましょう。 Unreal 内のMutatorは、ある方法で標準のゲームの機能を変更するスクリプトです。これは、マップ上のすべての武器をロケットランチャーで置き換えるような簡単なものかもしれませんし、プレーヤーの視点を自分から第三者のものに変えるようなもっと複雑なものかもしれません。この例では、プレイ中に毎秒指定した量だけ、プレーヤーの健康値を自動回復するMutatorを利用しましょう。

以前の章で述べたように、 ConTEXT は、本書のすべての例およびチュートリアルで使用されるテキストエディタとなります。 ConTEXT を使用する計画があるならば、「付録 B : Unreal Engine 3 用に ConTEXT を設定する」に従って確実に設定してください。 WOTGreal を使用する計画があるならば、「付録 C : Unreal Engine 3 用に WOTGreal を設定する」を参照してください。

クラスに関する計画

コードを書き始める前に、スクリプトに実際に何を行わせるべきかの個別計画を作成することが重要です。既にMutatorはプレーヤーの健康値を毎秒自動回復するべきであることを述べました。これは、良いスタートですが、機能の十分な具体化を助けるため、いくつかの質問が可能です。

  • どのように健康値を自動回復することに取り組むつもりか ?
  • すべてのプレーヤーの健康値を自動回復するべきか ? ボットは ?
  • 毎秒どれくらいの健康値を自動回復するべきか ?
  • 時間の数値は設定可能にすべきか ?
  • どの点まで健康値は自動回復し続ける必要があるのか ?
  • 健康値を自動回復すべきでない状況はあるのか?

この例では、すべての制御されたプレーヤーキャラクタの健康値の自動回復は行うがボットの自動回復は行わないMutatorを作成しましょう。これを実行する最も簡単な方式は、ゲーム内の Pawn を、自動回復を行う機能を持つ Pawn クラスで置き換えることです。自動回復の量は、 1 秒ごとに 10 単位として、設定変更はできません。プレーヤーの健康値は、許可された最大健康値になるまで自動回復を続けます。自動回復は、プレーヤーが苦痛を起こすように設定されたボリューム内に配置された時には発生すべきではないので、Mutatorを設計する時に、この状況が説明される必要があります。

チュートリアル 2.1 – REGENERATION Mutatorの調査

この時点で、ちょっとした調査が役に立ちます。実際のコーディングに掛かる前に、解決しなければならないいくつかの問題があります。初めに、自動回復を取り扱う自前のクラスでゲーム内のすべてのプレーヤーを置き換える何らかの方法が必要です。次に、任意の条件下でプレーヤーに許可された最大の健康値、または、その値を示す変数のどちらかを見つける必要があります。最後に、苦痛を引き起こすボリュームの内部にプレーヤーがいる時を、識別するための何らかの方法が必要です。

特定の情報を見つけたい時にどこを見るかを知ることは、しばしば難しい問題となる可能性があります。 Unreal のクラスともっとなじみ深くなれば、探しているものが見つけやすくなることが分かるでしょう。 1. GameInfo クラスは、ゲームタイプに関する機能を操作します。ゲームで使用されるデフォルトポーンクラスを、自分自身のものと置き換える方法を探すには、良い開始点となるでしょう。 ../Engine/Classes ディレクトリ内に格納された GameInfo.uc スクリプトを見つけて、オープンしてください。

2. あるキーワードの場所を示すために、テキストエディタに組み込まれた検索機能を使用すれば、多くの場合に探しているものを見つけるためにはうってつけの方法となります。ゲーム内で Pawns に使用されるクラスの設定をすべて探すので、 PawnClass が、検索するための用語には良いでしょう。文書の先頭から検索していることの確認は重要です、そうすれば、見過ごすものはありません。


図 2.1 – “PawnClass”という用語で GameInfo クラスを検索中の Find Text ダイアログ

3. 最初に Ctrl + F を押して、キーワード PawnClass で Actor クラスの検索を実施してください。表示された Find Text ダイアログの Find What フィールドに“PawnClass”の用語を入力してください。また、 From the top オプションへのチェックを確実に行ってください。最後に、 Find をクリックします。

最初の一致は以下のようになります :

var class DefaultPawnClass;

これは、探していたもののようです。Mutator内のこの変数の値をオーバーライドすることで、自動回復を行う Pawn クラスをゲームで使用することができるはずです。この最初の問題を解決すれば、残りの情報の検索に注意を振り向けることができます。

4. プレーヤーを取り扱う時、答えを探し始める最初の場所は UTPawn クラスに対するスクリプトの中です。これは、 Unreal Tournament 3 内でプレーヤー制御および AI 制御のキャラクタに対するクラスです。 ../UTGame/Classes ディレクトリ内に格納されている UTPawn.uc スクリプトを見つけてオープンしてください。

5. 始めに、検索を実行するために Ctrl + F を押してください。 Find what フィールド内に、用語 "Health" を入力して、 From the top オプションを選択してください。検索を開始するために Find を押してください。


図 2.2 – Find Text ダイアログは、用語 "Health" を UTPawn クラスで検索します

サーチが見つけるべき最初の項目は、次のものです :

var int SuperHealthMax; /** 増加する健康値の最大限許可された値 */

その通り ! これは、探していたものに違いありません。この情報を入手すれば、スクリプト記述に必要な最後の情報の部分の検索に移ることが可能です。

6. Unreal に関するレベルの設計またはスクリプトのどちらについても全く経験が無い場合は、この最後の検索で何を探したらよいかが分からないかもしれません。 Volumes(ボリューム) は Unreal の中でスペースの領域を定義するために使用される方式です。これらのボリュームのいくつか、特に PhysicsVolunes は、それらを含むスペースの物理プロパティに影響すると同様に、 bPainCausing プロパティを使用してそれらの中に位置する任意のプレーヤーに苦痛を与えることに影響します。このちょっとした知識から、キーワード bPainCausing を検索することに気がつきます。手始めに UTPawn クラス内を検索することは、理にかなっていますが、このサーチは何ら有効な結果を生まないかもしれません。親の Pawn クラスに移ることが、次の論理的な選択となるでしょう。

../Engine/Classes ディレクトリに位置している Pawn.uc スクリプトをオープンしてください。

7. 再度、検索を実行するために Ctrl + F を押してください。 Find what フィールド内に“bPainCausing”の用語を入力して From the top オプションを選択してください。検索を開始するために Find を押してください。


図 2.3 – “PhysicsVolume”の単語で Actor クラスを検索している Find Text ダイアログ

8. この検索に一致する最初のものは、以下のようなものです :

  //Pain タイマーは失効したばかりです。
  //
  //発生ダメージを基にして、自分のいるゾーン (およびどのパートか) を確認して
  // Breath Time をリセットする
  
  function bool IsInPain()
  {
     local PhysicsVolume V;
  
     ForEach TouchingActors(class'PhysicsVolume',V)
        if ( V.bPainCausing && (V.DamagePerSec > 0) )
           return true;
     return false;
  }
  

もう一度、探していたものを見つけました。

しっかりとした計画を立てて、必要な情報をすべて入手したら、自動回復Mutatorに対するコードを書き始めることが可能です。

チュートリアル 2.2 – 初期 PAWN クラス設定

1. まだ、オープンしていなければ、 ConTEXT をオープンしてください。

2. カスタム Pawn クラスのコードの記述を始めるために必要なものは、新規のスクリプトファイルです。 File メニューから、 New を選択するか、ツールバー内の New File ボタンを押下してください。


図 2.4 – New File ボタン

3. 本新規ファイルに対して UnrealEd または UnrealScript ハイライタを選択するために Select Active Highlighter ドロップダウンを使用してください。選択するハイライタは、インストールしたものが何かと個人の好みに依存します。


図 2.5 – Select Active Highlighter ドロップダウン

4. コードの記述が開始できるようになりました。任意の新規のスクリプトの最初の部分は、クラス宣言でしょう。これは、スクリプトに名前を与え、親クラスがどれかを決めるところです。一行目に、以下のように入力してください :

class UTPawn_SuperRegen extends UTPawn;

この一行のコードで、クラスに UTPawn_SuperRegen という名前を付けます。また、このクラスが UTPawn クラスから継承されることも指定しました。これは、基本的に、追加した任意の機能と同様に、このクラスには UTPawn クラスのすべての機能を含むことを意味します。

5. 毎秒プレーヤーの健康を自動回復する量を示すために 1 つの変数を使用します。 Enter を 2 回押して、 3 行目に次のコードを入力してください。

var int RegenPerSecond;

本変数には、次のステップにおける初期値が与えられますが、後に健康値を修正する時まで実際には使用されません。

6. 初期クラス設定の最後の部分は、 defaultproperties ブロックの生成を含みます。これは、作成するクラスのプロパティに対する値を保持します。 Enter を何度か押して、以下を入力してください :

  defaultproperties
  {
     RegenPerSecond = 10
  }
  

ここでは、 RegenPerSec 変数に初期値を与えることと同様に、本Mutatorに対するグループの名前を指定します。

7. これで、クラスの初期設定は終了します。この時点までのコードは以下のようになります :

  class UTPawn_SuperRegen extends UTPawn;
  
  var int RegenPerSecond;
  
  
  
  defaultproperties
  {
     RegenPerSecond=10
  }
  

8. これは常に良い考えですが、作業成果を失わないように、ここでスクリプトを保存しましょう。 File メニューから、 Save as … を選択してください。オープンしたダイアログで、これらのディレクトリの一つに移動します :

Windows XP では :

C:\Documents and Settings\[User Name]\My Documents\My Games\Unreal Tournament 3\UTGame\Src

Windows Vista では :

C:\Users\[User Name]\Documents\My Games\Unreal Tournament 3\UTGame\Src

9. Src ディレクトリの中に新規 Folder(フォルダ) を生成してください。


図 2.6 – Save As ダイアログ内の Create New Folder ボタン。

この新規フォルダに MasteringUnrealScript という名前を付けてください。


図 2.7 – MasteringUnrealScript という名前の新規フォルダが作成されました。

10. このディレクトリをオープンして、もう一つ新規フォルダを作成してください。このフォルダに Classes という名前も付けてください。


図 2.8 – Classes という名前の新規フォルダが生成されました。

11. 最後に、 Save as type フィールド内で UnrealScript (*.uc) が選択されていることを確認してスクリプトの名前として UTPawn_SuperRegen を入力してください。


図 2.9 – Pawn スクリプトは、命名されて、保存する準備ができました。

もちろん、この時点で、クラスに追加した機能は全くありません。次のチュートリアルで追加していきましょう。

チュートリアル 2.3 – 自動回復タイマーの設定

新規の Pawn クラスを作成したら、標準の UTPawn クラスとは区別される機能を追加する時です。その機能は、この Timer が毎秒実行されることを確実にする方式と同じく、実行されると毎回プレーヤーの Health を増やす Timer 関数の設定も含みます。

1. 前回のチュートリアルに続いて、 ConTEXT 内で UTPawn_SuperRegen.uc をオープンしてください。

2. RegenPerSecond 変数の宣言の後に、以下の入力を行い Timer 関数を宣言してください :

  function Timer()
  {
  }
  

Timer は、指定した時間経過後に呼び出される特別な型の関数であり、繰り返しを強制することもできます。この点は、この場合の目的には適した理想的なものとなります。

3. ここでは、 Timer 関数に対していくつかの機能を追加してみましょう。開き中かっこ ({) の後ろにカーソルを置き、 Enter を押してください。それから、コードのこの部分をインデントするために Tab を押してください。以下のコードを入力してください :

  if (Controller.IsA('PlayerController') && !IsInPain() && Health<SuperHealthMax)
  {
  }
  

この部分のコードは、ちょっと見ると複雑に見えるかもしれませんが、実際はかなり簡単なものです。部分に分けてみると、理解しやすいかもしれません。

  if ()
  {
  }
  

これは、 If 文で始まっています。これは、基本的に、かっこ内の式が true であれば、中かっこ ({}) 内に置かれたコードが実行されるということです。

Controller.IsA('PlayerController')

この部分のコードは、 Pawn がプレーヤー制御かどうかを確認しています。プレーヤー制御であれば、次のコード部分に移ります。

IsInPain()

この式は、この Pawn が、苦痛を与えるボリューム内にあるかどうかを確認しています。もしそうでなければ、 (! 記号に注意) 次のコード部分に移動します。

Health < SuperHealthMax

この式は、健康値に許可された最大値より、この Pawn の Health が小さいかどうかを調べています。もし、小さければ、中かっこ ({}) の間のコードが実行されます。

4. If 命令の開き中かっこ ({) の後ろにカーソルを置き Enter を押してください。それから、この部分のコードをインデントするために Tab を押してください。以下を入力してください :

Health = Min(Health+RegenPerSecond, SuperHealthMax);

ここでは、 Health の現在の値を取得し、自動回復の値を加えます。それから、この値は、健康値に許された最大値と比較され、その 2 つの値の小さな方が、 Pawn の Health に代入されます。基本的に、これは、許される最大値で、結果の健康値の上限を定めながら、自動回復を実行します。

5. Timer 関数自身は、これで完成し、以下のようになります :

  function Timer()
  {
     if (Controller.IsA('PlayerController') && !IsInPain() && Health<SuperHealthMax)
     {
        Health = Min(Health+RegenPerSecond, SuperHealthMax);
     }
  }
  

6. 更に、この Timer が毎秒実行されることを確実にする方法が必要で、その結果、実際の自動回復が行われます。以前、タイマーは、特別な型の関数ですと説明しました。タイマーを開始するために、 SetTimer を呼び出す他の関数を実行しなければなりません。この SetTimer 関数への呼び出しをどこに置き、プレイの開始時に実行されるようにするかが唯一の実際の問題です。たまたま、すべての Actors には、プレイ開始直後に実行されて、 PostBeginPlay を呼び出す十分にふさわしい関数があります。

RegenPerSecond 変数の宣言の下、 Timer 関数の上に以下の内容を入力してください :

  simulated function PostBeginPlay()
  {
  }
  

Simulated という新しいキーワードが使用されていることにお気づきかもしれませんが、これは後に触れる予定の複雑なトピックであるネットワークと関係して実行する必要があります。

7. PostBeginPlay 関数の開き中かっこの後ろにカーソルを置き、 Enter を押してください。それから、この部分のコードをインデントするために Tab を押してください。以下の内容を入力してください :

  Super.PostBeginPlay();
  
  SetTimer(1.0,true);
  

本関数の最初の行は、 PostBeginPlay 関数が親クラス内で実行されるべきことを示しています。これは、 PostBeginPlay の UTPawn 版がこの時点で呼び出されることを意味します。それから、 2 行目はタイマーを開始します。これは、 1.0 秒ごとに実行されて、ループを設定します。

8. このコードを書き終わったら、カスタム Pawn クラスも完成したはずです。 Pawn クラス全体は、以下のようになります :

  class UTPawn_SuperRegen extends UTPawn;
  
  var Int RegenPerSecond;
  
  simulated function PostBeginPlay()
  {
     Super.PostBeginPlay();
  
     SetTimer(1.0,true);
  }
  
  function Timer()
  {
     if (Controller.IsA('PlayerController') && !IsInPain() && Health<SuperHealthMax)
     {
        Health = Min(Health+RegenPerSecond, SuperHealthMax);
     }
  }
  
  defaultproperties
  {
     RegenPerSecond=10
  }
  

9. 作業結果を失わないように ConTEXT 内の UTPawn_SuperRegen.uc ファイルを保存してください。

カスタム Pawn クラスが完成しましたので、次のステップはMutatorクラス自身に対するコードの記述を開始します。これには、次のチュートリアルで取り組みましょう。

チュートリアル 2.4 – Mutatorスクリプト

1. まだ、オープンしていなければ ConTEXT をオープンしてください。

2. File メニューから New を選択するか、ツールバー内の New File ボタンを押してください。

3. 希望する UnrealScript ハイライタを選択するために、ツールバー内の Select Active Highlighter ドロップダウンを使用してください。

4. 新規スクリプトの 1 行目に、以下のコードを入力してください :

class UTMutator_SuperRegen extends UTMutator;

Pawn クラスと同様に、この行は、このクラスに UTMutator_SuperRegen という名前を付けて、追加する任意の機能と共に UTMutator クラスに組み込まれた機能のすべてを持つMutatorとなるように指定します。

5. Enter を 2 度押して、スクリプトに次のコードを追加してください。

  simulated function PostBeginPlay()
  {
  }
  

カスタム Pawn クラスで見たように、 PostBeginPlay 関数は、とても早い時期に実行されるはずです。この関数内で、 GameInfo の DefaultPawnClass を自分自身のカスタム Pawn クラスのコードを置き換えます。

6. ここで、開き中かっこの後ろにカーソルを置いて、 Enter を押してください。それから、この部分のコードをインデントするために Tab を押して、以下を入力してください :

  Super.PostBeginPlay();
  
  WorldInfo.Game.DefaultPawnClass = class'MasteringUnrealScript.UTPawn_SuperRegen';
  

このコードの 1 行目は、親クラスの PostBeginPlay 関数の実行をおこないます。これは、 PostBeginPlay 関数内に在る何らかの基本的な動作の実行を保証します。 2 行目は、Mutatorクラスの本体を含んでいます。 WorldInfo.Game は、単に現在の GameInfo を参照しています。その DefaultPawnClass 変数にアクセスして、カスタム Pawn クラスを使用する設定をしています。

7. Mutatorクラスのコーディングを終了するために残っていることは、 defaultproperties ブロックを追加することです。PostBeginPlay 関数の後ろに以下のコードを追加してください。

  defaultproperties
  {
     GroupNames[0] = "PLAYERMOD"
  }
  

GroupNames 配列は、Mutatorに単にラベルを付ける方法で、相互に衝突する可能性のあるMutatorを同時にロードすることを防ぎます。これは、他のMutatorが自分自身のカスタム Pawn で Pawn を置き換える可能性があるので重要です。これは、我々のMutatorでは無用のものである効果をオーバーライドするでしょう。同時にロードされる可能性のあるグループ名に合致する 2 つのMutatorは存在しないので、これにより、あるMutatorが他のMutatorをオーバーライドしないようにします。基本的に、このMutatorが実施することを表すため PLAYERMOD というラベルを選びました。

8. Mutatorクラスは完成したはずです。Mutatorクラスの全体は以下のようになります :

  class UTMutator_SuperRegen extends UTMutator;
  
  simulated function PostBeginPlay()
  {
     Super.PostBeginPlay();
  
     WorldInfo.Game.DefaultPawnClass = class'MasteringUnrealScript.UTPawn_SuperRegen';
  
  }
  
  defaultproperties
  {
     GroupNames[0] = "PLAYERMOD"
  }
  

9. UTPawn_SuperRegen.uc スクリプトと共に MasteringUnrealScript/Classes ディレクトリ内に新規スクリプトを保存してください。このスクリプトには、 UTMutator_SuperRegen.uc という名前を付けてください。


図 2.10 – Mutatorスクリプトは名前を付けられ、保存する準備ができています

チュートリアル 2.5 - スクリプトのコンパイル

Mutatorのコーディングが完了したら、処理の次のステップは、スクリプトをコンパイルすることです。これは、 UTEditor.ini ファイルの設定と同時にコンパイラの実行を含みます。何らかのエラーが検出された場合は、それらを修正する必要があり、コンパイル処理を再度行う必要があります。

1. コンパイル処理の最初のステップは、 UTEditor.ini 内の ModPackages のリストに MasteringUnrealScript パッケージを追加することです。このステップの実行を行わないと、コンパイラは新しいスクリプトを検索することができないため、コンパイルされません。

以下のディレクトリに移ってください :

..\My Games\Unreal Tournament 3\UTGame\Config

2. UTEditor.ini ファイルを探して、編集できるように Notepad 、または、その他のテキストエディタでオープンしてください。

3. [ModPackages] の見出しを持つ .ini ファイルのセクションを検索してください。このセクションを発見する簡単な方法は、 ModPackages でファイル内を検索することです。

4. 以下の行の最後にカーソルを置き、 Enter を押してください。

ModOutputDir=..\UTGame\Unpublished\CookedPC\Script

5. コンパイルされるパッケージのリストに MasteringUnrealScript パッケージを追加するために以下の行を追加してください。

ModPackages=MasteringUnrealScript

6. UTEditor.ini ファイルを保存して、クローズしてください。

7. 以前の章で述べたように、コンパイラ、または、厳密には Make コマンドレットを実行するにはいくつかの方法があります。本書の残りの部分では、スクリプトをコンパイルすると簡単に指示されることになり、どのように実行するかを決めるのは読者の選択となります。ここでは、以下の 1 つを選択してください :

  • 付録 B の指示に従って ConTEXT を設定している場合は、コンパイル処理を開始するために ConTEXT 内で F9 を押すだけでよいです。
  • make スイッチ付きで UT3.exe へのショートカットを作成している場合は、それを実行してください。
  • ゲームまたはエディタを実行して、プロンプトに応じてスクリプトのコンパイルを選択してください。
  • UT3 インストールディレクトリの Binaries へ移動して、次のコマンドを実行してください : UT3.exe make

8. エラーが無いと仮定すれば、コンパイル実施プロセスは正しく終了し、 ..\UTGame\Unpulished\CookedPC\Script ディレクトリ内に MasteringUnrealScript.u ファイルを生成するはずです。


図 2.11 – Make コマンドレットの成功時の出力。

チュートリアル 2.6 – Mutatorの公開およびテスト

この時点まで、確かにすべてが正しくなっているかを確認する時です。作成したMutatorが動作するかを知るただ 1 つの方法は、Unreal Tournament 3 の内部で充分にテストを行うことです。前回までのチュートリアルで作成したスクリプトパッケージは Unpublished ディレクトリ内にあります。ゲームは、デフォルトでは、 Published ディレクトリ内にあるコンテンツだけを認識します。ここでは、 2 つの選択肢が残されています。

  • MasteringUnrealScript.u パッケージを Published ディレクトリにコピーする
  • –useunpublished フラグを使用して、 Unreal Tournament 3 を実行する

この例では、最初の選択肢を使用して、スクリプトパッケージを Published ディレクトリに置くことにします。スクリプトは、テクスチャ、メッシュ、サウンド等、 Unpublished ディレクトリ内に置かれるかもしれないコンテンツパッケージ内に置かれる他のコンテンツにはなんら依存していませんから、先に進み、スクリプトパッケージを publish(公開) しない理由はありません。このようなケースで無ければ、 -useunpublished フラグを使用したテストを実施して行くのもよい考えかもしれません。

1. ..My Games\Unreal Tournament 3\UTGame\ ディレクトリに移動してください。この場所には現在は Published フォルダは存在しないと仮定して、 Published という名前の新規フォルダを作成してください。

2. Published ディレクトリの中に、他の新規フォルダを作成して、 CookedPC と名付けてください。

3. CookedPC ディレクトリをオープンして、 Script という名前の最終フォルダの 1 つを作成してください。

4. MasteringUnrealScript.u スクリプトパッケージを ..\Unpublished\CookedPC\Script フォルダから新規に作成した ..\Published\CookedPC\Script ディレクトリへコピーしてください。

5. Unreal Tournament 3 を実行して、 Instant Action ゲームを選択してください。


図 2.12 – Unreal Tournament 3 メインメニュー。

6. 次の画面で Deathmatch ゲームタイプを選択してください。


図 2.13 – Unreal Tournament 3 の Gametype 選択画面。

7. リストから希望のマップを選択してから、画面の上部にあるメニューから Settings を選択してください。

8. Settings 画面の下部から Mutators を選択して、Mutator 選択画面にアクセス可能です。


図 2.14 – Mutator 選択画面は、 Gametype Settings 画面からアクセスされます。

9. ひとたび、 Mutator 選択画面をオープンしたら、左側のリストから UTMutator_SuperRegen Mutatorを選択して、画面の下部から Add を選んでください。


図 2.15 – Enabled Mutators リストに SuperRegen mutator を追加する。

10. 最後に、次の画面から Start Game の選択の Mutator 選択画面上で Accept をクリックしてください。ゲームが開始されると、 健康値が最大値199 になるまで自動的に回復されます。


図 2.16 – プレーヤーの健康値は 199 まで回復される。