---*---*---*---
「センサーチェーン構造」とは、あるセンサーが、編成を運び屋にすることによって、1つ前のセンサーのオブジェクト参照値を取得するものである。そして、1つ前のセンサーはその1つ前のセンサーのオブジェクト参照値を持つことになるから、鎖状に連なって動作させることが出来る訳である。
---*---*---*---
それでは、「閉塞構築センサー」の動作(VRM5/ONLINE版)を見てみよう。
//閉塞メソッド
BeginFunc MethodSensorEvent
GetSenseTrain ObjTrain
SetCommonStatus VarBlockadeZoneNo VarBlockadeZoneStatus
mov this ObjPreviousSensor ObjTrain ObjBZoneSensor
ifeq VarBlockadeZoneStatus 4
call ObjPreviousSensor Method4to3
endif
ifeq VarBlockadeZoneStatus 3
call ObjPreviousSensor Method3to2
endif
ifeq VarBlockadeZoneStatus 2
call ObjPreviousSensor Method2to1
endif
ifeq VarBlockadeZoneStatus 1
call ObjPreviousSensor Method1to0
endif
mov ObjTrain ObjBZoneSensor this ObjThisSensor
EndFunc
この閉塞メソッドの黄色い部分がセンサーチェーン確立のためのコマンド群であり、編成ObjTrainのObjBZoneSensorが運び屋の器である。そして、センサーはObjPreviousSensorに1つ前のセンサーの参照値を確保する。
![](https://blogimg.goo.ne.jp/user_image/41/cb/ec2ae5aff5a587c3497da1dd81dfafab.png)
そして、メソッドは1つ前のセンサーへと指令を出していくわけである。それにより、閉塞の状態を示す4、3、2、1、0の値が入るのである。
「Method3to2」より
BeginFunc Method3to2
GetCommonStatus VarBlockadeZoneNo VarStatus
ifeq VarStatus 3
SetCommonStatus VarBlockadeZoneNo 2
call ObjPreviousSensor Method2to1
endif
EndFunc
尚、この赤い部分は変えるべき値が本当に3であるかを確認するためであり、これが後続編成が対象区間に突入していた場合の対策になる。
---*---*---*---
また、閉塞メソッドに話は戻るが、「ifeq VarBlockadeZoneStatus」で条件分岐しているのは、信号機の灯火数に対応するものであり、例えば5灯ではなく4灯ならば、
![](https://blogimg.goo.ne.jp/user_image/42/6e/876dfabc0bcdc0b92ac5e4bf04f0131e.png)
このようになる訳である。後は4灯式信号機及び編成動作用のスクリプトを追加すれば良いだけ。
---*---*---*---
という訳で、センサーチェーン構造の解説を書いた訳ですが、1つ前のセンサーが判るということは逆に1つ先のセンサーも判るということで、ObjPreviousSensorだけでなく、ObjNextSensorも取得できる訳である。
VRMにおける「動的オブジェクト参照」の究極的な使い方が、この「センサーチェーン構造」だろうと私は勝手に思っている。