‘LSL’ カテゴリーのアーカイブ

LSL仕様メモ4 イベントchangedでllResetScriptを使う場合の注意点

2009 年 2 月 14 日 土曜日

仕様というよりただ自爆しただけですが、少しハマってしまったのでメモ。

結論から先に述べますと、

イベントattachとオーナーが変わった際のllResetScriptを同じスクリプトに入れてはいけない

前提として、

  1. イベントstate_entryは、初めてスクリプトが実行された時に1回だけ働く。
  2. llResetScript()は、そのスクリプトをリセットする。
  3. イベントchangedにおけるif(change & CHANGED_OWNER){~}は、オーナーが変わった時に働く。

以上のLSLの基本的な動きがあります。

例えばstate_entry内にllGetOwnerを書き、オーナーのkey(UUID)を得てなにかしら動く仕組みのものを作る場合、人にそのオブジェクトを渡すとstate_entryはもう実行されないので以前のオーナーのkeyが残ったまま不都合な動作が起こります。

これを回避するのに3.で挙げたchanged内でオーナーが変わった時にllResetScript()を動かし、state_entryを再度走らせてオーナーのkeyを取得し直す、というのがよくある手法です。

今回アタッチし機能するものを作っていたのですが、

  • state_entry内に初回だけ働く機能を盛り込む
  • attach内にアタッチするたびに働く機能を盛り込む
  • changed内にオーナーが変わったらllResetScript

という組み合わせをしたところ悲劇は起きました。 (というほど大げさじゃないですが)

「付けてみたらちゃんと動かなかったけど、突然動くようになったよ」という理解不能なレスポンスのシロモノになってしまったわけです。

誤動作の流れとしては

  1. オブジェクトを渡した相手がアタッチする
  2. イベントattachが働く
  3. オーナーが変わったのでllResetScriptが働く
  4. イベントstate_entryが働く

となります。つまり、イベントattachで機能した内容がllResetScriptで消去されていました。

ちゃんとスクリプトを理解している人には当然なのでしょうが、自分はイベントchangedのif(change & CHANGED_OWNER){~}は、相手に渡した時点で機能すると勘違いしていました。

スクリプトなので当然Rez(アタッチも含む)されて始めて動くわけで、使用する人にオブジェクトを渡して最初の稼動がアタッチだと、イベントattach内の内容は全てキャンセルされてしまいます。

そして2回目アタッチした時は、オーナーが変わっていないのでllResetScriptは働かずattachは正常に機能します。途中からちゃんと動く不具合品の出来上がりですw

わかったつもりっていうのは危ないですね。基本的な機能でもテストしてからじゃないとダメだと思い知った件でした。

LSL仕様メモ3 簡易なカメラ制御について

2008 年 10 月 17 日 金曜日
  • LSLでの簡易なカメラ制御、llSetCameraEyeOffset(カメラ設置位置)とllSetCameraAtOffset(カメラを向ける座標)は、llSitTarget(座る位置の指定)を設定してあるオブジェクトでないと機能しない
  • 上記2つのカメラ制御関数は、そのオブジェクトに座ったアバターの視点を一度固定するだけ。後から動的に制御したい場合はllSetCameraParamsを使うこと。
  • 上記2つのカメラ制御関数を一度でもオブジェクトにセットすると、その後関数自体を取り除いてもカメラ位置がセットされたままになる。解除するにはllSetCameraEyeOffset(<0,0,0>); llSetCameraAtOffset(<0,0,0>);を一度セットすること。

参考:BlackSheep-LSL@Wiki カメラ制御

LSL仕様メモ2

2008 年 9 月 21 日 日曜日
  • LSLのイベント、on_rez(integer sparam){ }は地面などへのフィールドへのrez、およびアバターへのアタッチでは機能するが、HUDとして画面上にアタッチした場合は機能しない。例えばHUDをon_rezでllResetScript();する仕様にしていると不具合となるので注意。

LSL 仕様メモ1

2008 年 8 月 5 日 火曜日
  • llMoveToTarget の最大移動限界値は60m程度。それ以上に設定すると、全く動かない、または少しずつ近づくといったおかしな動きになる。
  • llListen は、llListenを含むスクリプト自身およびそのオブジェクトにある他のスクリプトにおいて、自身がllSayなどで発したメッセージを受け取ることができない。(llDialog はオーナーアバターが発したことになるので受け取れる)