Welcomeマットを作ろう

俗にwelcomeマットというもの。アイテムとしては店先にある玄関マットの事ですがSecondLife的には来訪者に何らかのアクションを行うアイテムというところでしょうか。どうやって来訪者を検出して動作をするかで色々なタイプが考えられます。

・そのまま玄関マット形状でアバターの衝突を契機にするもの
・透明なVolumeDetect物でアバターの衝突を契機にするもの
・ドアなどの出入り口の操作などを契機にするもの
・範囲レーダーでアバターの検出を契機にするもの
・区画に存在するアバターの増減を契機にするもの
・CastRayで遮蔽物としてアバターの検出を契機にするもの

まぁ普通に考えると上2つでしょうね。



VolumeDetectというのは左図のように見た目はファントムのオブジェクトと同じでアバターなど物理物が通過できますがファントムと違って衝突の検出が可能なものです。板状の敷物だとテレポートの着地時に浮遊しているアバターだと衝突が発生しませんがVolumeDetectなら飛んでいるアバターでも検出できます。

どうしてこんな基本的なスクリプトに触れてみたかは、あまりにも簡単なことなので誰もわざわざ書こうとしないと思ったからw 簡単な事でもきっかけがないとやってみようとか思わないでしょうから、わざとらしく書いてみるということなのです。 特に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をトリガーにして動作させれば別のスクリプトは停止してもメインのスクリプトは影響なく動き続けます。そういった工夫をしてみましょう。

2017/01/10

Posted by まゆみ.H
X f B! P L

Search (in blogs)

Featured

今も続くアバターの身長問題。身長=158cmは子供ですか、そーですか。

もともとリアルサイズなアバター故にアジア圏以外が主催のSIMなどでは低身長として扱われることも少なくなかったのですが、さほど気にせず自分の好みの見た目として楽しんでいました。ところが、先日、とあるSIMを訪問した時に「身長が5フィート以下だから子供は帰りなさい」というメッ...

Picks

クリエイティブ・コモンズ・ライセンス

template by QooQ