2010年7月6日火曜日

[LSL] Link 系ファンクション

ひさしぶりに、Linden Script ネタです。
Link に関連するファンクションが増えてますね。

たとえば、llSetLinkPrimitiveParamsFast などはプリムのリンクを多用している人にとっては待ちに待った機能ですね。メインのスクリプトから子プリムたちの操作に遅延が発生しないからです。遅延以外は llSetLinkPrimitiveParams とまったく同じです。

llSetLinkTextureAnim も最近追加された Link 系のファンクションですね。これも子プリムの面に対して Texture Animation (アニメーションGIFみたいな動く画像)を貼り付けることができるようになりました。

おもしろいのは llLinkParticleSystem です。
パーティクルってなかなかむずかしいのですが、wiki にはとても詳しくその仕様について日本語ページに書かれています。(関係者・翻訳者のみなさん、本当におつかれさま&ありがとうございます)

ポイントは、パーティクルのエミッター(発生源とでもいいましょうか)はプリム1個に対して1つしか作ることができない、ということ。パーティクルを発生させるスクリプトを複数、1つのプリムにいれても、挙動がおかしくなるのはそのせいです。

もちろん、llParticleSystem によってパーティクルを発生させるスクリプトをそれぞれのプリムにいれて、それらを Link し、llMessageLinked で各プリムにメッセージを送って操作するやり方も可能でしたが、llLinkParticleSystem を使った複数のスクリプトをルートのプリムにいれて、llMessageLinked であったり、touch_start, listen などのイベントを各スクリプトが拾うことで、一斉・同時に違うパーティクルを出すことが可能になりました。ここのプリムにスクリプトが分散されていない分、スクリプトの修正やメンテナンスが楽になっていると思います。

パーティクルの色や形を変えたものを同時に出そうとすると、この llLinkParticleSystem はとても使い勝手がよいわけです。

kira

llLinkParticleSystem 利用の注意点としては、もし、パーティクルに画像を指定した場合は、発生源である(子)プリムにその画像が存在していないと、デフォルトのパーティクルが使われるようです。もしかすると Key 指定だと存在しなくても OK かもしれませんが、string による画像名指定だとだめでした。

あと、これら Link 系のスクリプトを使う場合は、ルートプリムはどれか、子プリムはいったいいくつ Link されているのか、といったことを常に意識しなくてはなりません。

llGetNumberOfPrims その時点で Link されているプリムの数を取得します
llGetLinkNumber 自分の Link 番号を取得します
llGetLinkKey Link 番号を指定して Key を取得します
llGetLinkPrimitiveParams Link 番号を指定してプリムの情報を取得します
llSetLinkPrimitiveParamsFast Link 番号を指定して、リンクオブジェクトの設定を変えます

llGetLinkNumber は子プリム内でしか使えませんが、ルートのメインスクリプトと子プリムのスクリプトなどを llMessageLinked で複合させて使うことで、今いくつ Link されていて、Link 番号の 2 は何で、3は、、、とチェックすることができます。
スクリプトによる Link  番号決め打ちでもいいのですが、その際は Link させる順番に細心の注意を払うことになります。特に HUD などを作るときは Link させる順番に気を付けるか、スクリプトにより Link 番号とプリムのマッチングを行わせる、といった方法がありますね。また、プリムに座ったアバターを操作するときなども上述の関数を多用します。

3 件のコメント:

  1. はじめまして。
    座っているアバタのプリム番号の取得方法を調べ調べていてたどり着きました。
    もし御存じでしてたら教えていただけないでしょうか。

    返信削除
  2. 匿名さん、
    アバターが座った「その」瞬間は、llGetNumberOfPrims でとった番号です。ただ、複数のアバターが座ったり、立ったりすると、最初にとったリンク番号ではなくなる場合があります。複数のアバターによる利用を考慮した場合は、llGetNumberOfPrims でリンクされている最大数を出して、for や do while を使い、llGetLinkName か llGetLinkKey を使ってアバターをチェックして、そのときの link 番号をとって利用するようにしてみてください。おおよそ大きい link 番号がアバターですから、for などでは i を llGetNumberOfPrims で設定し、for(;i>=0;--i) で for でまわす回数を減らすといいでしょうね。

    ご参考になれば。

    返信削除
  3. 上述の for でまわすアバターのリンクチェックは changed イベントが発生するたびに行って、アバターのリンク番号を更新しないといけません。ご注意ください。

    返信削除