2008/2/24

オブジェクト参照の方向非対称性について  VRMスクリプト禅問答
第4号の音源部品を使った作品であっても、そのメソッド/グローバル変数を外部から参照しなければ・・・つまり、音源部品が他の部品の状態をタイマーイベント等で監視して発声するようなロジックを採用すれば、第4号が欠落した環境であってもビュワー起動を阻害することはない。

について無問自説。

2つのオブジェクトが連携して何かが起きる仕掛け(もっともイメージしやすいのは、センサーが編成を検知したら何かが起きる、というパターン)を実現するには、大雑把に考えて二通りの考え方があり、それぞれに一長一短があるという話なのだが、上掲引用元つながりで「編成がセンサーを踏んだら音源部品で音が鳴る」を例に示してみる。

音源部品を例にしてはいるが、理屈は信号機などの「主にセンサーから駆動され、一部のパッケージにのみ収録されている部品」すべてに共通する考え方だと思ってもらっていい。

クリックすると元のサイズで表示します
(クリックで拡大表示されます、以下同)

上掲例が“普通の書き方”になる。センサーが編成を検知すると、SetEventSensor命令のイベント設定従ってメソッドMtdSenseTrainが実行される。その中のcall命令によって音源BELL1のメソッドMtdPlaySoundが実行され、音が鳴る、という流れだ。

図中、オブジェクト(部品)間の名前の参照を赤い矢印で示している。具体的にはオブジェクト名BELL1とメソッド名MtdPlaySoundが、センサーSENSOR1側から音源BELL1に向かって参照されていることがわかる。

このようなスクリプトを含むVRMレイアウトを、音源部品を含む第4号がインストールされていない環境で開くと下掲図のような状態になる。

クリックすると元のサイズで表示します

色を薄くしている部分は、スクリプトも含めて、ファイルを開いた時点でレイアウト上から消えてなくなる。この結果、参照先を失った赤い矢印(×印で“参照できない”ことを示している)がビュワー起動時にエラーとなり、レイアウトをビュワーで見ることが出来なくなる。


冒頭に引いた「音源部品が他の部品の状態をタイマーイベント等で監視して発声するようなロジック」を同様に図示すると、下掲図のようになる。

クリックすると元のサイズで表示します

センサーイベントによってメソッドMtdSenseTrainが実行されるまでは最初の例と同じだが、このメソッド内に音源部品に対するcall命令はない。

一方で、音源BELL1側ではSetEventTimer命令によって1/30秒(33ミリ秒)毎に実行されるメソッドMtdCheckが、センサー側のグローバル変数VarFlagを調べている。VarFlagには、センサーが編成を検知した時点で1が代入されるようになっている(メソッドMtdSenseTrain内のset命令)。

メソッドMtdCheckはこの変数を1/30秒毎にチェックしていて、値が0、つまり、編成が検知されていない状態では何も起きないが、この値が0でない場合(if命令)は音を鳴らしてからこの変数の値を0に戻す、という動作をおこなう。

起きること、すなわち「編成がセンサーを踏んだら音源部品で音が鳴る」は最初の例とまったく同じだが(厳密に言えば、編成検知から発声まで最大33ミリ秒遅れるが、人間の耳では違いはわかるまい)赤い矢印、つまり、参照の向きは最初の例とまったく逆になっている。

このようなスクリプトを含むVRMレイアウトを、第4号をインストールしていない環境で開くと・・・

クリックすると元のサイズで表示します

こうなる。これならば、最初の例で赤い×印で示したビュワー起動不能の原因である「参照先が失われる」が起こらない。つまり「第4号が欠落した環境であってもビュワー起動を阻害することはない」ということになる。

ただし、この手法にも欠点があって、第一に有限(同時に2048コだっけ?)のイベントを消費してしまうこと。第二に、PCの性能にもよるが、短い間隔のタイマーイベントがビュワーのパフォーマンスを悪化させること。そして最大のデメリットは、この書き方が最初の例に比べて直観的にわかりにくいことである。ゆえに、ボクは「第4号を持っていない人のために、この書き方をしなさい」などとVRMユーザー諸兄に申し上げるつもりは毛頭ない。

ただ、ここで示した考え方は、便宜上「アドオン記法」と呼んでいる、ボクが最近熱心に研究中のスクロール開発の技術とも関係が深い(これがすべてではない)ので、向学心に溢れる方の一助になれば、とまとめてみた。
0

この記事へのトラックバックURLはありません
トラックバック一覧とは、この記事にリンクしている関連ページの一覧です。あなたの記事をここに掲載したいときは、「記事を投稿してこのページにお知らせする」ボタンを押して記事を投稿するか(AutoPageを持っている方のみ)、記事の投稿のときに上のトラックバックURLを送信して投稿してください。
→トラックバックのより詳しい説明へ

2008/11/15  8:32

 
ということで、前回の続きから、時限式信号動作スクリプトです。まず動作の説明をします。

編成の先頭車両がセンサーを通過するとその時点での信号の色に応じて、編成のMethodRedSignal、MethodYellowSignal、MethodGreenSignalを呼び出します。なので、編成内のそれぞれの 


teacup.ブログ “AutoPage”
AutoPage最新お知らせ