UDN
Search public documentation:

MasteringUnrealScriptClassesJP
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

第 3 章 – UNREAL 内のクラス

UnrealScript 言語に飛びつき、調べ始めたので、 UnrealScript 内のクラスの実装の調査を開始しましょう。より具体的には、 UnrealScript 内のクラスが表すものの概要が示され、特定のクラスがどのように取り扱われるかを決めるため、クラスを宣言する時に使用できる様々なキーワードの説明と共にクラスを宣言する方法を示します。

3.1 概要

クラスは、基本的には、それらのプロパティ、能力および動作を継承する新たなクラスを作成するために拡張されるか、それらのプロパティに対して自身の固有の値をそれぞれ持ち、お互いのインスタンスで独立して動作するゲーム内で利用するオブジェクトを生成するためにインスタンス化されることが可能な、プロパティ、能力および動作の組を指定するテンプレートです。これは Unreal および UnrealScript に関してどのような意味があるのでしょうか?基本的に、 UnrealScript で生成された個々のクラスは、ゲームの中で使用するためにオブジェクトの生成に使用される可能性があるゲームアイテムのタイプとなります。これは、すぐに識別が可能でプレーヤーの目に触れるアイテムから、舞台裏の支援者として他のアイテムから滅多に使用されないアイテムまでの範囲となる可能性があります。例としては、武器と乗り物、または、ネットワーク経由で複写する目的のため、プレーヤーの重要なプロパティの値を保持するために使用される PlayerReplicationInfo 等があります。

3.2 NATIVE(ネイティブ) 対 NON-NATIVE(非-ネイティブ)

最も基本的なレベルでは、 UnrealScript のクラスには 2 つの型があります : native(ネイティブ) および non-native(非-ネイティブ) です。 native(ネイティブ) クラスは、単に native(ネイティブ) コードまたは、エンジンの native(ネイティブ) 言語 (この場合は C++ となります) で記述されたコードを持つクラスです。 native(ネイティブ) クラスは、 UnrealScript で記述されたコードも全く使用しないのではありません、関連する C++ コードを持っているだけです。ゲーム内に存在する低レベルクラスの多くは、かなり複雑な機能を持ち native(ネイティブ) コードの速度性能が役に立つため、native(ネイティブ) クラスです。Non-native(非-ネイティブ) クラスは、 UnrealScript 内で限定的に記述されます。すべてのクラスは native(ネイティブ) クラスの Object(オブジェクト) からの拡張を最小限としなければなりませんが、それでも、継承を通じて関連した native(ネイティブ) コードを持ちます。しかし、自身の native(ネイティブ) コードという区別はありません。 native(ネイティブ) クラスの作成を行うとエンジンのソースコードのリビルドが必要なため、記述するすべてのクラスは、 non-native(非-ネイティブ) となるでしょう。

3.3 クラス宣言

UnrealScript 内に新しいクラスを作成するために、クラス宣言を含んだ新しい UnrealScript ファイルを作成しなければなりません。個々の UnrealScript ファイルには、 1 つのクラス宣言のみを含むことができ、そのため、 Unreal 内では、単一のクラスを表します。クラス宣言は、スクリプトの最初の行にあり、それでも最小限の内容として、作成するクラスの名前と、拡張元のクラス、または親クラスの名前が記述されています。宣言には、次のセクション内で説明される 1 つ以上のキーワードまたは Class Specifier も記述することができます。以下はクラス宣言の一般的な形式です :

class ClassName extends ParentClassName;

これをテンプレートとして使用して、以下のように基底の Vehicle クラスからの機能を継承する PickupTruck という名前の新たな vihicle(ビークル) クラスを宣言できます :

class PickupTruck extends Vehicle;

* 注記 :* クラスの名前と、それを含む UnrealScript(.uc) ファイルの名前は、同一でなければなりません。さもないとコンパイル処理が失敗するので留意が重要です。

EXTENDS キーワード

上記のクラス宣言の例で、 Extends キーワードが使用されていることにお気づきかもしれません。このキーワードは基本的には "~からの継承" を意味します。すべてのクラスは他のクラスから拡張、または継承、されなければなりません。これに関する唯一の例外は、 Object クラスで、 UnrealScript 内の他のすべてのクラスの基底クラスであるためです。 1 つのクラスが他のクラスから継承される時は、継承元のクラスの変数、関数、状態等をすべて含みます。 UnrealScript 内でクラスを作成する時は、通常 Actor または、そのサブクラスの 1 つから、拡張を行いますが、独立した場合には、 Object から拡張することも可能です。

チュートリアル 3.1 初めてのクラス宣言

本章のチュートリアルは、クラス宣言を記述するだけなので、かなり単純になります。クラスを生成し、これらの宣言がクラスの外観と動作にどのように影響するかに集中しているため、これらのクラスは、この時点では、実際には何も実施しません。この最初のチュートリアルでは、 Actor クラスから拡張されたクラスを作成します。 1 度作成すれば、新規のスクリプトをコンパイルし、それから、新規クラスがエンジンによって認識され Actor Classes Browser 内に表示されることを確かめるために UnrealEd をオープンしてください。

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

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


図 3.1 – New File ボタン。

3. Select Active Highlighter ドロップダウンを使用して、インストール済みの UnrealScript ハイライタを選択してください。


図 3.2 – Select Active Highlighter ドロップダウンメニュー。

4. 新規スクリプトファイルの 1 行目に、以下のテキストを入力してください :

class ExampleClass extends actor;

まさにこれです ! これで、クラスの宣言は完了し、全く新しいクラスの生成が技術的には完成しました。

5. 以前の章で作成した ..\Src\MasteringUnrealScript\Classes ディレクトリ内にファイルを保存してください。 新規スクリプトファイル ExampleClass.uc は新規クラスの名前に合わせて名前を付けてください。

6. スクリプトをコンパイルするために Make コマンドレットを実行してください。以前の章と同様に、この方法は選択して実施が可能です。スクリプトが問題無くコンパイルされたら、 UnrealEd を起動してください。

7. もし、まだオープンしていなければ、Generic Browser(ジェネリックブラウザ) をオープンし、 Actor Classes タブに切り替えてください。 ExampleClass は、クラス階層ツリー内に一覧表示されていないことに注意してください。これは、 Placeable Classes Only? オプションのトグルがオンになっていて、 ExampleClass クラスが配置可能 (placeable) で無いからです。


図 3.3 – Placeable Classes Only? オプションがチェックされています。

Uncheck the Placeable Classes Only? オプションのチェックを外してください、そうすれば、階層リスト内に新規の ExampleClass クラスが表示されることに気づくでしょう。


図 3.4 – オプションのチェックが外されたら ExampleClass クラスは、階層内に表示されます。

8. マップ内で ExampleClass クラスのインスタンスの配置を試みる際が、このケースにあたることが分かるでしょう。 DVD 上で提供された DM_TestRoom.ut3 マップをオープンしてください。 Actor Classes Browser 内の ExampleClass を選択して、パースペクティブビューポート内の部屋のフロア上で右クリックしてください。このクラスが配置可能な場合は、コンテキストメニューに Add ExampleClass here に対するオプションがあります。 このクラスは配置可能ではありませんので、このオプションが存在しないことが明確に分かります。


図 3.5 – ExampleClass クラスのインスタンスを追加するためのオプションはありません。

Unreal クラス階層のクラスの一部を宣言する方法を見てきました。このクラスは、基本的に Actor クラスのコピー以上のものでは無く、マップ内に配置できません。次のチュートリアルでは、非常に基本的ですが、 Unreal Engine 内の非常に重要なスクリプティングの概念である、レベル内の配置が可能なクラスを生成するため、ここで学んだことを拡張していきます。マップ内にアイテムを置くことができないと、デザイナーの仕事は基本的に不可能になるでしょう。

<<<< チュートリアルの終了 >>>>

3.4 CLASS SPECIFIERS(クラス指定子)

Class Specifiers(クラス指定子) は、コンパイラまたはエンジン自身にクラスに対して、ある特徴を指定するキーワードです。これらのキーワードのそれぞれについて、以下に説明します :

NATIVE(PACKAGENAME)

Native 指定子はそれに関連する native(ネイティブ) コードを持つクラスにラベルを付けます。これは、エンジンがクラスの C++ の宣言および実装を検索することを意味します。この指定が存在しなければ、エラーが発生します。 Native(ネイティブ) クラスは、 native(ネイティブ) 関数を宣言し、 native(ネイティブ) インタフェースを実装できるクラスの存在を識別する、ただ一つの方法です。関数やインタフェースについては、説明を行っていませんので、今の時点では、このことは、よく理解できないかもしれませんが、これらは、あとで詳細に説明されますので、その時に、この直前の一文の意味が明らかになります。

(PackageName) は、クラスが存在するパッケージの名前を参照します。コンパイラは PackageName +Classes.h という名前を持つ C++ ヘッダファイルの内のクラスに対する宣言を自動生成するためにこの名前を使用します。すなわち、もし、 Package 名が以下のように指定されたら :

Class NativeClass extends Actor Native(MasteringUnreal);

このクラスの native(ネイティブ) 宣言は、 MasteringUnrealClasses.h ファイルの内部に置かれます。

NATIVEREPLICATION

NativeReplication 指定子は native(ネイティブ) クラスの中のみで意味を持ち、クラスに属する変数の値が native(ネイティブ) コード経由で複写されることを示します。

DEPENDSON(CLASSNAME[,CLASSNAME,...])

DependsOn 指定子は、同一パッケージ内の複数のクラスで、他のクラスの前に特定のクラスをコンパイルする必要がある依存関係を持つ時に、コンパイル実行の順序を決めるために使用されます。かっこの中に記載されたクラスまたは複数のクラスは、指定子を含むクラスの前にコンパイルされます。これは、現在のクラスが、他のクラス内で宣言された構造体や列挙型にアクセスすることが必要な時に役に立ちます。現在のクラスが最初にコンパイルされた場合は、コンパイラは構造体や列挙型の存在が分かりませんので、エラーとなります。 DependsOn 指定子を追加することで、他のクラスが最初にコンパイルされることが確実になり、コンパイラは構造体や列挙型について知ることができます。

ABSTRACT

Abstract 指定子は、決して、そのクラスのレベル内への配置や、インスタンス化を許さないことをエンジンに伝えます。これは、他の広範囲なクラスに対する基底クラスとなりますが、ゲーム自体の内部のレベル内では、直接使用されないようなクラスに対して使用されます。 Unreal のオブジェクト指向の性質のために、いくつかのクラスがゲーム自身の中で使用されないことは、実際に拡張性の観点からも好ましいですが、充分にあり得ます。それらのクラスは、いくつかの他のクラスに対して、ある共通な性質を持つ基底として提供されます。この点を説明するため、いくつかのビークル(車両)をゲームに追加したいものとしましょう。すべてのビークルには、移動する、武器を持つ可能性がある、ドライバーがいる可能性があるなどの共通な事柄があります。汎用的なコードは、ビークルの移動、武器の使用、ドライバーの配置を操作するため、 1 つの基底 Vehicle クラスに組み込むことができます。この基底 Vihicle クラスは、メッシュや実際の武器を割り当てていない可能性が高いため、それ自身では正しく動作しませんので、 Abstract 指定子を使用して、ゲーム内で使用するべきではありません。 Vehible クラスから拡張された、すべての個別のビークルは、自身のクラスで、それぞれのビークルに特有のメッシュと武器を割り当てて、それからゲームの中で使用されます。

DEPRECATED

Deprecated 指定子は、既に使用しなくなったクラスを宣言する時に使用されます。これは、クラスを最初に作成した時には決して使用されないはずのキーワードです。希望する機能を実行する他のクラスやメソッドのため、クラスがもはや使用されなくなった時に使われます。このような場合に、古くなったクラス宣言は、 Deprecated 指定子を使用して変更されます。再コンパイルを実施したら、ゲーム内で使用されたこのクラスの任意のインスタンスはエディタの内部にロードされますが、警告を表示し、もはや保存は許されません。これにより、デザイナーに新しいクラスの保存による既存のクラスの置き換えを強制します。 deprecated(廃止された) クラスから拡張されたすべてのクラスは、 Deprecated 指定子を継承して、同様に廃止されたものとみなされます。

TRANSIENT

Transient 指定子は、クラスのディスクへの保存を防ぎます。ゲームの中でセーブが実行中の時、または他の任意の時に、保存するべきでないクラスで使用されます。このキーワードは、このクラスの任意の子クラスによって継承されます。

NONTRANSIENT

NonTransient 指定子は、このクラスのディスクへの保存を許可するため、親クラスから継承された Transient キーワードをオーバーライドします。

CONFIG(ININAME)

Config 指定子は、 Config または GlobalConfig として宣言されたクラス内の任意の変数を指定した名前と合致する .ini ファイルに書き出すように宣言します。その結果、これらの変数の値は、ゲームが終了した時に保存され、ゲームの開始時に開始時の値として読みだされるようになります。

例として、以下のクラスの一部を見てください :

class MyScript extends MyParentScript Config(MyConfig);
Var Config Int Score;
Var Config String Name;
...

これにより、以下のような内容に似た行を含んだ MyConfig.ini というファイルが生成されるようになります :

...
Score=5
Name=Gorge
...

もちろん、ここに挙げた値は、架空のものです。実際の値は、ゲーム中に何が起こるかに依存したものになり、 Name 変数が示したものになります。次回、ゲームを実行した際に、これらの値は、それぞれ Score および Name に対する値として、読み込まれ使用されます。

このキーワードは、現在のクラスから拡張された任意のクラスから継承されて、拒否することができません。しかしながら、使用する .ini ファイルの名前は、新たな IniName で Config 指定子を再宣言することで、子クラスでオーバーライドすることが可能です。これは、多くの不要な変数がファイルに書き出される可能性があるため、 Config 指定子の使用は計画的に行わなければならないことを意味します。

変数とその値を特定の既存の .ini ファイルに書き出す際に IniName として使用可能な予約語もいくつかあります。それらは、以下のものです :

Engine

この名前では、このクラスの変数の値を [GameName]Engine.ini というファイルに書き出します、 ここで [GameName] は、ゲームの名前を表します。 Unreal Tournament 3 の場合は、このファイルは、 UTEngine.ini となります。

Editor

この名前では、このクラスの変数の値を [GameName]Editor.ini というファイルに書き出します、 ここで [GameName] は、ゲームの名前を表します。 Unreal Tournament 3 の場合は、このファイルは、 UTEditor.ini となります。

Game

この名前では、このクラスの変数の値を [GameName]Game.ini というファイルに書き出します、 ここで [GameName] は、ゲームの名前を表します。 Unreal Tournament 3 の場合は、このファイルは、 UTGame.ini となります。

Input

この名前では、このクラスの変数の値を [GameName]Input.ini というファイルに書き出します、 ここで [GameName] は、ゲームの名前を表します。 Unreal Tournament 3 の場合は、このファイルは、 UTInput.ini となります。

PEROBJECTCONFIG

PerObjectConfig 識別子は、クラスが値を格納するために .ini ファイルを使用するように宣言する点では Config キーワードと似ています。この場合は、個々のクラスのインスタンスに対する値は、以下のようにヘッダで指定された別のセクション内に格納されます :

[ObjectName ClassName]

ObjectName は、クラスのインスタンスに与えられた名前を示します、 ClassName はインスタンス化するクラスの名前を示します。このヘッダの下に、クラスの中に含まれる Config 変数とクラスの特定のインスタンスに対する数値の一覧があります。この情報は、UIScene 内のリストにデータを設定するなど、クラスのインスタンスをいくつか初期化するために使用されます。この指定子は、現在のクラスから拡張された任意のクラスによって継承されます。

EDITINLINENEW

EditInlineNew 指定子は、このクラスが、 UnrealEd の中の Property Window 内で直接新規インスタンスを作成する可能性があることを宣言します。これは、基底抽象クラスの特定のプロパティにおいて、 UnrealEd の内部で使用するオブジェクトの型の選択をデザイナーに許可するために使用可能です。 Actor Factory Kismet の動作の中に、その例があるでしょう。 spawned(スポーン) を行いたいオブジェクトの型を基にして、使用する ActorFactory の型の選択をデザイナーに許可します。その動作クラスのプロパティは、特定の機能を持たない抽象クラスであるため、実際にそれ自身は意味を持たない ActorFactory 型からなります。これは、特定の機能を持つ他のいくつかのクラスによって拡張されます。 ActorFactory は、 EditInlineNew として宣言され、また、このキーワードは、すべての子クラスによって継承されるので、動作の目的を非常に多様にするため、これらの子クラスの型に対する UnrealEd 内のプロパティの設定が可能です。


図 3.6 – Actor Factory の連続した動作を行う ActorFactory 内で、新規 ActorFactory オブジェクトを生成します。

NONEDITINLINENEW

NotEditInlineNew 指定子は、クラスから、継承された EditInlineNew キーワードを除きます。これは、親クラスが EditInlineNew を宣言した時だけ有効になります。

PLACEABLE

Placeable 指定子はクラスが UnrealEd の内部のマップ、 UIScene または Kismet(キスメット) シーケンス内に配置できる能力を持つことを宣言します。レベルデザイナーがアクセスすべきで、また、 UnrealEd 内で直接使用することのできる任意のゲームアイテムはこのキーワードを指定しているはずです。この指定子は、子クラスによって継承されます。

チュートリアル 3.2 配置可能なアクタの作成

このチュートリアルでは、前回のチュートリアルで作成した ExampleClass を拡張して新規クラスを作成します。しかしながら、このクラスは、 UnrealEd の内部のマップ内に配置することができます。

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

2. 再度、 File メニューから New を選択するか、ツールバー内の New File ボタンを押して新規ファイルを作成してください。

3. Select Active Highlighter ドロップダウンを利用して、インストール済みの UnrealScript ハイライタを選択してください。

4. 新規スクリプトファイルの 1 行目に以下のコードを記述してください :

class ExampleClass_Placeable extends ExampleClass

今回は、行末にセミコロンが無いことに注意してください。これは、宣言が完了していないためです。このクラスに持たせたい特定の動作を決めるため指定子を使用するつもりだからです。

5. 次の行に移るために Enter キーを押してから、行をインデントするために Tab キーを押してください。以下のコードを追加してください :

   placeable;

これは、親クラスの ExampleClass が配置可能で無いのに対して、 この新規クラスが UnrealEd 内のマップ内に配置を許可されるような宣言となります。最終的なスクリプトは以下のテキストのようになるでしょう :

class ExampleClass_Placeable extends ExampleClass
   placeable;

6. クラス名と合致するように、 ExampleClass_Placeable.uc という名前で ..\Src\MasteringUnrealScript\Classes にファイルを保存してください。

7. スクリプトをコンパイルするために Make コマンドレットを実行してください。前章と同様に、これはご希望の方式で実行できます。スクリプトが正しくコンパイルされたら、 UnrealEd を起動してください。

8. まだオープンしていなければ、 Generic Browser(ジェネリックブラウザ) をオープンして、 Actor Classes タブに切り替えてください。 今回は、横にプラス記号で示されている、配置可能なサブクラスを持つため、 Placeable Classes Only? オプションがチェックされていても階層内に ExampleClass クラスが掲載されているのにお気づきでしょう。


図 3.7 – ExampleClass クラスは、 Placeable Classes Only? オプションのチェック時に表示される。

サブクラスを表示するために、プラス記号上でクリックしてください、その結果、作成したばかりの ExampleClass_Placeable クラスが、マップ内に配置可能であることを示すボールド体で表示されます。


図 3.8 – ExampleClass_placeable クラスは、階層内で ExampleClass の下に掲載されています。

9. すべてが適切に動作することを確実にするためだけに; マップ内の ExampleClass_Placeable クラスのインスタンスを配置してみましょう。 DVD で提供された DM_TestRoom.ut3 マップをオープンしてください。 Actor Class Browser 内で、 ExampleClass_Placeable を選択して、パースペクティブビューポート内の部屋の床の上で右クリックしてください。コンテキストメニューから、Add ExampleClass_Placeable here を選択してください。この選択時に、変換ウィジットの存在以外は視覚的なコンポーネントが無いにも関わらず、マップ内にインスタンスは正しく作成されました。


図 3.9 – ExampleClass_Placeable クラスのインスタンスはマップに追加可能です。

<<<< チュートリアルの終了 >>>>

NOTPLACEABLE

NotPlaceable 指定子は、 UnrealEd の内部に配置されたクラスの機能を削除するために使用されます。 Placeable として宣言されたクラスの子であるが、 UnrealEd 内に配置を許可されるべきではないクラスの場合に、これが使用されます。

HIDEDROPDOWN

HideDropDown 指定子は、 UnrealEd 内のクラス型ドロップダウンリストにクラスが現れないようにします。この型のリストは、例えば、破壊可能なオブジェクトに対して使用するための効果のタイプをデザイナーに選択させるために使用されるかもしれません。 HideDropDown キーワードを使用することで、特定のクラスのリスト内での表示を行わないことが可能です。

HIDECATEGORIES(CATEGORY[,CATEGORY,...])

HideCategories 指定子は、クラスのインスタンスに対する特定のプロパティのグループまたはカテゴリを、 UnrealEd 内の Property Window の内部で非表示とすることが可能です。これは Property Window が不要なプロパティであふれ返らないようにして、デザイナーの邪魔にならないようにします。このキーワードと非表示のカテゴリは、すべての子クラスで継承されます。

チュートリアル 3.3 プロパティカテゴリの非表示

マップに対するアクタとして、追加可能な新しいクラスを作成したら、 UnrealEd の内部で、デザイナーにクラスのプロパティの表示を操作する方法の確認を開始できます。このチュートリアルでは、特定のカテゴリによって、デザイナーに対して表示されるプロパティのカテゴリを決定します。

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

2. 再度、 File メニューから New を選択するか、ツールバー内の New File ボタンを押して新規ファイルを作成してください。

3. Select Active Highlighter ドロップダウンを利用して、インストール済みの UnrealScript ハイライタを選択してください。

4. 新規スクリプトファイルの 1 行目に以下のコードを記述してください :

class ExampleClass_HiddenCategories extends ExampleClass_Placeable

前回のチュートリアルの場合と同様に、宣言が完了していないため行末にセミコロンはありません。この宣言の行により、新しいクラスは、配置可能として宣言された ExampleClass_Placeable から拡張したため、マップ内で自動的に配置可能になることが分かります。

5. 次の行に移動するために Enter キーを押してから、その行をインデントするために Tab キーを押してください。以下のコードを追加してください :

   HideCategories(Movement)
   HideCategories(Display);

どこから Movement および Display のカテゴリ名を取得したか不思議に思うとおもいますが、 Actor Class 内のプロパティは、その宣言方法によって、幾つかのカテゴリに分割されます。このクラスは、間接的に Actor クラスを継承しているため、それらのプロパティおよびカテゴリも持っています。あとは、 UnrealEd に Movement または Display のカテゴリおよびそれらを含むプロパティを表示しないように単に命令するだけです。

完成したスクリプトは以下のテキストを格納しています :

class ExampleClass_HiddenCategories extends ExampleClass_Placeable
   HideCategories(Movement)
   HideCategories(Display);

6. クラス名と合致するために ExampleClass_HiddenCategories.uc という名前で ..\Src\MasteringUnrealScript\Classes というディレクトリの中にこのファイルを保存してください。

7. スクリプトをコンパイルするために Make コマンドレットを実行してください。前の章と同様に、自分のお好みの方式で処理の実行が可能です。スクリプトが誤りなくコンパイルされたら、 UnrealEd を起動してください。 DVD で提供された DM_TestRoom.ut3 マップをオープンしてください。

8. まだオープンしていなければ、 Generic Browser(ジェネリックブラウザ) をオープンして、 Actor Classed タブに切り替えます。 ExampleClass の階層構造を完全に展開した後に、 ExampleClass_Placeable クラス下にリストされた ExampleClass_HiddenCategories クラスが表示されます。


図 3.10 – ExampleClass_HiddenCategories クラスは、 ExampleClass_Placeable の下に挙げられています。

9. Actor Classes Browser 内で ExampleClass_Placeable を選択して、 パースペクティブビューポート内の部屋の床の上で右クリックしてください。コンテキストメニューから、 Add ExampleClass_Placeable here を選択してください。 Properties Window をオープンして、すべてのプロパティのカテゴリ、特に Movement および Display のカテゴリを見つけるために F4 を押してください。


図 3.11 – ExampleClass_Placeable アクタに対する Properties Window 。

10. ここで、 Actor Classes Browser 内で ExampleClass_HiddenCategories を選択して、パースペクティブビューポート内の部屋の床の上で右クリックしてください。コンテキストメニューから Add ExampleClass_HiddenCategories here を選択してください。 Properties Window をオープンするために、再度、 F4 を押してください。拡張元の ExampleClass_Placeable とまったく同じプロパティを含むクラスであっても、 Movement と Display のカテゴリが表示されないことに気が付くでしょう。これは、クラス宣言内で HideCategories 指定子を指定したためです。


図 3.12 – ExampleClass_HiddenCategories アクタに対する Properties Window 。

<<<< チュートリアルの終了 >>>>

SHOWCATEGORIES(CATEGORY[,CATEGORY,...])

ShowCategories 指定子は、 HideCategories キーワードとまったく反対の効果となります。親クラスの HideCategories の利用を通して非表示にされた特定のカテゴリに作用します。いずれの親クラス内でも HideCategories 指定子が使用されていなければ、デフォルトですべてのカテゴリが表示されるべきであるため、この指定子の効果はありません。

AUTOEXPANDCATEGORIES(CATEGORY[,CATEGORY,...])

AutoExpandCategories 指定子は、 UnrealEd 内の Property Window で、プロパティの特定のカテゴリが表示される時にデフォルトで完全に展開されるようにします。これは、特定のカテゴリの中のプロパティが非常にしばしば使用される場合に、プロパティが表示された度毎にいつでもカテゴリを手動で展開するデザイナーの問題を軽減するため便利かもしれません。

チュートリアル 3.4 自動的なカテゴリの展開

UnrealEd の内部で、クラスのプロパティのデザイナーに対する表示方法の操作を継続して、 Properties Window 内で自動的に展開されるプロパティのカテゴリはどれかを指定していきます。

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

2. 再度、 File メニューから New を選択するか、ツールバー内の New File ボタンを押して新規ファイルを作成してください。

3. Select Active Highlighter ドロップダウンを利用して、インストール済みの UnrealScript ハイライタを選択してください。

4. 新規スクリプトファイルの 1 行目に以下のコードを記述してください :

class ExampleClass_ExpandCategories extends ExampleClass_Placeable

また、 ExamplEClass_HiddenCategories と同じように ExampleClass_Placeable から拡張しますが、今回は、 Movement および Display カテゴリを非表示にする代りに展開します。

5. 次の行に移動するために Enter キーを押してから、その行をインデントするために Tab キーを押してください。以下のコードを追加してください :

   AutoExpandCategories(Movement,Display);

個々の指定子の文を、それぞれのカテゴリに使用するのではなく、複数のカテゴリを 1 つの指定子で使用しました。どちらの記述方法を使用するかは、完全に個人的な好みとなります。両方の指定の利用方法を見てきましたので、これからは、若干入力が速いため 1 つの文を記述する方法を使用するようにします。

完成したスクリプトは、以下のようなテキストとなります :

class ExampleClass_ExpandCategories extends ExampleClass_Placeable
   AutoExpandCategories(Movement,Display);

6. ..\Src\MasteringUnrealScript\Classes ディレクトリ内に、クラス名と合致するように、 ExampleClass_ExpandCategories.uc という名前で、このファイルを保存してください。

7. スクリプトをコンパイルするために Make コマンドレットを実行してください。前の章と同様に、自分のお好みの方式で処理の実行が可能です。スクリプトが誤りなくコンパイルされたら、 UnrealEd を起動してください。 DVD で提供された DM_TestRoom.ut3 マップをオープンしてください。

8. まだオープンしていなければ、 Generic Browser(ジェネリックブラウザ) をオープンして、 Actor Classed タブに切り替えます。 ExampleClass の階層構造を完全に展開した後には、 ExampleClass_Placeable クラスの中に ExampleClass_HiddenCategories クラスと共に ExpandCategories クラスが表示されていることに気が付くはずです。


図 3.13 - ExampleClass_ExpandCategories クラスは、 ExampleClass_Placeable の下に表示されています。

9. ここで、 Actor Classes Browser 内で ExampleClass_ExpandCategories を選択して、パースペクティブビューポート内の部屋の床の上で右クリックしてください。コンテキストメニューから Add ExampleClass_ExpandCategories here を選択してください。 Properties Window をオープンして、すべてのプロパティのカテゴリ、特に Properties Window がオープンされた時に、それらのカテゴリを表示する際にプロパティを完全に展開するべき Movement および Display のカテゴリを見つけるために F4 を押してください。


図 3.14 – Movement および Display カテゴリは自動的に展開されています。

<<<< チュートリアルの終了 >>>>

COLLAPSECATEGORIES

CollapseCategories 指定子は、このクラスの編集可能な変数を表示するときに、 UnrealEd 内の Property Window において、前もって、カテゴリを利用できるようにします。すべての編集可能な変数はアルファベット順の一つのリストで表示されます。このキーワードは、このクラスの子クラスに継承されます。


図 3.15 – CollapseCategories 指定子の効果。

DONTCOLLAPSECATEGORIES

DontCollapseCategories 指定子は、親クラスから CollapseCategories 指定子の指定を元に戻します。これは、このキーワードは、このクラスの編集可能な変数が指定されたカテゴリを使用して表示される場所を強制するために使用できることを意味します。

WITHIN CLASSNAME

Within 指定子は、このクラスのインスタンスは、 ClassName クラスのインスタンス内でのみ作成可能である、すなわち、 ClassName 型のオブジェクトは、生成時に新規インスタンスの Outer プロパティとして割り当てなければならないことを示します。この例は、 MaterialExpression とも言えます。この機能は、 Material の外部では存在理由がないはずなので、クラスは、 Material 内以外のどこであっても MaterialExpression の作成を不可能にするために Within 指定子と Material ClassName を使用して宣言されます。

INHERITS(CLASSNAME[,CLASSNAME,...])

Inherits 指定子は、クラスに複数の親クラスからの拡張または継承を許可します。この指定子は、 native(ネイティブ) クラスにのみ適用できます。継承元に複数のクラスを指定する時は、 1 つの Inherit 文でも、継承元それぞれのクラスに使用可能な別々の Inherit 文でも指定可能です。

IMPLEMENTS(CLASSNAME[,CLASSNAME,...])

Implements 指定子は、クラスに一つ以上の Interfaces(インタフェース) の利用または実装を許可します。Interfaces とその利用方法は、次章以降に説明されます。実装で複数の Interfaces を指定した場合は、 1 つの Implements 文でも、それぞれの Interface に使用可能な別々の Implements 文でも指定可能です。

NOEXPORT

NoExport 指定子は、このクラスの native(ネイティブ) 宣言を自動生成された C++ ヘッダファイルから取り除きます。この指定子を使用した時は、別のヘッドファイル内にマニュアルで native(ネイティブ) クラス宣言を生成しなければなりません。この指定子は、 native(ネイティブ) クラスのみに適用可能です。

3.5 サマリ

クラスは、 UnrealScript で実行するすべての基礎となります。クラスがなければ、 Unreal Tournament 3 で行われている興味深く、豊かなゲームプレイは全くできなくなるでしょう。本章で作成したクラスは明らかに利用価値があるものではありませんが、自己の新規クラスを宣言する方法を学習しましたので、興味深く、豊かなゲームプレイを可能にする機能の実装に焦点を当てることができるようになりました。そのこと、すなわち Unreal の世界の中で新しく、楽しい状況を創造するために UnrealScript を使用することが、本書の残りのコース全体の目的となります。

追加ファイル