Fandom

Second Life in Japan

スクリプターズカフェ/ログ/detect系関数および使用できるイベントハンドラの仕様

483このwikiの
ページ数
新しいページをつくる
トーク0 シェアする

Scripters_cafeログ


08/04/05 編集

Jakenさんのブログに、collisionイベントでllGetOwnerKeyが取れないというような話が出ていて、気になったので詳細を調査してみようという話です。

Jakenさんのブログエントリ


Fakeさんの推測により、「対象オブジェクトが消えてしまっているからllGetOwnerKeyで正しいキーが取得できない」という現象だということに。

この現象を確認するために、collision_start後にllSleepでウェイトを入れて、コリジョンしてきたオブジェクト(ぶつかったら消える)が確実に消えてからllGetOwnerKeyを実行するようにしてテストしてみました。

この実験では(実験するまでもありませんが)llGetOwnerKeyで意図したキーを取得することはできませんでした。


ただし、この場合でもllDetectedOwnerを使用すれば対象オブジェクトのオーナーのUUIDを取得できます。


この挙動についてのFakeさんの推測は以下のようなものです。

  • collision_startイベントハンドラが呼び出される時点で、コリジョン対象となっているオブジェクトに関する情報がキャッシュされる(イベントハンドラに関連付けられたメモリ領域に保存される)
    • イベントハンドラ内でいつでも使用可能
  • detect系の関数は、常にこのキャッシュ情報からデータを取得する
  • detect系以外の関数は、このキャッシュとは無関係に常に対象オブジェクトそのものから情報を取得する

したがって、collision_start内でllGetOwnerKeyを使用した場合は、対象オブジェクトがすでに消えてしまっていれば正しい値を取得することはできませんが、llDetectedOwnerを使用すれば対象オブジェクトが消えていても値を取得することができます。


また同様に、コリジョンしたらオブジェクトの名前を変更するような銃弾があった場合、llDetectedNameを使用するとコリジョンした瞬間の名前を取得できますが、llGetObjectDetailsでオブジェクトの名前を取得する場合は、タイミングによっては変更後の名前を取得してしまったりします。

広告ブロッカーが検出されました。


広告収入で運営されている無料サイトWikiaでは、このたび広告ブロッカーをご利用の方向けの変更が加わりました。

広告ブロッカーが改変されている場合、Wikiaにアクセスしていただくことができなくなっています。カスタム広告ブロッカーを解除してご利用ください。

Fandomでも見てみる

おまかせWiki