Difference between revisions of "LlGetOwner/ja"
Jump to navigation
Jump to search
Mako Nozaki (talk | contribs) m (Undo revision 849642 by Mako Nozaki (Talk)) |
|||
(One intermediate revision by one other user not shown) | |||
Line 5: | Line 5: | ||
|func_footnote | |func_footnote | ||
|func_desc | |func_desc | ||
|return_text=オブジェクトのオーナーの{{LSLG/ja|UUID}} | |return_text=オブジェクトのオーナーの {{LSLG/ja|UUID}} | ||
|spec | |spec | ||
|caveats=*オブジェクトのオーナーが変わった場合、この関数の戻り値に依存したコードもそれに合わせて自動的にアップデートされたり再評価されるわけではありません。 | |caveats=*オブジェクトのオーナーが変わった場合、この関数の戻り値に依存したコードもそれに合わせて自動的にアップデートされたり再評価されるわけではありません。 | ||
**すなわち新しいオーナーについて改めて[[llListen/ja|listen]]および[[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}}イベント時) にそれが変更されたか調べます。どちらの手法も有効ですが、後者はオブジェクトが手渡しでなく "オリジナルとして販売" された場合に検知できません。 | ||
|constants | |constants | ||
|examples= | |examples= | ||
< | <source lang="lsl2">llOwnerSay( (string)llGetOwner()); // アバターの "key" (UUID) をチャットで話す。 | ||
llOwnerSay( llKey2Name(llGetOwner())); // オーナーが SIM 内に居るならば、その名前をチャットで話す。</ | llOwnerSay( llKey2Name(llGetOwner())); // オーナーが SIM 内に居るならば、その名前をチャットで話す。</source> | ||
< | <source lang="lsl2">default | ||
{ | { | ||
state_entry() | state_entry() | ||
Line 28: | Line 28: | ||
llResetScript(); | llResetScript(); | ||
} | } | ||
}</ | }</source> | ||
|helpers | |helpers | ||
|also_functions= | |also_functions= | ||
Line 38: | Line 38: | ||
|also_articles | |also_articles | ||
|notes= | |notes= | ||
オーナー名を取得する場合、オーナーが同じリージョンに居る場合は{{LSLG/ja|llKey2Name}}を、リージョンに居ない場合は{{LSLG/ja|llRequestAgentData}}を使います。 | オーナー名を取得する場合、オーナーが同じリージョンに居る場合は {{LSLG/ja|llKey2Name}} を、リージョンに居ない場合は {{LSLG/ja|llRequestAgentData}} を使います。 | ||
多くのプログラマが直面する問題の一つは、オーナーを参照する駆動済みのイベントが、オーナーの変更に自動的に対応しない点です。典型的なのは、オーナーを Listen していると現在のオーナーでなく前のオーナーを Listen し続けるというケースです。これは {{LSLG/ja|llGetOwner}} 関数や {{LSLG/ja|llListen}} 関数の不具合と誤解される事がありますが、そうでなく仕様の一部です。この問題を回避するいくつかの方法があります。簡単なのはオーナーが変わったり rez された時にスクリプトをリセットする事です。尤も、簡単な解決法が常に正しい解決法とは限りません。 | 多くのプログラマが直面する問題の一つは、オーナーを参照する駆動済みのイベントが、オーナーの変更に自動的に対応しない点です。典型的なのは、オーナーを Listen していると現在のオーナーでなく前のオーナーを Listen し続けるというケースです。これは {{LSLG/ja|llGetOwner}} 関数や {{LSLG/ja|llListen}} 関数の不具合と誤解される事がありますが、そうでなく仕様の一部です。この問題を回避するいくつかの方法があります。簡単なのはオーナーが変わったり rez された時にスクリプトをリセットする事です。尤も、簡単な解決法が常に正しい解決法とは限りません。 | ||
オーナーの変更を検知するには2つの方法があり、より信頼できるのは {{LSLG/ja|changed}} イベントを利用することです。 | オーナーの変更を検知するには2つの方法があり、より信頼できるのは {{LSLG/ja|changed}} イベントを利用することです。 | ||
< | <source lang="lsl2">changed(integer change) | ||
{ | { | ||
if (change & CHANGED_OWNER)// | if (change & CHANGED_OWNER)//オーナーが変わったら、スクリプトをリセットする。 | ||
llResetScript(); | llResetScript(); | ||
}</ | }</source> | ||
オブジェクトが rez される時にスクリプトをリセットするというのは、多くのアプリケーションで妥当かつ簡単な解決方法です。 | オブジェクトが rez される時にスクリプトをリセットするというのは、多くのアプリケーションで妥当かつ簡単な解決方法です。 | ||
< | <source lang="lsl2">on_rez(integer start_param) | ||
{ //オブジェクトが rez されたら、スクリプトをリセットする。 | { //オブジェクトが rez されたら、スクリプトをリセットする。 | ||
llResetScript(); | llResetScript(); | ||
}</ | }</source> | ||
オーナーが変更される時にも変数の値を保持する必要があったり、スクリプトの起動に時間がかかるという場合、スクリプトをリセットする手法は適切でありません。そうした場合は、例えば誰にアニメーションを適用するかといったオーナー依存のコードと同様、新しいオーナーの key を listen 関数に入れ直す必要があるでしょう。 | オーナーが変更される時にも変数の値を保持する必要があったり、スクリプトの起動に時間がかかるという場合、スクリプトをリセットする手法は適切でありません。そうした場合は、例えば誰にアニメーションを適用するかといったオーナー依存のコードと同様、新しいオーナーの key を listen 関数に入れ直す必要があるでしょう。 | ||
Line 59: | Line 59: | ||
オブジェクトが rez されたりオーナーが変更される都度、オーナー依存のコードを強制的に初期化するために、{{LSLG/ja|on_rez}} イベントと {{LSLG/ja|changed}} イベントを利用できます。 | オブジェクトが rez されたりオーナーが変更される都度、オーナー依存のコードを強制的に初期化するために、{{LSLG/ja|on_rez}} イベントと {{LSLG/ja|changed}} イベントを利用できます。 | ||
< | <source lang="lsl2">integer listen_handle; | ||
init() | init() | ||
Line 97: | Line 97: | ||
} | } | ||
} | } | ||
}</ | }</source> | ||
|cat1=Owner | |cat1=Owner | ||
|cat2=Object | |cat2=Object |
Latest revision as of 04:02, 25 February 2016
LSL ポータル | 関数 | イベント | 型 | 演算子 | 定数 | 実行制御 | スクリプトライブラリ | カテゴリ別スクリプトライブラリ | チュートリアル |
警告
- オブジェクトのオーナーが変わった場合、この関数の戻り値に依存したコードもそれに合わせて自動的にアップデートされたり再評価されるわけではありません。
- すなわち新しいオーナーについて改めて listen および パーミション要求 を行う必要があります。
- これはlistenとパーミションに限った話でなく、戻り値を保持するあらゆる処理にあてはまります。この制約に関わる処理を書くプログラマ次第です。
- オーナーの変更を検知するには、 changed イベントで CHANGED_OWNER フラグを用いるか (2番目の例を参照) 、以前の値を保存しておき、折に触れて (例えばon_rezイベント時) にそれが変更されたか調べます。どちらの手法も有効ですが、後者はオブジェクトが手渡しでなく "オリジナルとして販売" された場合に検知できません。
- すなわち新しいオーナーについて改めて listen および パーミション要求 を行う必要があります。
サンプル
llOwnerSay( (string)llGetOwner()); // アバターの "key" (UUID) をチャットで話す。
llOwnerSay( llKey2Name(llGetOwner())); // オーナーが SIM 内に居るならば、その名前をチャットで話す。
default
{
state_entry()
{
llInstantMessage(llGetOwner(), "この声はあなたしか聞こえない。薄気味悪いでしょ。");
}
changed(integer change)
{
if (change & CHANGED_OWNER)
llResetScript();
}
}
注意点
オーナー名を取得する場合、オーナーが同じリージョンに居る場合は llKey2Name を、リージョンに居ない場合は llRequestAgentData を使います。
多くのプログラマが直面する問題の一つは、オーナーを参照する駆動済みのイベントが、オーナーの変更に自動的に対応しない点です。典型的なのは、オーナーを Listen していると現在のオーナーでなく前のオーナーを Listen し続けるというケースです。これは llGetOwner 関数や llListen 関数の不具合と誤解される事がありますが、そうでなく仕様の一部です。この問題を回避するいくつかの方法があります。簡単なのはオーナーが変わったり rez された時にスクリプトをリセットする事です。尤も、簡単な解決法が常に正しい解決法とは限りません。
オーナーの変更を検知するには2つの方法があり、より信頼できるのは changed イベントを利用することです。
changed(integer change)
{
if (change & CHANGED_OWNER)//オーナーが変わったら、スクリプトをリセットする。
llResetScript();
}
オブジェクトが rez される時にスクリプトをリセットするというのは、多くのアプリケーションで妥当かつ簡単な解決方法です。
on_rez(integer start_param)
{ //オブジェクトが rez されたら、スクリプトをリセットする。
llResetScript();
}
オーナーが変更される時にも変数の値を保持する必要があったり、スクリプトの起動に時間がかかるという場合、スクリプトをリセットする手法は適切でありません。そうした場合は、例えば誰にアニメーションを適用するかといったオーナー依存のコードと同様、新しいオーナーの key を listen 関数に入れ直す必要があるでしょう。
オブジェクトが rez されたりオーナーが変更される都度、オーナー依存のコードを強制的に初期化するために、on_rez イベントと changed イベントを利用できます。
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");
}
}
}
関連項目
関数
• | llGetCreator | |||
• | llGetOwnerKey | |||
• | llDetectedOwner |
特記事項
この項目はあなたにとって参考にならない項目ですか?もしかしたらLSL Wikiの関連した項目が参考になるかもしれません。