2008年03月17日

センサーを使わずにアバターがある領域にいるかチェック

半径20m程度の領域に特定の人がいるかどうかチェックし、いなくなったらアクションを起こすようなスクリプトを作っていたのですが、llSensorRepeat()等を使うとSIMに負担がかかるという指摘があり、透明オブジェクトで領域を覆ってコリジョンで判定する方法を取ろうと思ったのですが、
llVolumeDetect()を使用する場合、領域が広いので1プリムでは収まりません。で、たとえば一辺10mの立方体を二つ並べてリンクさせたとします。プリム1の中にいて、プリム2に歩いて移動する場合、プリム2に差し掛かった段階でcollision_startが発生し、その後完全にプリム1を出た段階でcollision_endが発生します。つまりプリム2の中にいるにもかかわらず、外に出た情報が最後に来てしまいます。リンク内のどのプリムでイベントが起こっているか判定すればいいかと思いましたが、llVolumeDetectを使用した場合、llDetectedLinkNumberが常に0を返すということで、これも無理。頭をひねってみましたが、どうもこの方法だと、確実に領域内にいることを判定できない気がします。
Hugeプリムを使って、一個のプリムで済ませてしまえば大丈夫かもしれませんが、これもSIMの負担になるという話ですし、なにかいい方法はないでしょうか。


同じカテゴリー(スクリプト関連)の記事画像
オブジェクトのリンクとタッチで開く扉
自動チャットを止めたい
テレポートするとアニメーションが解除される
同じカテゴリー(スクリプト関連)の記事
 テクスチェンジのHUDについて (2015-07-01 04:51)
 モール用のプリムカウンターを探しています (2014-11-29 20:09)
 連続するアニメーションの処理 (2014-08-24 03:23)
 オブジェクトの上にフローティングテキストを出す。 (2014-08-22 16:46)
 チャットログの盗聴について (2014-02-03 03:43)
 椅子に座った後で位置調整できるスクリプト (2013-03-24 16:37)

Posted by Hitomi Magne  at 12:43 │Comments(4)スクリプト関連

この記事へのコメント
Magneさん、ささぴさんこんばんは。
ちょっと割り込みます…

テレポートで離れた場合はcollision_endが発生しませんので、
対象者がテレポートしたら動きっぱなしになってしまう気がします。

「その場所に入った」はcollision_startで拾い、
後はタイマー(短いと負荷になるので…60sec間隔くらい?)で
llGetObjectDetailsのOBJECT_POSを取得して
領域内にいるかチェックするのはどうでしょう?
Posted by Nullpo at 2008年03月17日 20:15
なるほどー
参考になります。llDetectedPosを使うという方法を思いつきませんでした。
領域判定を自分でやるので多少複雑にはなりますが、うまくいきそうですね。

質問のあとで、プリムの中からテレポートしたらどうなるかとか、ログアウトしたらとか、色々疑問点が出てきたので実験してみました。テレポートは同じSIM内ならcollision_endが発生し、llDetectedPosはテレポート先の座標を示すようですが、SIM外に飛んでしまうとイベントが発生しないようです。また、その場でログアウトした場合もイベントなしのようですね。ログアウトはタイマーで一定時間ごとにオンライン状態を取得すればいいかと思いますが、SIM外へのテレポートはどうしたものかなあ。llKey2Nameで空文字列が返るかどうかチェックすればいいのかな?。

ともかくありがとうございました。すっかりどうしたらいいかわからなくなっていましたが、おかげで進めそうです。
Posted by Hitomi MagneHitomi Magne at 2008年03月17日 20:34
Nullpo さんの書き込みを読む前に上のコメントを書いてしまいました。
llGetObjectDetailsはノーチェックでした。関数名がObjectなので、アバターは別だと思っていました^^;
結局上で書いたようにタイマーは使うことになると思うので、llGetObjectDetailsを使うことを考えます。こちらならわざわざ複数のプリムで領域を覆わなくてもいいので、プリムの節約になりますし。領域を出た瞬間に動作しなければいけないものでもないので。

どうもありがとうございました。
Posted by Hitomi MagneHitomi Magne at 2008年03月17日 20:48
ささぴさん

ささぴさんのスクリプトと合わせて使うことは考えていませんでした。
半径20mとのことなので、領域の中心座標とアバター座標の距離を
llVecDistにかけて20m以下かどうかで判定ですかね。

また、センサーを使った場合はセンサーを実行するオブジェクトが
領域の中心にある必要があるので、そこらへんの制限を気にせず使える
llGetObjectDetailsを薦めた次第です。
Posted by Nullpo at 2008年03月18日 03:55
<ご注意>
書き込まれた内容は公開され、ブログの持ち主だけが削除できます。