keimei main -> キハポスト@VRM -> VRM4スクリプト -> スクリプト〜概要・非制御編

VRM4スクリプト(1)〜概要・非制御編

VRM4の特徴のひとつにスクリプトによる制御というのがあります。スクリプトを組むことにより車輌・ポイント・信号などをユーザーが自由に制御でき、スクリプト次第で無限の可能性を持つというのが特徴です。このスクリプトというのは、VRM独自の仕様になっていますが、今流行のオブジェクト指向言語には違いありません。普段からそういう仕事をしている人なら自分でバキバキプログラミングできるでしょうけど、プログラミングに縁のない人にとっては、一体何をどうすればいいのかさっぱり分からない、というのが実情だと思います。これは、初心者かベテランかというのではなく、VRMに慣れた人でも、プログラミングが苦手な人には手が出せないってことです。

という私は、C言語やJavaScriptくらいは書きますが、オブジェクト指向言語というのはどうも苦手な部類です(思考回路が古い訳ですね)。という訳で、この文章もそういう中途半端な中級者向けと考えてください。多分に間違ったことを書くと思いますが、それについてはBBSなどでご指摘頂ければありがたいです。なお、VRM4の情報については、KZさんの「ぶいあ〜るえむ」が詳しいですので、そちらも参照してください。

スクリプトによって全てが出来る、ということは、スクリプトが書けないと何も出来ないということです。驚いたのは、VRM3で何気なくやっていた機能もスクリプトに依存しているということです。つまり、"列車番号によってポイントを自動で切り替える"、"列車やポイントをキーボードで選択する"などもスクリプトを書かないと出来ないのです。第0号には実装されていませんが、おそらく、"列車接近によって踏切警報機を鳴らす"、"列車接近によって地上設置カメラに切り替え列車を追尾する"こともスクリプトに依存されることでしょう。これは、ちょっとした一大事です。

まず、基本的なことの確認です(間違っているかも知れませんが)。重要な単語は2つ、「オブジェクト」と「メソッド」です。例えば、ある車輌のヘッドライトを点けたい、と思った時、「ある車輌」というターゲットが『オブジェクト』で、「ヘッドライトを付ける」という行為が『メソッド』です。メソッドはプロシジャーとかサブルーチンと言い直した方が分かりやすいでしょう。さて、ここで、VRM4スクリプトの働きをはっきり2つに分けた方が理解しやすいと思います。つまり、制御をするかしないかです。

制御をしない場合、例えば、ヘッドライトを常に点灯させておく、というのなら話は簡単です。編成エディタでヘッドライトを点けたい車輌(先頭車輌)を右クリックして「スクリプト編集」に以下を書けばよろしい。この場合、「BeginFunc〜EndFunc」で括る必要はないことに注目してください(注1)。デフォルトでヘッドライトは消えていますが、これで点灯状態になる筈です。但し、点きっぱなしで制御出来ないということになります。

注1:正確に書くと、BeginFunc〜EndFuncで括ってはいけません。ビューアーは起動時にBeginFunc〜EndFuncの外側の命令を一通り1回だけ実行するので、これによりライトが点灯することになります。BeginFunc〜EndFuncの内側はメソッドとして呼び出された時に実行されます。

//ヘッドライト常時点灯
Var head
set head 1
SetHeadlight head

ここで重要なのは、上記の手続きは、ターゲット(オブジェクトですな)となる車輌、つまりヘッドライトを持つ車輌に書かないといけないということです。編成エディタ右下にある「スクリプトエディタ」でも、レイアウトメニューの「スクリプト編集」でもダメです。

他の例として、"留置車輌のために室内灯を消しておく(デフォルトで点灯なので)"、"同じくパンタを下げておく"、"ポイントを分岐方向に切り替えておく(デフォルトで直進方向なので)"などに使えると思います。この場合も、室内灯を消したい車輌、パンタグラフを持つ車輌、操作したいポイントなどを右クリックして出てくる「スクリプト編集」にて設定します。

//テールライト常時点灯
Var tail
set tail 1
SetTaillight tail
//室内灯常時消灯
Var room
set room 0
SetRoomlight room
//パンタグラフ常時下降
Var pant
set pant 0
SetPantograph 0 pant

注2:head、tail、room、pantはグローバル変数名ですので、単に「a」などでも構いません(他と重ならないこと)。パンタグラフの場合のみ、SetPantographの第1パラメータ("0")はパンタグラフの番号です。これは複数のパンタグラフを持つ車輌に対する対策で、パンタグラフが1台の車輌の場合、0を指定すればOKです。

さて、制御をする場合、話が大変なことになります。まず、このスクリプトを『メソッド』として登録して、「どの車輌なのか?」というオブジェクトも指定する必要があって、フラグをグローバル変数であれこれして、と大騒ぎです。という訳で、以下略です(おいおい)。いろいろなスクリプト例を公開したいところですが、私自身まだよく理解していないので。 まあ、取り敢えず、上記の"制御しない場合"でもスクリーンショットを撮ったりやムービーを作るにはなんとかなるでしょう‥‥‥なるのか?

はっきり言って、自分であれこれやってみるしかないです。あれこれやるには、スクリプトを実際にビューアーで実行するのが一番ですが、1つ困ったことがあります。それは、VRM4がスクリプトの構文しかエラーチェックしていないことです(マニュアルに書いてありますが、これは仕様です)。つまり、構文は正しいけど動作が間違っているスクリプトは、ビューアーで実行出来てしまって、そして、異常終了します。異常終了というのは、ビューアーが落ちてレイアウターに戻ってしまうのはまだいいんですが、いきなり画面が真っ暗でうんともすんとも言わなくなる場合もあります。自作したスクリプトをデバッグするには、かなり勇気が必要で、困ったもんです。なんでも自分でやってみろ、と言いたいところですが、スクリプトに関しては十分に理解した上で、手を出した方がいいかもしれません。