2005/11/11

コピー&ペースト時の部品の名前  VRMテンプレート構想
【課題】

部品をコピー&ペーストした際、コピー元とペースト先で部品の識別名(スクリプトから参照する際のオブジェクト名)が同じになってしまいます。これは、テンプレート利用者、すなわちVRMビギナーが、テンプレートから生成したVRMレイアウトにスクリプトウィザードを使用するときに大きな障害となりそうです。

現行のVRM4レイアウターは、レイアウトウィンドウ内に配置される新しい部品の識別名に対して二通りのポリシーをもっています。

・パーツウィンドウからドラッグ&ドロップされた部品には、種類を表す識別子(編成ならばTRAIN etc...)に部品管理連番が付与された名前が与えられる。
・コピー&ペーストされた部品には、コピー元の名前がそのまま引継がれる。

VRMスクリプトからレイアウト上のオブジェクトを参照する場合、参照される部品の識別名はレイアウト内でユニーク(名前の重複がない、の意)である必要があります。コピー&ペーストの場合、ペーストした瞬間にこの「ユニークな識別名」という原則が崩れてしまいます。

実は、この仕様自体はそれほど致命的ではありません。
第一に、VRMテンプレート構想抜きで考えれば、コピー&ペーストされる部品はレイアウト作成者自身が付けた名前/スクリプトを含んでいるはずであり、それは自分で管理・把握できるはずです。
第二に、ユニークな識別名が求められるのは「参照される=他オブジェクトのスクリプトからcallやgetされる」部品のみであり、その部品がcallする側の場合は名前がユニークである必要はありません。

ただし、VRMテンプレート構想においては(1)テンプレート利用者は前以てテンプレートに含まれる部品にどんな名前が付けられているか、どんなスクリプトが記述されているかがわからないし、そもそも意識すらしないだろう。(2)テンプレート利用者はおそらくVRMビギナーであり、何も考えずにユニークな識別名を与えることなく、そのままスクリプトウィザードを適用しようとする可能性が高い。と言った問題が考えられます。

【解決策】

無茶を承知で言うと、パーツウィンドウからのドラッグ&ドロップ時に適用される「識別子+部品管理連番(すべての部品に順に割り当てられる番号)」という仕様が、そもそも無理矢理ではないか、という気もします。
ユーザーの管理の都合だけから言えば、最初に置いた信号機は「SIGNAL1」であり、次においた信号は「SIGNAL2」であって欲しい、と考えるのが人情ではないか、と思います。もちろん、技術的にこれを実現するのは容易な話で、オブジェクトの種類毎に独立した採番管理テーブルを用意し、ここから「空いている番号で最大のもの」を常に引き出してくれば良いことになります。
ただし、このロジックはVRMレイアウター内部に高速なデータベースエンジンが実装されていないと(それっぽいものが含まれているように思うのですが)、レイアウト内の部品数の増加に伴い無視できない処理上のオーバーヘッドを生じさせるであろうことは疑いありませんから、諸刃の剣でもあります。そもそも、このような方法が速度に悪影響を与えないのであれば、当然既に採用されているはずです。
想像するに、I.MAGiCの中の人の理屈は「VRMレイアウターが振り出す番号はシステムの都合上のもので、ユーザーが気にするものではないのだから、好きに名前をつけてくれや」なのだろうと推察しますが、仮にそうだとすれば、VRMレイアウター画面上にその番号を表示してしまったのは失敗のような気がします。残念ながら、一般的なユーザーのリテラシは番号そのものに意味を見出す方向へ走ると考えるべきでしょう。

いずれにせよ、この話はVRM内部の採番体系の現在の実装の正確なところがわからないので、なんとも言えません。また、この問題の解決をシステム的におこなってレイアウターのパフォーマンスを落とすことになるのは、喜ばしいことではないように思われます。
ただ、後述する「名前の重複は利用者の責任とする」ポリシーを支援するためにも、せめてオブジェクトに名前をつけた時点、すなわち各オブジェクトの設定ダイアログにおいて名前を変更しOKボタンを押した瞬間に、レイアウト内の他の部品と名前が重複していないかをチェックし警告する程度の機能は実装していただきたいように思います。これであれば、さほどレイアウターのパフォーマンスに影響しないはずですから。

【回避策】

となると、やはり部品への命名はユーザーの責任で、ということになりそうです。そもそも、VRMユーザーのすべてがスクリプトを使うワケでもないでしょうから、実は影響範囲は小さいのかも知れません。
つまり、スクリプトを使わないテンプレート利用者はただ黙々とテンプレートをコピー&ペーストすれば良く、スクリプトを使いたいユーザーは少なくとも外部参照の対象となる部品に対しては自分で名前を変えてくださいね、と言うことになります。ただし、テンプレート利用レイアウトからスクリプトウィザードへとスキルアップの道を歩まんとするVRMビギナーの足をせめて引っ張らないようにするためには、テンプレート作成者側が少し配慮する必要があるでしょう。

たとえば、あるテンプレートに「SIGNAL」という名前の信号機があったとします。テンプレート利用者はこの信号機をセンサーから制御すべくその名前を「SIGNAL1」に変えました。ところが正常に動作しません。なぜでしょうか。実は彼が組み込んだ他のテンプレートに「SIGNAL1」という信号機が既に存在していたのです。
冒頭に書いたように、テンプレート利用者はテンプレートに含まれる部品に与えられた識別名を前以て知ることは出来ません。したがって、このような問題が発生して初めてそのことに気付くことになります。いや、下手をすると名前の重複に気付かず(自分で付けた名前ではないので当然ですね)なぜ意図通りにスクリプトが動作しないのかわからずに頭を抱えることになるでしょう。
このことから、テンプレートの部品識別名には何らかのレギュレーションが必要と考えられます。たとえば、テンプレートに含まれる信号機はすべて「SIGNAL」という名前にしておく、というように。そしてテンプレート利用者に向けては「スクリプトを利用する前に、部品の名前の末尾にユニークな番号を加えてね」とガイドします。これで名前の重複がおきれば、それは利用者の責任ということになります。

ただし、先に触れた「高度固定設定」もそうですが、このような配慮を常にテンプレート作成者が漏れなくおこなえるか、には疑問が残ります。これを確実にするには、テンプレート配付はI.MAGiC管理の(あるいはユーザー有志管理の)単一のテンプレートサーバーに限定し、配付の前にスーパバイザーなりVRMエキスパート有志なりによるレギュレーションチェック(作品としての見栄えの評価ではない点に注意!!)が必要になりそうです。

【派生課題】

このエントリでは、

・コピー&ペースト時の部品識別名の扱い

について議論します。以下は派生課題です。

テンプレート配付の方法
テンプレートのレギュレーション

0

コメントを書く

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




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