セカンドライフ内では、作ったオブジェクトにプログラムを組み込むことで、いろいろなモノを創造することが出来ます。
今回は、センサー(sensor)について分かったことをメモしておきます。
センサーを使うと、指定した範囲内に任意のオブジェクトが入った場合に特定の動作を行うような処理を行うことが出来ます。
たとえば、キャッチボール用に、ボールとミットを作成するとしましょう。
投げたボールがミットに収まったかどうかの判断は、センサーで行う必要がありそうです。
なぜなら、ボールからみると、自分に触れたミットに対して収まってあげる必要があるからです。
この「触れた」を実現するのがセンサーです。
まあ、キャッチボールなんていう高度な処理は置いておいて、今回はセンサーに限ってテストしてみました。
調べたところ、イベントに「sensor」「no_sensor」というものが存在し、
センサーの設定を行う「llSensor」と「llSensorRepeat」という関数があることがわかりました。
つまり、llSensorで初期設定を行い、実際にセンサーに反応があると、sensorイベントで拾えるということです。
テストとして、以下のようなスクリプトを実装してみました。
組み込むオブジェクトは何でもOKです。
1:default
2:{
3:
4: state_entry()
5: {
6: llSay(DEBUG_CHANNEL,"TestStart");
7: llSensorRepeat("",NULL_KEY,AGENT,5.0,PI,0.5);
8: }
9:
10: // SensorTest
11: sensor(integer total_number)
12: {
13: llSay(DEBUG_CHANNEL, (string)total_number + " avatars detected" );
14: integer i;
15: for (i = 0; i < total_number; i++)
16: {
17: llSay(DEBUG_CHANNEL, llDetectedName(i));
18: }
19: }
20: }
state_entry()はオブジェクトが現れた際に実行されます。
ここでは、TestStartというデバッグ出力を行ってから、
llSensorRepeat("",NULL_KEY,AGENT,5.0,PI,0.5);
で、センサーの設定を行っています。
llSensorRepeat()関数は、Sensor処理を繰り返し行う処理です。
(llSensorであれば、一度だけ処理を行うようです)
第1引数は、対象となるオブジェクトの名前を指定します。
第2引数は、対象となるオブジェクトのIDです。
ここでは、""とNULL_KEYにしているので、あらゆるオブジェクトが対象です。
3つ目は、対象となるオブジェクトの種類のようです。
AGENTは、人ということでしょうか。
その後の2つの引数はセンサーの動作範囲を指定しています。
第4引数で、距離を指定します。(最大値は96mです)
第5引数で、角度ですが、これはここのページの下の図を見てもらうと分かりやすいです。
ここではPIとしているので、球状の範囲となります。
第6引数は、センサーを繰り返し動作させるインターバル時間です。
11行目からは、センサーに反応があった場合の処理になります。
sensorイベントの引数は、引っかかったオブジェクトの総数です。
13行目で何個見つかったか出力し、
その後に、見つかったすべてのオブジェクトの名前を羅列しています。
llDetectedName()で見つかったオブジェクトの名前を取得可能です。
しかし、結構簡単でした。
これがあれば、キャッチボールという複雑な動作も簡単に実現できるかもしれません。
範囲に入っただけで動作を行うことができるセンサーは使いでがありそうな機能です。
使い方によっては、「罠」も簡単ですね。
試しに、肥溜めでもつくろうかしらw
近くを通ると肥溜めにハマり、強制的にウ○コが装備されるとかw
あと、武器系もこれで作れそうな気がします。


