「公開を前提とした編成ファイルへのギミック組み込みの定石」
VRMスクリプト禅問答
【怎麼生】
Webでギミック(キー操作で何かライトが消点灯したりする)を組み込んだVRM4編成ファイルを公開しようと思います。スクリプトの書き方で注意すべきことはありますか。
【説破】 4.0.3.2
必ずこうでなければならない、といったことを言うつもりはありませんが、以下に述べることを雛形として受け入れてもらえると、より多くの人に喜ばれる編成ファイルになるのではないかと思うので、まとめておくことにします。肝となるのは、
・キー操作の標準化
・アクティブな編成のみで有効になるキー操作
です。
まずは論より証拠、雛形となるスクリプトを紹介しておくことにしましょう。
[編成スクリプト]
//車輌テクスチャーの初期設定
SelectTrainResource 1
CallCar {車輌の初期設定メソッド}
//キーイベントハンドラ
Var EventIDKeyZ
Var EventIDKeyX
Var EventIDKeyC
//フォーカスイベントハンドラ
Var EventIDFocusIn
Var EventIDFocusOut
//フォーカスイベント設定
SetEventFocusIn MtdFocusIn EventIDFocusIn
SetEventFocusOut MtdFocusOut EventIDFocusOut
//車輌がアクティブになったら実行されるメソッド
BeginFunc MtdFocusIn
SetEventKey this MtdCallON EventIDKeyZ Z
SetEventKey this MtdCallOFF EventIDKeyX X
SetEventKey this MtdCallChange EventIDKeyC C
EndFunc
//車輌が非アクティブになったら実行されるメソッド
BeginFunc MtdFocusOut
KillEvent EventIDKeyZ
KillEvent EventIDKeyX
KillEvent EventIDKeyC
EndFunc
//Shift+zキーで実行されるメソッド
BeginFunc MtdCallON
CallCar {車輌の電源ONメソッド}
EndFunc
//Shift+xキーで実行されるメソッド
BegiFunc MtdCallOFF
CallCar {車輌の電源OFFメソッド}
EndFunc
//Shift+cキーで実行されるメソッド
BeginFunc MtdCallChange
//
//ここに方向幕切替等の処理を書く
//
EndFunc
サクッと何をしているのか説明していきます。
冒頭のSelectTrainResource、CallCar命令については既に
別記事で述べているのでそちらを参照してください。
続く5つのVar命令(変数宣言)はすべてイベントハンドラです。最初の3つはキーイベント用です。これが妥当かどうかはともかく、私は以下のようなキー割り当ての標準化を提唱します。
[Shift]+[z] 電源ON(ライトが光ったりパンタが上がったり)
[Shift]+[x] 電源OFF(ライトが消えたりパンタが下がったり)
[Shift]+[c] 切り替え(方向幕が変わる等)
上掲のスクリプト雛形をベースに編成スクリプトを書くと、この3つのキー操作が編成に組み込まれます。そして、このキー操作は同様のスクリプトを含むすべての編成において共通のキー操作となります。
ただ単に共通キーにしてしまうと、たとえば[Shift]+[x]を押すとレイアウト上のすべての編成が非運転状態(ライトが消え、パンタが下がる)になってしまいます。これが絶対に悪い、ということはありませんが、あまり有意義ではありませんね。そこで、アクティブな(選択されている)編成だけにキー操作が有効となり、非アクティブな編成にはキー操作の効果が出ないようにしてやります。
具体的には、残り2つのVar命令で宣言されている変数をイベントハンドラとして、続くSetEventFocusIn/Out命令で定義されるメソッドがこれを実現しています。
編成がアクティブになる、つまり、ユーザーがビュワー上で編成を選択すると、メソッドMtdFocusInが実行されます。このメソッドにはSetEventKey命令が並んでいます。つまり、編成がアクティブになった瞬間にキーイベントを定義する=キー操作が有効になる、をおこなっています。
これに対し、編成が非アクティブになる、つまり、ユーザーがこの編成以外の編成を選択すると、メソッドMtdFocusOutが実行されます。このメソッドにはKillEvent命令が並んでいます。この命令を使うと、イベントハンドラ変数に対応したイベントを解除できます。ここでは変数EventIDKeyZ〜Cに対応するイベント=キー操作が無効になる、という意味になります。
なお、キー操作に[Shift]同時押しを割り当てていることについて疑問に思う方もおられるかと思いますが、これは、この編成ファイルが各位が独自に作成するレイアウトに組み込まれることを前提に考えているからです。
つまり、レイアウト独自のキー操作(運転の開始やポイントの切替)は[Shift]なしのキー、編成共通のキー操作は[Shift]同時押しのキー、という住み分けを狙っています。もちろん、これを皆さんに強制する意図はありませんが、妥当な配慮であろうとは思っています。
以上が雛形です。
あとは、車輌スクリプト側にギミックを引き起こす命令(SetHeadlight等)を含むメソッドを作り、この雛形からCallCar命令でトリガしてやればよろしい。そういうワケですので、上掲のスクリプトをコピー&ペーストすれば動く、という話ではありませんので、そのへんはご理解ください、念のため。
早ければ今月末、遅ければ翌月頭から、この仕組みに準拠した編成ファイルの配布を開始する予定です。開始する、というからには1つや2つではないんですね、きっと。お楽しみに。
レイアウトへの組み込みに際しては、もう1つ配慮すべきことが残っていますが、これは編成ファイルの配布開始に合わせて解説します。