・そのまま玄関マット形状でアバターの衝突を契機にするもの
・透明なVolumeDetect物でアバターの衝突を契機にするもの
・ドアなどの出入り口の操作などを契機にするもの
・範囲レーダーでアバターの検出を契機にするもの
・区画に存在するアバターの増減を契機にするもの
・CastRayで遮蔽物としてアバターの検出を契機にするもの
まぁ普通に考えると上2つでしょうね。
VolumeDetectというのは左図のように見た目はファントムのオブジェクトと同じでアバターなど物理物が通過できますがファントムと違って衝突の検出が可能なものです。板状の敷物だとテレポートの着地時に浮遊しているアバターだと衝突が発生しませんがVolumeDetectなら飛んでいるアバターでも検出できます。
key Prev_KEY;
default{
state_entry(){
llVolumeDetect(TRUE);//VolumeDetectを使わない場合、この行は削除
}
collision_start(integer num_detected){
//アバター以外の衝突は無視する
if(!(llDetectedType(0) & AGENT)) return;
//前回と同じKeyの場合は無視する
if(llDetectedKey(0) == Prev_KEY ) return;
//key値の置き換え
Prev_KEY = llDetectedKey(0);
//カウンタの加算
integer CNT = (integer)llGetObjectDesc();
if(CNT == 0xFFFFFFFF) CNT = 0;//越える事はないと思われるけど念のため
llSetObjectDesc((string)(++CNT));
//メッセージの出力など
llRegionSayTo(Prev_KEY,0, "ようこそ!いらっしゃいませ♪ " + (string)CNT + "番目のお客様。");
llRegionSayTo(Prev_KEY,0, "ごゆっくりお楽しみ下さい。");
}
}
お堅い人だと衝突で複数個検出したらどーするのと思うでしょうけど、そんな同一フレーム内でアバターが同時に現れるなんてあり得ませんから気にしなくていいかとw それでも気になる人は検出個数分ループで回しましょう。 あと注意点としてはこういったアイテムでは遅延による動作停止はマズイのでllInstantMessageなどのディレイのある関数使用は避けましょう。 どうしても来訪者の有無をIMで通知したりメールで送ったりなどディレイのある関数を使いたい場合は、別のスクリプトを用意してLinkMessageをトリガーにして動作させれば別のスクリプトは停止してもメインのスクリプトは影響なく動き続けます。そういった工夫をしてみましょう。
0 件のコメント:
コメントを投稿