Siege University 200■講義201 テンプレート#2<特殊化>特殊化はテンプレートシステムの最重要事項のひとつです。特殊化とは,あるテンプレートに他のテンプレートからプロパティ(コンポーネント,フィールド,値)を受け継ぐプロセスです。簡単に言えば,ツリー上位のテンプレートを特殊化した下位テンプレートは,その(上位)テンプレートにある全てのコンポーネントとフィールドを受け継ぎます。 ダンジョンシージにあるすべてのテンプレート(7300以上あります)は,木の幹となるコア・テンプレート,枝となるベース・テンプレート,さらに伸びる枝葉となるリーフ・テンプレートといった具合に論理的なツリーのような構造で配置されています。テンプレートの4つ目のタイプは,手作業で編集するものではなく,コンテンツを設置しマップのRegionをセーブした際に,シージ・エディタによって作り出されるものです。次にこれら4つのテンプレートタイプについて簡単に説明しましょう。 ・コア・テンプレート 多くのベース・テンプレートは"tenmplate.gas"のコアテンプレートを特殊化します。ただしこれは,他のベーステンプレートを特殊化したベーステンプレートもありますので,包括的な決まりごとではありません。 ・ベーステンプレート すべてのリーフテンプレートはベーステンプレートを特殊化します。 ・リーフ・テンプレート インスタンス・テンプレートはリーフ・テンプレートを特殊化しますが,特殊化フィールドを持っていません,潜在的な「特殊化」なのです。 ・インスタンス・テンプレートまたはインスタンス <特殊化の例>これまで述べたように,特殊化は”雪だるま効果”だと思ってもらって構いません。次の架空の例で考察してみましょう:
この一連の特殊化によって,リーフ・テンプレートは単にそのテンプレートにあるだけのBOBとSALLYについてより多くの情報を得ることができました。
たいていの場合リーフ・テンプレートのサイズが小さいのは,他レベルの特殊化テンプレートからコンテンツ,フィールド,値を受け継ぐからです。 実例を見てみましょう。以下の小さなリーフ・テンプレートを見て,コアテンプレートまでの特殊化の軌跡をたどってみてください。このリーフ・テンプレートは"world\contentdb\templates\regular\non_interactive\signs_directional.gas"にあります。
[t:template,n:sign_cav_glitterdelve]
{
doc = "directional_glitterdelve";
specializes = base_sign_directional;
[aspect]
{
model = m_i_cav_sign-glitterdelve;
}
[common]
{
screen_name = "Glitterdelve";
}
}
この"sign_cav_glitterdelve"というテンプレートは"base_sign_directional"を特殊化します。"base_sign_directional.gas"ファイルの冒頭を見れば,このテンプレートが特殊化する"base_sign_directional"というベーステンプレートが有るのがわかります。
[t:template,n:base_sign_directional]
{
category_name = "sign";
doc = "base template for directional signs";
specializes = interactive;
[aspect]
{
draw_selection_indicator = false;
is_selectable = true;
lodfi_lower = 0;
lodfi_upper = 0;
megamap_icon = b_gui_ig_mnu_arrow;
megamap_orient = true;
megamap_override = true;
}
[common]
{
auto_expiration_class = immediate;
forced_expiration_class = immediate;
rollover_display = true;
}
}
ご覧のように,このベーステンプレートはこれを特殊化するリーフ・テンプレートより多くの情報を明示しています。これは特殊化の能力を示す良い例でしょう−それぞれのリーフ・テンプレートに大量の同一データを持つのではなく,すべての共通コンポーネントフィールドの値はベーステンプレートにあるわけです。このファイルにある他のすべての"sign"はこれらの値を引き継ぎます。これによりゲームのロードが早くなるだけでなく,テンプレートを操作する際にも見やすくなります。ベーステンプレートはできるだけ詳しく記述し,リーフ・テンプレートはできるだけ小さくまとめましょう。 それでは特殊化の軌跡を見てみましょう。
[t:template,n:interactive]
{
doc = "An interactive item or object";
aspect:is_selectable = true;
aspect:megamap_icon = b_gui_ig_mnu_dropped_item;
aspect:use_range = 2;
[common]
{
forced_expiration_class = normal;
auto_expiration_class = normal;
}
[placement] { }
}
この対応するテンプレートにあるすべてのコンポーネントは結果的に"world\contentdb\templates\regular\non_interactive\signs_directional.gas"にある"sign"リーフ・テンプレートから受け継ぎます。 このテンプレートで2つの事柄が明らかになりましたが,これらは今までのものとは少し違います。ひとつめは,複数のaspectコンポーネントのラインでコロン(;)が出てきました。ふたつめは空っぽの[placement]ブロックがでてきました。 ひとつめについてですが,これはコンポーネントブロックの簡略表記で,通常はコンポーネントに1つか2つだけフィールドが有る場合に使います。例えばこんな感じです。
aspect:is_selectable = true;
aspect:megamap_icon = b_gui_ig_mnu_dropped_item;
aspect:use_range = 2;
これは,以下の表記とまったく同じです。
[aspect]
{
is_selectable = true;
megamap_icon = b_gui_ig_mnu_dropped_item;
use_range = 2;
}
どちらで表記しても構いません。
空のコンポーネント(この場合[placement]ブロック)はコアテンプレートにはよく現れるもので,単にこのコンポーネントはエンジンがこのコンポーネントをゲーム中に出現させる前には必ずテンプレートのどこかに現れなくてはならないと言うことを示しています。実際,[placement]コンポーネントは,下層のどのテンプレートにも無く,シージエディタを通してオブジェクトが配置された際に,テンプレートの依頼により追加されたもの,つまりシージエディタが自動的に[placement]コンポーネントとそれに関連したフィールドを追加したのです。 <特殊化のコンポーネントやフィールドを無効化する>無効化は下位のツリーにあるテンプレートが,上位にあるテンプレートが特殊化されたコンポーネントのフィールド値を無効化した際に発生します。例えば,もしベーステンプレート("base_tree")が"Tree"のscreen_nameを特殊化し,リーフ・テンプレート("tree_oak_01")が"Oak Tree"のscreen_nameを特殊化すると,そのリーフ・テンプレートのscreen_nameはベーステンプレートのscreen_nameフィールドを無効にします。 前に戻る | 次のページへ |