この記事に関連して。今さら続きかよ!感ただよいますが。
「オブジェクト名を数字だけにするとobject.variable形式での参照に失敗する」という話でしたが、ここにtettaさんからコメントをいただきました。
>一般的PG言語では(中略)英字or特定記号で始まるのが原則(理由はあるのですが)なんで多分VRMスクリプトも内部的にはそれが作用しているのだろうと推測されます。
(such a cool「オブジェクト参照ができない?」コメント欄より、傍線筆者)
ということで、オブジェクト名の先頭の文字だけを数字にして同様のスクリプトで実験してみたところ、やはりobject.variable形式での参照に失敗しました。
つまり、オブジェクト名が数字だけになることを回避するために、例えば「313系」のように末尾に「系」を付け足してもダメ、ということみたいです。あらためてtettaさんのコメントに感謝しますです。
このことは、自分のようにVRMスクリプトの他にプログラミング言語を知らない人は結構引っかかりやすいと思います。英字以外を先頭とするオブジェクト名が無理なら無理で構わないので、I.MAGICにおかれましては、その旨を然るべき箇所に明記したほうが、お互いにいらぬ手間を省けるはずです。
2007年10月24日
2007年10月13日
オブジェクト参照ができない?
明日からはレイアウトコンテスト締切前最後の連休っすね。自分のレイアウトはほぼ完成し、あとは明日明後日で行う微調整を待つのみです。

ここはちょうどピー!がピー!しているところです。ピー!を配置したので我ながら良くできたピー!だと思うのですが、いかがでしょうか。あ、そうですか。引きつった笑顔で誉めていただいてありがとうございます。
さてさて。
レイコンのVRM4レイアウト部門では、手書き、ウィザード利用を問わずスクリプトを使用される方が多いと思います。
このとき、例えば313系の編成名を「313」などと系列名にする方もいらっしゃると思いますが、このように数字だけの名前にすることはやめた方が良いようです。これは編成に限った話ではありません。スクリプトを書き入れる部品(オブジェクト)全てに言えることです。
なぜなら、オブジェクトを数字のみの名前にすると、オブジェクト参照がうまくいかないことがあるからです。
続きを読む

<完成風景>
ここはちょうどピー!がピー!しているところです。ピー!を配置したので我ながら良くできたピー!だと思うのですが、いかがでしょうか。あ、そうですか。引きつった笑顔で誉めていただいてありがとうございます。
さてさて。
レイコンのVRM4レイアウト部門では、手書き、ウィザード利用を問わずスクリプトを使用される方が多いと思います。
このとき、例えば313系の編成名を「313」などと系列名にする方もいらっしゃると思いますが、このように数字だけの名前にすることはやめた方が良いようです。これは編成に限った話ではありません。スクリプトを書き入れる部品(オブジェクト)全てに言えることです。
なぜなら、オブジェクトを数字のみの名前にすると、オブジェクト参照がうまくいかないことがあるからです。
続きを読む
2007年08月02日
ちょっと修正しました
「一週間で出来るVRMスクリプト」の、VRMスクリプトの例文をちょっと修正しました。
このカテゴリでは例文を見やすくするために、メソッドの中にある行の先頭に全角スペースを入れていたんですが、これをそのままスクリプトエディタにコピー&ペーストするとエラーになってしまいますね。なので全角スペースを全部削除しました。
このことはVRM初心者会議室のメッセージNo.5282で気付きました。書き込まれているスクリプトは、メソッドや変数の名前から察するに、「一週間で出来るVRMスクリプト」からそのままコピーしてきたように見受けます。
今まで思いもよらなかったので、書き込まれたCanonさんには気付くきっかけを作ってくれて感謝しております。といきなり場末から謝意を述べられても困るでしょうけど。
ちなみに半角スペースではエラーにならないです。半角スペースは単語同士を区切るための文字通りのスペースとしてはたらきますが、全角スペースは文字列として扱われているからだと思います。素人考えですが。
はじめはもちろん「一週間で出来るVRMスクリプト」でも半角スペースやTabを使おうと思ったんですが、ブログでは行の先頭にある半角スペースやTabは投稿後の記事には反映されないみたいなので、全角スペースで表現することにした次第です。全角スペースだとエラーになることは知らなかったか忘れていました。
「一週間で出来るVRMスクリプト」以外の記事に載っている例文も全角スペースだらけなのでコピーには耐えませんが、何しろ数が多くて全部直すのは大変そうなので、とりあえず「一週間で出来るVRMスクリプト」の例文だけ直しますです。気が乗ったら他の記事の例文も直します(ぉ
追記
このカテゴリでは例文を見やすくするために、メソッドの中にある行の先頭に全角スペースを入れていたんですが、これをそのままスクリプトエディタにコピー&ペーストするとエラーになってしまいますね。なので全角スペースを全部削除しました。
このことはVRM初心者会議室のメッセージNo.5282で気付きました。書き込まれているスクリプトは、メソッドや変数の名前から察するに、「一週間で出来るVRMスクリプト」からそのままコピーしてきたように見受けます。
今まで思いもよらなかったので、書き込まれたCanonさんには気付くきっかけを作ってくれて感謝しております。といきなり場末から謝意を述べられても困るでしょうけど。
ちなみに半角スペースではエラーにならないです。半角スペースは単語同士を区切るための文字通りのスペースとしてはたらきますが、全角スペースは文字列として扱われているからだと思います。素人考えですが。
はじめはもちろん「一週間で出来るVRMスクリプト」でも半角スペースやTabを使おうと思ったんですが、ブログでは行の先頭にある半角スペースやTabは投稿後の記事には反映されないみたいなので、全角スペースで表現することにした次第です。全角スペースだとエラーになることは知らなかったか忘れていました。
「一週間で出来るVRMスクリプト」以外の記事に載っている例文も全角スペースだらけなのでコピーには耐えませんが、何しろ数が多くて全部直すのは大変そうなので、とりあえず「一週間で出来るVRMスクリプト」の例文だけ直しますです。気が乗ったら他の記事の例文も直します(ぉ
追記
2007年05月18日
GetDirectionの怪
めがね橋パイクに設置されている場内信号機(もどき)は、「ポイントが直進向き」かつ「編成が引込み線内に存在しない」ときだけ進行現示になります。
このうち「編成が引込み線内に存在しない」かどうかを知るために、引込み線入口にセンサーを置き、変数を用意しています。GetDirectionを使って編成が引込み線に進入しているか退出しているか判断し、進入したら1、退出したら0を変数に代入するわけです。
で。
当初、センサーの検知位置はSetSensorModeで編成の最後尾に設定していました。編成がセンサーを通過中に運転者の操作で方向転換して再発車する場合を考慮すると、編成の先端がセンサーを踏んだからといって即進入/退出、というわけにはいかないからです。
しかし残念ながらこの方法は使えませんでした。というのも、編成がどちらの方向からセンサーを踏んでもGetDirectionは同じ結果を返してしまい、用を成さなかったのであります。
センサーの最後尾検知モードとGetDirectionはいっしょに使わないほうが無難です。
続きを読む
このうち「編成が引込み線内に存在しない」かどうかを知るために、引込み線入口にセンサーを置き、変数を用意しています。GetDirectionを使って編成が引込み線に進入しているか退出しているか判断し、進入したら1、退出したら0を変数に代入するわけです。
で。
当初、センサーの検知位置はSetSensorModeで編成の最後尾に設定していました。編成がセンサーを通過中に運転者の操作で方向転換して再発車する場合を考慮すると、編成の先端がセンサーを踏んだからといって即進入/退出、というわけにはいかないからです。
しかし残念ながらこの方法は使えませんでした。というのも、編成がどちらの方向からセンサーを踏んでもGetDirectionは同じ結果を返してしまい、用を成さなかったのであります。
センサーの最後尾検知モードとGetDirectionはいっしょに使わないほうが無難です。
続きを読む
2007年02月03日
アップデータ4.0.5.4
アップデータ4.0.5.4が出ましたね。
これによって待望の俯角制御がフライスルーカメラで可能になりました。これまで多彩な機能の地上カメラの陰に隠れて地味な存在だったフライスルーカメラにも、いよいよ光が当たる日が来ましたねー。
しかしいただけないのは、肝心のフライスルーカメラ制御用のスクリプトの解説です。
>追加したベクトル命令の詳細は、追加キット「トミックス1」以降の電子マニュアルまたは、スクリプトエディターのツールを参照してください。
(アップデータ4.0.5.4のreadmeより)
・・・そりゃないっすよ。マニュアルくらいタダで見せてくださいよ。仕方ないんでアップデータのreadmeとコードビルダーを頼りに試用してみましたよ。
フライスルーカメラの向きを任意の方向に設定するにあたってスクリプトでやることは、「フライスルーカメラをどこに置くか」「フライスルーカメラをどの方向に向かせるか」の二つを決めることだけです。
南武線ビネットを例にとってやってみました。フライスルーカメラを置く場所をA、向かせたい方向をBとして、AとBをスクリプトで設定してやればいいわけです。
すなわちまず適当な名前の変数をAとBのふたつ宣言して、新命令SetVectorX/Y/ZでそれぞれX,Y,Z座標を設定し、SetFlyCameraPosにふたつの変数を割り当てれば完了です。
X座標はレイアウター左端からの距離、Z座標はレイアウター上端からの距離で、レイアウター画面のタテヨコ目盛りがそれぞれ相当します。またY座標は高度をあらわします(当然相当する目盛りはありません)。
高度にあたるY座標をAとBで変えることで、現行VRM4の地上カメラでは手動でないと不可能だった俯角/仰角が設定できます。
続きを読む
これによって待望の俯角制御がフライスルーカメラで可能になりました。これまで多彩な機能の地上カメラの陰に隠れて地味な存在だったフライスルーカメラにも、いよいよ光が当たる日が来ましたねー。
しかしいただけないのは、肝心のフライスルーカメラ制御用のスクリプトの解説です。
>追加したベクトル命令の詳細は、追加キット「トミックス1」以降の電子マニュアルまたは、スクリプトエディターのツールを参照してください。
(アップデータ4.0.5.4のreadmeより)
・・・そりゃないっすよ。マニュアルくらいタダで見せてくださいよ。仕方ないんでアップデータのreadmeとコードビルダーを頼りに試用してみましたよ。
フライスルーカメラの向きを任意の方向に設定するにあたってスクリプトでやることは、「フライスルーカメラをどこに置くか」「フライスルーカメラをどの方向に向かせるか」の二つを決めることだけです。
<カメラをAに置いてBの方を向かせたい>
南武線ビネットを例にとってやってみました。フライスルーカメラを置く場所をA、向かせたい方向をBとして、AとBをスクリプトで設定してやればいいわけです。
すなわちまず適当な名前の変数をAとBのふたつ宣言して、新命令SetVectorX/Y/ZでそれぞれX,Y,Z座標を設定し、SetFlyCameraPosにふたつの変数を割り当てれば完了です。
<X,Y,Z座標の意味>
X座標はレイアウター左端からの距離、Z座標はレイアウター上端からの距離で、レイアウター画面のタテヨコ目盛りがそれぞれ相当します。またY座標は高度をあらわします(当然相当する目盛りはありません)。
高度にあたるY座標をAとBで変えることで、現行VRM4の地上カメラでは手動でないと不可能だった俯角/仰角が設定できます。
続きを読む
2006年12月17日
2006年12月09日
天気ー
VRMスクリプトの話題なんですけど、地上カメラにClearLocalOffset命令ってのがありますよね。
これはテンキーで移動した地上カメラの視点を初期位置に戻す命令です。
てっきり自分は、列車の追尾モードで視点が移動したときもこの命令で初期位置に戻せるものだと思っていたんですが、そうじゃないみたいです。
このことは、次のような実験を行ってわかりました。
はじめ追尾モードをオンにした状態で、列車を追いかけます。そしてその列車が地上カメラの検知範囲を抜ける前に追尾モードをオフにし、ClearLocalOffset命令を実行しました。
すると、追尾モードは確かにオフになって視点の遷移はストップします。しかしそれ以上何も変化はありませんでした。
ClearLocalOffset命令が効くならば、地上カメラの視点は、遷移が止まるのと同時にパッと初期位置に戻るはずです。
スクリプトマニュアル(PDF版)では、ClearLocalOffset命令は以下のように説明されています。
>オフセットをクリアーします。通常、テンキーで操作するとレイアウト上に配置したときの基準点、基準方向に対して、カメラのローカル座標系でオフセット移動します。この命令でオフセットは基準点、基準方向にもどります。
読みづらいですが、暗に「テンキーによる移動にしか効きません」というニュアンスが伝わってくる気がしないでもありません。どっちやねん。
で、なんでこんなことに気付いたかというと、実はTOMIXターンテーブルを使ってルーレットゲームみたいなのを作っていたからなんですが、ターンテーブルの回転速度がルーレットにするにはあまりに遅すぎて挫折しました。
ターンテーブルをものすごい速度で回す方法を思いついた方がいたら、ぜひご一報ください。
意味は無いけれどむしゃくしゃしたから空飛ぶ円盤呼んでみる。
これはテンキーで移動した地上カメラの視点を初期位置に戻す命令です。
てっきり自分は、列車の追尾モードで視点が移動したときもこの命令で初期位置に戻せるものだと思っていたんですが、そうじゃないみたいです。
このことは、次のような実験を行ってわかりました。
はじめ追尾モードをオンにした状態で、列車を追いかけます。そしてその列車が地上カメラの検知範囲を抜ける前に追尾モードをオフにし、ClearLocalOffset命令を実行しました。
すると、追尾モードは確かにオフになって視点の遷移はストップします。しかしそれ以上何も変化はありませんでした。
ClearLocalOffset命令が効くならば、地上カメラの視点は、遷移が止まるのと同時にパッと初期位置に戻るはずです。
スクリプトマニュアル(PDF版)では、ClearLocalOffset命令は以下のように説明されています。
>オフセットをクリアーします。通常、テンキーで操作するとレイアウト上に配置したときの基準点、基準方向に対して、カメラのローカル座標系でオフセット移動します。この命令でオフセットは基準点、基準方向にもどります。
読みづらいですが、暗に「テンキーによる移動にしか効きません」というニュアンスが伝わってくる気がしないでもありません。どっちやねん。
で、なんでこんなことに気付いたかというと、実はTOMIXターンテーブルを使ってルーレットゲームみたいなのを作っていたからなんですが、ターンテーブルの回転速度がルーレットにするにはあまりに遅すぎて挫折しました。
ターンテーブルをものすごい速度で回す方法を思いついた方がいたら、ぜひご一報ください。
<そんなターンテーブルの一風変わった活用法>
意味は無いけれどむしゃくしゃしたから空飛ぶ円盤呼んでみる。
2006年09月01日
IDとKillEventの不思議な関係
VRMスクリプトのイベントIDのちょっと不思議な仕様に関する話です。
変数はパラメータやオブジェクトを保持してスクリプトを短くする一助を担ってくれますが、もうひとつ、イベントを設定するときにイベントIDを受け取る役割があります。
でも、イベントIDを使う場面といったらKillEvent命令で削除したいイベントを判別するときくらいですよね。
自分は長年(ってVRMスクリプト始めて1年経ってないけど)イベントIDの生い立ちが気になっています。このイベントIDというのは、システムの構造上どうしても設定しなければいけないファンダメンタルなものなのか、それとも単にKillEvent命令のために後付け的に設けられたものなのでしょうか。
イベントIDはjump命令と同じで、一見あまり使い道がなさそうなのに当たり前のように実装されています。このことはPCやスクリプト全般に関するバックグラウンド無しにスクリプトをはじめた自分にはかなり謎であります。
1つの変数を複数のイベントに割り当てても何も問題なく動作することから、最近の自分は「単にKillEvent命令のために設けられた」説に傾いていたのですが、いなわらチキンレースではじめて大々的にKillEvent命令を使ってみて、またわからなくなりました。
続きを読む
変数はパラメータやオブジェクトを保持してスクリプトを短くする一助を担ってくれますが、もうひとつ、イベントを設定するときにイベントIDを受け取る役割があります。
でも、イベントIDを使う場面といったらKillEvent命令で削除したいイベントを判別するときくらいですよね。
自分は長年(ってVRMスクリプト始めて1年経ってないけど)イベントIDの生い立ちが気になっています。このイベントIDというのは、システムの構造上どうしても設定しなければいけないファンダメンタルなものなのか、それとも単にKillEvent命令のために後付け的に設けられたものなのでしょうか。
イベントIDはjump命令と同じで、一見あまり使い道がなさそうなのに当たり前のように実装されています。このことはPCやスクリプト全般に関するバックグラウンド無しにスクリプトをはじめた自分にはかなり謎であります。
1つの変数を複数のイベントに割り当てても何も問題なく動作することから、最近の自分は「単にKillEvent命令のために設けられた」説に傾いていたのですが、いなわらチキンレースではじめて大々的にKillEvent命令を使ってみて、またわからなくなりました。
続きを読む
2006年08月16日
jumpの怪
VRMスクリプトには、自分がまだ使ったことがない命令は結構ありますが、その中でもjump命令は自分にとって謎の存在です。
たいてい自分が使ったことがない(またはほとんどない)命令というのは、用途を具体的・限定的に特化した命令(ターンテーブル専用の命令とか、号車番号を受け取る命令とか)がほとんどなんですが、jumpはそういう命令ではなさそうです。
4.0.0.0の段階で当然のように実装されていることから、きっと世のスクリプトには当たり前のように実装されている命令なのでしょう。しかし自分にはどうもこの命令の使い道が思いつきません。
そこでjumpを使うのに何か定石のようなものがあるのか、あるとすればそれを探るべく、試しに使ってみることにしました。
続きを読む
たいてい自分が使ったことがない(またはほとんどない)命令というのは、用途を具体的・限定的に特化した命令(ターンテーブル専用の命令とか、号車番号を受け取る命令とか)がほとんどなんですが、jumpはそういう命令ではなさそうです。
4.0.0.0の段階で当然のように実装されていることから、きっと世のスクリプトには当たり前のように実装されている命令なのでしょう。しかし自分にはどうもこの命令の使い道が思いつきません。
そこでjumpを使うのに何か定石のようなものがあるのか、あるとすればそれを探るべく、試しに使ってみることにしました。
続きを読む
2006年08月14日
続・SetWaveBrakeの怪
先日の「SetWaveBrakeの怪」の続きです。この記事の最後に書いたように、第4号のディーゼル車両でもSetWaveBrakeを試しました。
被験車両はDE10、キハ82、キハ85の3車種です。
前回と同じようにノーマルモードとトラコンモードでそれぞれ運転操作を行いました。トラコンモードはデフォルトの段数のときと、SetNotch命令で段数を最大の8段に設定した場合の2回です。
しかし予想通りといいますか、どう運転しても全然ブレーキ音は鳴りません。
もしVRM4史上もっとも不遇な命令を挙げろと言われたならば、自分は躊躇なくSetWaveBrakeを推挙するものであります。
それとも自分は何か勘違いをしてるんでしょうか。こうすれば普通に鳴ったよ、という方がいたらぜひ教えてください。
あとスクリプトつながりでもうひとつ、4.0.4.0以降の新しいスクリプトエディタについてです。このエディタは使いやすくなった反面、終了時がちょっと面倒くさくなってしまいましたね。
新しいエディタを終了するには、メニューの「ファイル」を選択→「確定して終了」or「キャンセル」を選択、という2段階の手順を踏まねばなりません。何しろ頻繁に使う操作ですから億劫です。
いちWindowsユーザーの自分としては、どこかに「OK」「キャンセル」「適用」の3つのボタンが付いているといいなー、と思います。
被験車両はDE10、キハ82、キハ85の3車種です。
前回と同じようにノーマルモードとトラコンモードでそれぞれ運転操作を行いました。トラコンモードはデフォルトの段数のときと、SetNotch命令で段数を最大の8段に設定した場合の2回です。
しかし予想通りといいますか、どう運転しても全然ブレーキ音は鳴りません。
もしVRM4史上もっとも不遇な命令を挙げろと言われたならば、自分は躊躇なくSetWaveBrakeを推挙するものであります。
それとも自分は何か勘違いをしてるんでしょうか。こうすれば普通に鳴ったよ、という方がいたらぜひ教えてください。
あとスクリプトつながりでもうひとつ、4.0.4.0以降の新しいスクリプトエディタについてです。このエディタは使いやすくなった反面、終了時がちょっと面倒くさくなってしまいましたね。
新しいエディタを終了するには、メニューの「ファイル」を選択→「確定して終了」or「キャンセル」を選択、という2段階の手順を踏まねばなりません。何しろ頻繁に使う操作ですから億劫です。
いちWindowsユーザーの自分としては、どこかに「OK」「キャンセル」「適用」の3つのボタンが付いているといいなー、と思います。

