ソラマメブログ

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やテクスチャオフセットなどでやりとりすればいけるかも。
…未検証。
…タイプミスは防げていない。



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


同じカテゴリー(LSL)の記事画像
1.17でllGetNotecardLineで日本語取出せず
「Limit 5 コンテスト」表彰式
ひとこと掲示板を漢字対応
「Limit 5 コンテスト」に作品を出した
文字の変わる箱
同じカテゴリー(LSL)の記事
 ソース(2):【日本語対応メッセージボード v05】 (2008-10-13 00:11)
 ソース(1):【日本語対応メッセージボード v05】 (2008-10-12 23:48)
 説明書:【日本語対応メッセージボード v05】 (2008-10-12 23:43)
 1.17でllGetNotecardLineで日本語取出せず (2007-06-25 22:54)
 メモリ管理には謎がある (2007-06-07 22:50)
 複数スクリプト (2007-05-22 01:25)

Posted by march at 00:22│Comments(5)LSL
この記事へのコメント
llGetObjectDesc&llSetObjectDescじゃだめですかぁ?
ちょっぴりそれ風味には出来ますよ^^
Posted by mayuko Nishi at 2008年02月08日 02:28
別なプリムにあるスクリプトで同じ定数を使いたい場合に、
定数を変更するときのミスを減らしたい。という意味でした。
設定する値の種類が少なければ、mayukoさんのいうように
llSetDescで定数を書き込む関数をコピペするっていう方法もありますね。

プログラムとデータを分離して、プログラムは変更できないようにしたほうがいいのかも。
Posted by marchmarch at 2008年02月08日 09:22
あーごめんなさい><
別プリムって書いてあるのに><
おっちょこちょいですねぇ><

でも、設定する値が何個かで済むのなら
スペーサーで区切った文字列をllGetObjectDescで取り込んで
リスト化してそれからまた中で取り出して使うというのをこのごろ良くしてます。

めんどくさいんですけどノートを書いたりとかよりいいのかなぁ?などと
思って使ってます^^;
Posted by mayuko Nishi at 2008年02月08日 15:40
タイトルとかちょっと書き換えました。
mayukoさんの言うように、CSVで位置固定でDESCに書くのが楽な気がしてきました(^_^)
Posted by march at 2008年02月08日 23:39
*プログラムとデータを分離する
*1つの意味のデータは一箇所だけに書き、その記述を皆で使う
と分けて考えるほうがいい気がしてきました(^-^)
Posted by march at 2008年02月13日 23:32
上の画像に書かれている文字を入力して下さい
 
<ご注意>
書き込まれた内容は公開され、ブログの持ち主だけが削除できます。