Second Lifeで気に入ったアイテムの記録です あ、ウソです。スクリプトとか他のことも書いてます

2009/05/02

Link系の関数をもっと使ってみるの1

最近、見たり聞いたり買ったりするオブジェクトが
子primにみっしりとスクリプトが入っていることが多く、
これは意識的にしてるのかなという疑問がおこりました。

ということで、4回にわけて、スクリプトをまとめることについて書いてみます。
わりと一般的なことしか書いていませんので、
Hack的な内容は期待しないでください。

では。


LSLのプログラムを書いていると
llMessageLinkedを使うことがあります。
というか、これナシには話が進まないほどです。

これは大きく2つの用途があります。
A)他のprimとの通信
B)他のスクリプトとの通信
(メモリ制限のため/機能をスクリプト単位で分けるためなど)

B)の場合は、自主的に選択してスクリプトを分けていますが
A)の場合は、「これしか方法がないから」という人も多いのではないでしょうか。
たとえば、ボタンがたくさんあって、それぞれに機能が違うので
各ボタンにスクリプトを仕込んで、押されたよということを
ルートprimに伝えるとかですね。

でも、条件によっては、llMessageLinkedを使わなくていい場合があります。
たとえば、単純にタッチされたprimに応じて処理を行いたい場合です。

一番単純な方法では、llDetectedLinkNumberだけを使います。
    touch_start(integer total_number)
{
llOwnerSay((string)llDetectedLinkNumber(0));
}


これで、どのprimがタッチされか区別できます。
試してみるとわかるのですが、
子primでは2~の番号
ルートprimでは、1が返ってきます。
(※リンクされていない場合、タッチすると、0が返ってきます)

さて、これでなんかできそうな気がしてきます。
ただ、この状態では、どのprimがどのリンク番号なのかぴんときません。
任意のリンク番号がつくようにリンク順を調整するなんてやってられませんし。

ということで、次にllGetLinkNameを使ってみます。
これは、指定されたリンク番号のprimの名前を返します。

    touch_start(integer total_number)
{
integer i_lnkno = llDetectedLinkNumber(0);
string s_primnm = llGetLinkName(i_lnkno);
llOwnerSay((string)i_lnkno+":"+s_primnm);
}

各primに名前をつけておくと、それをルートから取得できるわけです。
これなら、リンク順に関わらず一定の結果を得られます。
これでかなり実用的になります。

この段階でも、単純に名前で処理を分岐させることもできます。
ただ、タッチするたびに、この処理をしてから
名前で分岐するのかと考えると少し気が重くなりますよね。

2に続く

0 コメント: