2006/7/23

SelectTrainResourceに関するささやかな発見  VRMスクリプト禅問答
ちょっと面白いこと(あなたがコレを面白いと思うかどうかは捨て置く)に気づいたので紹介しておきます。

大雑把に分類すると、VRMスクリプトの命令は、

・スクリプトの実行が命令の行に至った瞬間に何らかの効果を示すもの。
・その瞬間には何も起きないが、何かの準備となるもの。

に分けて考えることができます。前者は例えばSetVoltage命令で、実行された瞬間に編成の速度が変化します。後者は先日も話題になったSetEvent〜系の命令がその代表です。

さて。
面白い発見というのは、SelectTrainResource命令が、実は後者の部類である、という発見です。編成側に組み込んだ画像リソースをSetSignTexture命令でヘッドマークや方向幕に設定する事前準備として、SelectTrainResource 1を実行する必要があることについては、ポータブル編成等の事例を通して周知のことと思います。
では、既に編成画像リソースがSetSignTexture命令によって割り当てられた車両を含む編成オブジェクトで、敢えてSelectTrainResource 0を実行するとどうなるか。もし、VRMビュワーが車両を画面に描画するに際し、SelectTrainResource, SetSignTexture両命令の設定値をリアルタイムで参照しているとすれば、SelectTrainResource 0を実行した瞬間になんらかの見た目上の変化が起きるはずです。

※ リソース割り当て系命令は、与えられたリソース番号に適切な画像/音声リソースが未登録の場合、動作が空振りする(つまり見割り当て番号を与えても、方向幕が消えたりするのではなく、現在の設定が保持される)点に注意。これをここで述べる「SelectTrainResource命令を実行しても何も起こらない」と混同しないように。



簡単なテストコードを紹介しておきます。
[編成スクリプト]
Var key
SetEventKey this 車両テクスチャ設定 key z
SetEventKey this 編成リソースモード key x
SetEventKey this レイアウトリソースモード key c

BeginFunc 車両テクスチャ設定
DrawMessage "車両テクスチャ設定"
CallCar テクスチャ設定
EndFunc

BeginFunc 編成リソースモード
DrawMessage "編成リソースモード"
SelectTrainResource 1
EndFunc

BeginFunc レイアウトリソースモード
DrawMessage "レイアウトリソースモード"
SelectTrainResource 0
EndFunc

[車両スクリプト]
SetHeadmark 1

BeginFunc テクスチャ設定
SetSignTexture 1
EndFunc
適当な編成にヘッドマークや方向幕切替が可能な車両を設定し、上掲スクリプトを組み込みます。編成とレイアウトそれぞれのリソースの1番に、適当な異なるテクスチャを入れておくこともお忘れなく。

ビュワーを起動し[z]キーを押すと、この時点では編成のリソースモード(編成とレイアウト、どちらのリソースを参照するかを決定するSelectTrainResource命令のパラメータ)はレイアウト(0)なので、レイアウト側のリソース1番が車両に割り当てられ、画面上でもそのようになるはずです。
ここで[x]キーを押します。ログウィンドウの表示からメソッド「編成リソースモード」が実行されたことは明らかですが、車両には見た目上の変化が起きません。つまり、SelectTrainResource命令それ自体は、何も引き起こさない「準備命令」である証拠です。
改めて[z]キーを押すと、これによって車両側でSetSignTexture命令が実行され、ビュワー上に変化が生じます。つまり、編成側のリソース1番が車両に割り当てられ、画面上でもそのようになります。
同様に、[c]キーを押してリソースモードをレイアウトに戻しても、やはりその瞬間は何も起きません。[z]キーを押したとき、つまりSetSignTexture命令が実行されて始めて変化が生じます。

*     *     *

さて。
これの何が面白いのか、というお話しです。

ポータブル編成ギミック一発組み込み、と題したスクロールを公開して久しいのですが、最近のネットVRM界隈を眺めていると、音声系のネタが散見されるようになってきました。で、何とか音声リソースを制御する標準フレームワークみたいなものをポータブル編成に融合できないものか、と考えていたワケです。
ここでネックになるのがリソースの割り当て方法です。ポータブル編成の画像リソース割り当て手法は、極めて冗長的ながら、汎用的に利用できる方法論としては最適化されていると自負しています。この体系に影響を与えることなく、かつ、汎用的に利用できる音声リソース管理体系を編成側のリソースに融合させるのは至難ではないか、というのがボクの問題意識でした。
が、今回得た知見により突破口が見えたワケです。つまり、音声リソースを編成側に持たなければ良い。そもそも音声リソースは画像リソースよりも容量が大きくなる傾向があり、かつ、編成間で共有可能なものでもありますから、これを個々の編成に分散配置するのは効率が悪いです。そこで、音声リソースをレイアウト側にあるルールに則って組み込んでおき、これを編成側から参照するという手法が考えられます。
で、今回示したのは、SelectTrainResource命令の実行自体は車両の状態に変化を引き起こさないので、SetSignTextureをする直前にはこれを1に、音声リソース割り当て系命令の直前にはこれを0に設定することで、使い分けが可能である、ということです。

面白いでしょ?

で。
誰か一緒に開発しませんか、音声サポートも包含した次世代(?)ポータブル編成。まぁ、詳細は追々。
0

コメントを書く

この記事にはコメントを投稿できません




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