Difference between revisions of "LlGetOwner/ja"

From Second Life Wiki
Jump to navigation Jump to search
m (Apply LSLG Template)
m (Undo partically)
Line 8: Line 8:
|spec
|spec
|caveats=*オブジェクトのオーナーが変わった場合、この関数の戻り値に依存したコードもそれに合わせて自動的にアップデートされたり再評価されるわけではありません。
|caveats=*オブジェクトのオーナーが変わった場合、この関数の戻り値に依存したコードもそれに合わせて自動的にアップデートされたり再評価されるわけではありません。
**すなわち新しいオーナーについて改めて{{LSLG/ja|llListen}}および[[llRequestPermissions/ja|パーミション要求]]を行なう必要があります。
**すなわち新しいオーナーについて改めて[[llListen/ja|listen]]および[[llRequestPermissions/ja|パーミション要求]]を行なう必要があります。
***これはlistenとパーミションに限った話でなく、戻り値を保持するあらゆる処理にあてはまります。この制約に関わる処理を書くプログラマ次第です。
***これはlistenとパーミションに限った話でなく、戻り値を保持するあらゆる処理にあてはまります。この制約に関わる処理を書くプログラマ次第です。
**オーナーの変更を検知するには、{{LSLG/ja|changed}}イベントで{{LSLG/ja|CHANGED_OWNER}}フラグを用いるか(2番目の例を参照)、以前の値を保存しておき、折に触れて(例えば{{LSLG/ja|on_rez}}イベント時)にそれが変更されたか調べます。どちらの手法も有効ですが、後者はオブジェクトが手渡しでなく "オリジナルとして販売" された場合に検知できません。
**オーナーの変更を検知するには、{{LSLG/ja|changed}}イベントで{{LSLG/ja|CHANGED_OWNER}}フラグを用いるか(2番目の例を参照)、以前の値を保存しておき、折に触れて(例えば{{LSLG/ja|on_rez}}イベント時)にそれが変更されたか調べます。どちらの手法も有効ですが、後者はオブジェクトが手渡しでなく "オリジナルとして販売" された場合に検知できません。

Revision as of 03:37, 13 April 2009

要約

関数: key llGetOwner( );

オブジェクトのオーナーのUUIDを key で返します。

警告

  • オブジェクトのオーナーが変わった場合、この関数の戻り値に依存したコードもそれに合わせて自動的にアップデートされたり再評価されるわけではありません。
    • すなわち新しいオーナーについて改めてlistenおよびパーミション要求を行なう必要があります。
      • これはlistenとパーミションに限った話でなく、戻り値を保持するあらゆる処理にあてはまります。この制約に関わる処理を書くプログラマ次第です。
    • オーナーの変更を検知するには、changedイベントでCHANGED_OWNERフラグを用いるか(2番目の例を参照)、以前の値を保存しておき、折に触れて(例えばon_rezイベント時)にそれが変更されたか調べます。どちらの手法も有効ですが、後者はオブジェクトが手渡しでなく "オリジナルとして販売" された場合に検知できません。

サンプル

<lsl>llOwnerSay( (string)llGetOwner()); // アバターの "key" (UUID) をチャットで話す。 llOwnerSay( llKey2Name(llGetOwner())); // オーナーが SIM 内に居るならば、その名前をチャットで話す。</lsl>

<lsl>default {

   state_entry()
   {
       llInstantMessage(llGetOwner(), "この声はあなたしか聞こえない。薄気味悪いでしょ。");
   }
   changed(integer change)
   {
       if (change & CHANGED_OWNER)
           llResetScript();
   }
}</lsl>

注意点

オーナー名を取得する場合、オーナーが同じリージョンに居る場合はllKey2Nameを、リージョンに居ない場合はllRequestAgentDataを使います。

多くのプログラマが直面する問題の一つは、オーナーを参照する駆動済みのイベントが、オーナーの変更に自動的に対応しない点です。典型的なのは、オーナーを Listen していると現在のオーナーでなく前のオーナーを Listen し続けるというケースです。これは llGetOwner 関数や llListen 関数の不具合と誤解される事がありますが、そうでなく仕様の一部です。この問題を回避するいくつかの方法があります。簡単なのはオーナーが変わったり rez された時にスクリプトをリセットする事です。尤も、簡単な解決法が常に正しい解決法とは限りません。

オーナーの変更を検知するには2つの方法があり、より信頼できるのは changed イベントを利用することです。 <lsl>changed(integer change) {

   if (change & CHANGED_OWNER)//オーナが変わったら、スクリプトをリセットする。
       llResetScript();

}</lsl>

オブジェクトが rez される時にスクリプトをリセットするというのは、多くのアプリケーションで妥当かつ簡単な解決方法です。 <lsl>on_rez(integer start_param) { //オブジェクトが rez されたら、スクリプトをリセットする。

   llResetScript();

}</lsl>

オーナーが変更される時にも変数の値を保持する必要があったり、スクリプトの起動に時間がかかるという場合、スクリプトをリセットする手法は適切でありません。そうした場合は、例えば誰にアニメーションを適用するかといったオーナー依存のコードと同様、新しいオーナーの key を listen 関数に入れ直す必要があるでしょう。

オブジェクトが rez されたりオーナーが変更される都度、オーナー依存のコードを強制的に初期化するために、on_rez イベントと changed イベントを利用できます。

<lsl>integer listen_handle;

init() {

   key owner = llGetOwner();
   llListenRemove(listen_handle);
   listen_handle = llListen(0, "", owner, "");
   llRequestPermissions(owner, PERMISSION_TRIGGER_ANIMATION);

}

default {

   state_entry()
   {
       init();
       //rez されたりオーナー変更の度に実行しなくともよい、その他の初期化コードをここに追加
       //例えば、ノートカードから設定情報を読み取る等
   }
   on_rez(integer start)
   {
       init();
   }
   changed(integer change)
   {
       if (change & CHANGED_OWNER)
           init();
   }
   run_time_permissions(integer perm)
   {//用心深く、llRequestPermissions と共に常に run_time_permissions イベントを使う事。
       if(perm & PERMISSION_TRIGGER_ANIMATION)
       {
           //アニメーション制御、タイマーの開始などをここに記述。
           llOwnerSay("I have animation permissions");
       }
   }

}</lsl>

関連項目

関数

•  llGetCreator
•  llGetOwnerKey
•  llDetectedOwner

特記事項

Search JIRA for related Issues

Signature

function key llGetOwner();
この翻訳は 原文 と比べて古いですか?間違いがありますか?読みにくいですか?みんなで 修正 していきましょう! (手順はこちら)
この項目はあなたにとって参考にならない項目ですか?もしかしたらLSL Wikiの関連した項目が参考になるかもしれません。