はじめに
Vket Cloudでは、「HeliScript」という独自のスクリプトを使用してコーディングを行うことで、ワールド内に高度なギミックを導入することが出来ます。
本記事では、HeliScriptにおけるコンポーネントとアイテムの関係性について紹介します。
やや専門的な話になりますが、理解することでHeliScriptの拡張性をグッと広げることが出来ます。
動画
コンポーネントって?
HeliScriptを作成した際、自動で1つ生成される機能の塊です。
コンポーネントの中に関数を登録することが出来ます。
アイテムと紐づけが可能なのはHeliScript1ファイル単位ではなく、コンポーネント単位となります。
また、1つのHeliScriptに複数個のコンポーネントを作成することも可能です。
アイテムとの紐づけ
⑧ - HeliScriptでシーン上のアイテムを取得するで紹介したとおり、Vket Cloudでは、シーンを構成する要素として「アイテム」という単位が用いられています。
アイテムはコンポーネントを持つことが可能です。
VKC Item Fieldを持つオブジェクトにVKC Attribute Scriptを付与し、HeliScriptを持たせた際、ビルド時に生成されるシーン情報jsonファイルには下記画像のようにcomponentsという項目内に要素が追加されていることが確認できます。
また、1つのアイテムに複数のコンポーネントを持たせることが可能です。
また、ひとつのコンポーネントを複数のアイテムに付けた際、それぞれのコンポーネントが独立して動作します。
「アイテムAが持つコンポーネント」といった状態になります。
イメージ
アイテムとコンポーネントは演劇の役者と台本のような関係性にあります。
Vket Cloudにおける役者であるアイテムに台本であるコンポーネントを持たせることで、
アイテムは台本に書かれている動きをするし、台本を複数個持たせることでその役者はそれぞれの台本を演じることが出来るようになるし、同じ台本を複数の役者に渡すことでそれぞれの役者が同じ演技をすることが出来るようになります。
コンポーネント間の値受け渡し
Item.CallComponentMethod()
を利用することで、他のアイテムが持つコンポーネントの関数を発火することが出来ます。
ただし、対象の関数はpublicである必要があります。
これを利用することで、値渡しを行うことが可能です。
component ExampleA{
private int a;
public ExampleA(){
a = 0;
hsSystemWriteLine("aの初期値は%dです" % a); // コンソールに変数aの初期値を出力
}
public void addValue(string s){
int value;
value = s.ToInt();
a += value;
hsSystemWriteLine("加算後のaは%dです" % a); // 値を加算し結果を出力
}
}
component ExampleB{
Item self;
public ExampleB(){
self = hsItemGetSelf(); // Itemクラス変数にこのコンポーネントを持つアイテムの情報を格納
self.CallComponentMethod("ExampleA","addValue","3"); // もう1つのコンポーネントの関数を実行
}
}
上記では、同一アイテム内の2つのコンポーネントにて、片方のコンポーネントが持つ関数をもう片方のコンポーネントから発火し、操作する例になります。
これにより、
aの初期値は0です
加算後のaは3です
といった出力がされます。
まとめ
プログラムを動作させるだけであれば、1つのコンポーネントにすべての機能を詰め込むといった実装方法も可能ですが、コンポーネント概念を理解し、コンポーネントごとに機能を分担することで、効率的で分かりやすい実装が可能となります。
このような実装をすることで、「この部分の機能を改修したい」となった際に編集を行うべき場所が分かりやすくなり、保守性が向上します。
また、他コンポーネントの関数を作用させる処理の作り方は、
本記事で紹介した方法以外にも、クラス定義やHSMessageを使う方法もあります。
HeliScriptでの開発に慣れたら、効率の良い開発にもチャレンジしてみましょう。