とある関数の説明を再確認しようと wiki.secondlife.com の LSL Portal みてたら、いくつか新しい関数が追加されていました。
llTextBox とか存在は知っていたのですがはじめて公式になりましたね。あと、Display Name 系もあったりしてます。
その中で「ああ、これが欲しかった~」というのが llRegionSayTo です。
スクリプトからアバタ―に対して何等かのメッセージを送る手段は
llSay
llWhisper
llRegionSay
llOwerSay
llInstantMessage
なのですが、llSay, llWhisper, llRegionSay は他の人にも見えちゃうので、関係のない人に見られたくない場合は、必然的に相手先がオーナーであれば llOwnerSay, 他の人は llInstantMessage を使うことになります。
ですが、llInstantMessage は、私みたいにダイアログ使って処理をすることが多い場合は「鬼門」なのです。この llInstantMessage は [Delay] の属性を持っていて、wiki にあるように 2.0 Delay なのです。これの意味するところは、llInstantMessage を使うと 2.0 秒「スリープ」するんです。
なので、ダイアログを扱っているスクリプトから直接この関数を使うと次のダイアログ表示の処理まで「2秒とまる」ことになります。パフォーマンスが出ない、ダイアログの表示が遅い、という場合は llInstantMessage によって「止まっている」可能性が高いのです。
これを回避するために、スクリプトを分けて、ダイアログ処理スクリプトから llMessageLinked を使って、送信先の id とメッセージを llInstantMessage 送信用のスクリプトに渡す、、、などの方法があります。
でも、llRegionSayTo を使えば、もう、そんな手間なことをしなくてもよいわけ。
Delay もないですし、0チャンネルでも指定したアバタ―だけにメッセージが表示されます。
その他、llMessageLinked との違いは「同じSIMにいなければならない」ことです。まぁ、別SIMにいる人にメッセージを渡すようなことがなければ、llRegionSayTo が一番使いやすいかもしれません。0番のオープンチャンネルだけじゃなくて、指定したチャンネル番号を使えば「装着しているオブジェクト」がメッセージを拾うことができる、というのもおもしろそうですね。
あと、ちょっと面白いのは llSay と llWhisper と llRegionSay は声の届く距離だけが違うわけではないんですよ。
llSay/llWhisper は隣接する SIM にも聞こえます。でも、llRegionSay は隣接する SIM には一切聞こえません。この違いをうまく使って SIM 間のリレーチャットなんかもできます。
エレクトログラム Siva の複数SIM で同期ダンス!のときにこの仕組みをつかってみました。