ソラマメブログ

  

Posted by at

2008年02月08日

別プリムにあるスクリプト間で定数を素直に共有できないか?

別なプリムにあるスクリプトで同じ定数を使いたい場合に、定数を変更するときのミスを減らしたい。
つまり、
スクリプトファイル外にある定数を素直に共有できないか?
つまり、
要求1:同じ意味の定数を変える場合は、変更するところは一箇所だけにしたい
要求2:タイプミスによるバグを減らしたい

例:オブジェクトAとBがチャンネルチャットで通信する場合には、
AでSayするチャンネルをBがlistenする必要がある。(同じチャンネル番号を使う必要がある)
このケースで、チャンネルを変えたい場合にどうするか。

[オブジェクトA]--------(ch.3)-------->[オブジェクトB]


結論:方法が無い。んじゃないかなぁ。


方法が無い理由:
C言語と比べてみる。C言語で書かれたソースファイルを実行できるようにするためには、
おおまかには以下の2つの手順が必要である。
(1)ソースファイルをコンパイルして、コンパイル済みオブジェクトファイルを作る
(2)コンパイル済みオブジェクトファイルをリンクして、実行ファイルを作る
この時に、以下の便利なことができる。
(1)では#include文により他のソースファイルを取り込む、
(2)ではextern宣言で型だけ決めてあった外部変数と、実際の定義(記憶領域の割付)を結びつける。

LSLにはこのような仕組みが無い。
(1)は、llRemoteLoadScriptPin関数で同じプリム内に入れることはできても、同じスクリプトファイルには入れられない。
(2)は、宣言(型を決める) = 定義(記憶領域の割付)で、この2つを分離できない。
このため、ヘッダファイルをincludeしたり、別なスクリプトで代入した変数を使ったりできない。


代替案:
案A:マジックワードとして、両方のスクリプトに数字を書く。
…一番素直。一番面倒。
案B:定数として定義する。両方のスクリプトに定数定義をコピペする。
原始的だがタイプミスは減らせる
案C:llLinkMessageで定数を得るスクリプトを書く。
…llRemoteLoadScriptPinで
…#includeとは違う!
…一見よさそうだが、スクリプト内でllLinkMessageを呼ぶ関数を書かなければならない。
 (スクリプト外の関数は呼び出せない)
……引数がマジックワードになる。
………コピペと同じ。
案D:ノートカードから取得する
…定数名をじかにかかなければならない(コンパイルエラーにはできない)
…定数が見つからないときのエラー処理や、処理のタイミング(起動時?)に注意すればいけるかも。
案E:外部サーバを使う
…外部サーバを呼び出す関数や、何が欲しいかを決めておく必要がある。llLinkMessageと同じ。
案F:既にある定数を無理やり使う
…PIとかCONTROL_BACKとか
……もはや「変更は一箇所で」という目的からずれている
案G:別スクリプトで同じstateを書いたら共有できるのではないか?
…1プリムに入っていても、スクリプトが別ならメモリ空間は別なので、共有できない。
案H:stateを上手に遷移させ、DESCやテクスチャオフセットなどでやりとりすればいけるかも。
…未検証。
…タイプミスは防げていない。



というわけで、リーズナブルなのは定数はスクリプトの頭にまとめておいてコピペする、
頑張るならノートカードから取得するのがいいんじゃないでしょうか。
間違いの指摘やご意見を歓迎します。
  


Posted by march at 00:22Comments(5)LSL