2008年03月17日
センサーを使わずにアバターがある領域にいるかチェック
半径20m程度の領域に特定の人がいるかどうかチェックし、いなくなったらアクションを起こすようなスクリプトを作っていたのですが、llSensorRepeat()等を使うとSIMに負担がかかるという指摘があり、透明オブジェクトで領域を覆ってコリジョンで判定する方法を取ろうと思ったのですが、
llVolumeDetect()を使用する場合、領域が広いので1プリムでは収まりません。で、たとえば一辺10mの立方体を二つ並べてリンクさせたとします。プリム1の中にいて、プリム2に歩いて移動する場合、プリム2に差し掛かった段階でcollision_startが発生し、その後完全にプリム1を出た段階でcollision_endが発生します。つまりプリム2の中にいるにもかかわらず、外に出た情報が最後に来てしまいます。リンク内のどのプリムでイベントが起こっているか判定すればいいかと思いましたが、llVolumeDetectを使用した場合、llDetectedLinkNumberが常に0を返すということで、これも無理。頭をひねってみましたが、どうもこの方法だと、確実に領域内にいることを判定できない気がします。
Hugeプリムを使って、一個のプリムで済ませてしまえば大丈夫かもしれませんが、これもSIMの負担になるという話ですし、なにかいい方法はないでしょうか。
llVolumeDetect()を使用する場合、領域が広いので1プリムでは収まりません。で、たとえば一辺10mの立方体を二つ並べてリンクさせたとします。プリム1の中にいて、プリム2に歩いて移動する場合、プリム2に差し掛かった段階でcollision_startが発生し、その後完全にプリム1を出た段階でcollision_endが発生します。つまりプリム2の中にいるにもかかわらず、外に出た情報が最後に来てしまいます。リンク内のどのプリムでイベントが起こっているか判定すればいいかと思いましたが、llVolumeDetectを使用した場合、llDetectedLinkNumberが常に0を返すということで、これも無理。頭をひねってみましたが、どうもこの方法だと、確実に領域内にいることを判定できない気がします。
Hugeプリムを使って、一個のプリムで済ませてしまえば大丈夫かもしれませんが、これもSIMの負担になるという話ですし、なにかいい方法はないでしょうか。
テクスチェンジのHUDについて
モール用のプリムカウンターを探しています
連続するアニメーションの処理
オブジェクトの上にフローティングテキストを出す。
チャットログの盗聴について
椅子に座った後で位置調整できるスクリプト
モール用のプリムカウンターを探しています
連続するアニメーションの処理
オブジェクトの上にフローティングテキストを出す。
チャットログの盗聴について
椅子に座った後で位置調整できるスクリプト
ちょっと割り込みます…
テレポートで離れた場合はcollision_endが発生しませんので、
対象者がテレポートしたら動きっぱなしになってしまう気がします。
「その場所に入った」はcollision_startで拾い、
後はタイマー(短いと負荷になるので…60sec間隔くらい?)で
llGetObjectDetailsのOBJECT_POSを取得して
領域内にいるかチェックするのはどうでしょう?
参考になります。llDetectedPosを使うという方法を思いつきませんでした。
領域判定を自分でやるので多少複雑にはなりますが、うまくいきそうですね。
質問のあとで、プリムの中からテレポートしたらどうなるかとか、ログアウトしたらとか、色々疑問点が出てきたので実験してみました。テレポートは同じSIM内ならcollision_endが発生し、llDetectedPosはテレポート先の座標を示すようですが、SIM外に飛んでしまうとイベントが発生しないようです。また、その場でログアウトした場合もイベントなしのようですね。ログアウトはタイマーで一定時間ごとにオンライン状態を取得すればいいかと思いますが、SIM外へのテレポートはどうしたものかなあ。llKey2Nameで空文字列が返るかどうかチェックすればいいのかな?。
ともかくありがとうございました。すっかりどうしたらいいかわからなくなっていましたが、おかげで進めそうです。
llGetObjectDetailsはノーチェックでした。関数名がObjectなので、アバターは別だと思っていました^^;
結局上で書いたようにタイマーは使うことになると思うので、llGetObjectDetailsを使うことを考えます。こちらならわざわざ複数のプリムで領域を覆わなくてもいいので、プリムの節約になりますし。領域を出た瞬間に動作しなければいけないものでもないので。
どうもありがとうございました。
ささぴさんのスクリプトと合わせて使うことは考えていませんでした。
半径20mとのことなので、領域の中心座標とアバター座標の距離を
llVecDistにかけて20m以下かどうかで判定ですかね。
また、センサーを使った場合はセンサーを実行するオブジェクトが
領域の中心にある必要があるので、そこらへんの制限を気にせず使える
llGetObjectDetailsを薦めた次第です。