ソラマメブログ

2007年06月28日

リファレンス【D】

llD・・・から始まる関数のリファレンスです。
llDeleteSubList
llDeleteSubString
llDetachFromAvatar
llDetectedGrab
llDetectedGroup
llDetectedKey
llDetectedLinkNumber
llDetectedName
llDetectedOwner
llDetectedPos
llDetectedRot
llDetectedType
llDetectedVel
llDialog
llDie
llDumpList2String




llDeleteSubList

list llDeleteSubList(list src, integer start, integer end)

リストsrcのstart位置からend位置までの要素を削除した結果リストを返す。
例えば[1,2,3,4,5,6]というリストがあったとき、startに2、endに4を指定すると、2番目~4番目の要素が取り除かれたリストを返す。
  llDeleteSubList([1,2,3,4,5,6], 2, 4) → [1,2,6]
リストの先頭は0番目から数えることに注意。

start、endともに0だった場合は、0番目の要素のみが取り除かれたリストが返る。
  llDeleteSubList([1,2,3,4,5,6], 0, 0) → [2,3,4,5,6]

リストの要素数はllGetListLength関数を使って取得可能である。
要素の最大インデックスはllGetListLength - 1となる。
startに0、endに要素の最後のインデックスを指定した場合は空のリストが返る。
  llDeleteSubList(src_list, 0, llGetListLength(src_list) - 1) → []

startまたはendにマイナスの数値を指定した場合、「後ろから数えた位置」になる。
例えば-1であれば、後ろから1番目、すなわち最後の項目である。
仮にリストの中身がソートされているなら、endにマイナス値を指定してワースト3などを抜き出すことが可能となる。
  llDeleteSubList([1,2,3,4,5,6], 0, -3) → [4,5,6]

さらにややこしい話だが、startにendよりも大きい値を指定した場合、start以上、end以下の要素が削除された結果が返る。
  llDeleteSubList([1,2,3,4,5,6], 4, 1) → [3,4]

llDeleteSubList関数は引数に指定したsrcリストの中身を変更するわけではない。
あくまでも元のリストはそのままにして、結果を返すだけである。
元のリストの中身を変更したい場合は、llDeleteSubList関数の結果を元の変数に代入する必要がある。
  src = llDeleteSubList(src, 3, 6);
このようにすると、リスト型変数srcに3番目~6番目の要素を削除した結果が入る。




llDeleteSubString

string llDeleteSubString(string source, integer start, integer end)

文字列sourceのstart番目~end番目の文字を削除した結果の文字列を返す。
例えば"ABCDEFG"という文字列があったとき、startに2、endに4を指定すると、2番目~4番目の文字が取り除かれた文字列"ABFG"を返す。
  llDeleteSubString("ABCDEFG", 2, 4) → "ABFG"
文字列の先頭文字は0番目となるので注意すること。

startまたはendにマイナスの数値を指定した場合、「後ろから数えた位置」になる。
例えば-1であれば、後ろから1番目、すなわち最後の文字である。
従って、startが0、endが-1だった場合は最初から最後の文字全てが削除されるので空文字が返る。
  llDeleteSubString("ABCDEFG", 0, -1) → ""

さらにややこしい話だが、startにendよりも大きい値を指定した場合、start以上、end以下の文字が削除された結果が返る。
  llDeleteSubString("ABCDEFG", 4, 1) → "CD"

llDeleteSubString関数は引数に指定した文字列を変更するわけではない。
あくまでも元の文字列はそのままにして、結果を返すだけである。
元の文字列を変更したい場合は、llDeleteSubString関数の結果を元の変数に代入する必要がある。
  src = llDeleteSubString(src, 3, 6);
このようにすると、変数srcに3番目~6番目の文字を削除した結果が入る。




llDetachFromAvatar

llDetachFromAvatar()

オブジェクトをデタッチする。
デタッチするのはスクリプト実行中のオブジェクト(自分自身)である。
この関数の実行にはPERMISSION_ATTACHパーミッションが必要となる。

当然ながら、アタッチメントでなければ効果はない。
また、ルートprimから実行しなけれなならないという制約もあるので注意。




llDetectedGrab

vector llDetectedGrab(integer number)

タッチイベントにおいて、オブジェクトがドラッグ移動されている方向を取得する。
どういうことかと言うと、移動可能なワールド内のオブジェクトの上でマウス左ボタンをホールドし、そのままマウスを動かすとオブジェクトを移動させることができるが、そのときの移動方向を取得する関数である。
オブジェクトは物理オブジェクトである必要はない。

この関数で取得されるのはあくまでもドラッグ移動されている方向だけであり、例えばインパルスやフォースなどで物理的に動かされている場合はZERO_VECTORが返る。

llDetectedGrabはデテクト系の関数の一つである。
デテクト系関数についてはllDetectedKeyの説明もしくは初級スクリプト第二十回「センサーを使おう」のセンサーイベントについての説明を参照のこと。
ただしllDetectedGrabはtouchイベント内でしか効果がない。
touch_startイベントやtouch_endイベントでも無効である。

この関数の面白みは「ユーザーがマウスを動かしている方向を取得できる」という点にある。
HUDにおいても使うことができるため、アナログジョイスティック的な入力インターフェースの実装も不可能ではない。
ビークルに組み込んで、操縦菅をマウスで動かして飛ばすなんていう仕組みも考えられる。
あるいはテクスチャのオフセット値と連動させて「マウスでスクロールできる地図」のようなものも作れるだろう。

使っている人をあまり見かけないのだが、いろいろと可能性のある関数だと思う。




llDetectedGroup

integer llDetectedGroup(integer number)

検知されたアバター/オブジェクトのグループが、自分自身(スクリプトを実行しているオブジェクト)のグループと同じかどうかを判定する。
同じグループだった場合はTRUE、そうでない場合はFALSEを返す。
アバターが同じグループに所属していたとしても、そのグループをアクティブにしていない場合はFALSEを返すので注意。

スクリプトを実行しているオブジェクトにグループが設定されていなかった場合は、検知されたアバター/オブジェクトがグループに所属していない(またはどのグループもアクティブにしてない)場合のみTRUEを返す。

llDetectedGroupはデテクト系の関数の一つである。
デテクト系関数についてはllDetectedKeyの説明もしくは初級スクリプト第二十回「センサーを使おう」のセンサーイベントについての説明を参照のこと。

以下の例はオブジェクトのグループメンバーがタッチした場合のみ処理を行う。
default {
  touch_start(integer num_detected) {
    if (llDetectedGroup(0)){
      llSay(0, "Same Group!");
    }
  }
}





llDetectedKey

key llDetectedKey(integer number)

検知されたアバター/オブジェクトのUUIDを取得する。

llDetectedKeyはデテクト系と呼ばれる関数の一つである。
デテクト系関数は以下のイベント内でしか効果がない。
  touch/touch_start/touch_end・・・タッチ系イベント
  collision/collision_start/collision_end・・・衝突系イベント
  sensor・・・センサーイベント
というのも、デテクト系関数とは「そのイベントを起こしたアバター/オブジェクトの情報を得る」ための関数だからである。
タッチ系イベント内で使用すれば「タッチしたアバターの情報を得る」関数となり、
衝突系イベントであれば「衝突したアバター/オブジェクトの情報を得る」関数、
センサーイベント内で使えば「センサーで検知されたアバター/オブジェクトの情報を得る」関数となる。

デテクト系関数の引数には何番目に検知されたアバター/オブジェクトかを指定する。
多くの場合、引数は0(最初に検知されたアバター/オブジェクト)である。
どういうことかと言うと、上記の特定イベントは、「イベントを起こしたアバター/オブジェクトの数」を通知してくる。
タッチスタートイベントであれば、「タッチを開始したアバターの人数」が通知される。
同時に複数のアバターがタッチを開始することはないので、人数は常に1人である。
であるので、デテクト系に指定する引数は、0(タッチを開始した最初の人)になる。

センサーイベントなどでは、同時に複数の対象が検出される可能性がある。
その場合は検知された対象の数が通知される。
例えば周囲50m以内にいるアバターを検知した結果、5人いた場合はセンサーイベントの引数に5が通知されてくる。
その場合、デテクト系関数の引数は、0を指定すると最初のアバターの情報、4が最後のアバターの情報になる(0から数える)。

以下の例はタッチしたアバターのUUIDを表示する。
default {
  touch_start(integer num_detected) {
    llSay(0, "Key = " + (string)llDetectedKey(0));
  }
}


以下の例は周囲50m以内のアバターを検知し、検知された対象のUUIDを全て表示する。
default {
  touch_start(integer num_detected){
    llSensor("", NULL_KEY, AGENT, 50.0, PI);
  }
  
  sensor(integer num_detected) {
    integer i;
    for (i = 0; i < num_detected; i ++){
      llSay(0, "No." + (string)i + " Key = " + (string)llDetectedKey(0));
    }
  }
}





llDetectedLinkNumber

integer llDetectedLinkNumber(integer number)

タッチもしくは衝突イベントがどのprimにおいて起こったのかを取得する。
戻り値はリンクナンバーである。
例えばタッチイベント内で使用した場合は、タッチされたprimのリンクナンバーを返す。
衝突イベント内であれば、衝突したprimのリンクナンバーを返す。

オブジェクトが単一primの場合は、戻り値は0である。
2つ以上のprimがリンクされていた場合、ルートprimは1、2以降は子primとなる。

この関数はタッチイベントもしくは衝突イベント内でしか効果がない。

llDetectedLinkNumberはデテクト系の関数の一つである。
デテクト系関数についてはllDetectedKeyの説明もしくは初級スクリプト第二十回「センサーを使おう」のセンサーイベントについての説明を参照のこと。

以下の例はタッチされたprimのリンクナンバーを表示する。
default {
  touch_start(integer num_detected){
    llSay(0, "Link number " + llDetectedLinkNumber(0) + " is touched.");
  }
}


この関数の最も便利な使い道は、HUDなど「ボタン」を持つオブジェクトにおいて、どのボタンが押されたのかの判別を行うことである。
以下はタッチされたprimの「名称」に応じて処理を行う。
リンクナンバーそのものはオブジェクトを編集する過程で変化する可能性があるため、以下のような実装をしておいたほうがメンテナンス性が良い。
default {
  touch_start(integer num_detected){
    string prim_name = llGetLinkName(llDetectedLinkNumber(0));
    if (prim_name == "button1"){
      llSay(0, "Button1 was clicked.");
    }else if (prim_name == "button2"){
      llSay(0, "Button2 was clicked.");
    }else if (prim_name == "button3"){
      llSay(0, "Button3 was clicked.");
    }else if (prim_name == "button4"){
      llSay(0, "Button4 was clicked.");
    }
  }
}


なお、子primからタッチや衝突イベントを非通知にするには、llPassTouches関数やllPassCollisions関数を使用する。




llDetectedName

string llDetectedName(integer number)

検知されたアバター/オブジェクトの名称を取得する。

llDetectedNameはデテクト系の関数の一つである。
デテクト系関数についてはllDetectedKeyの説明もしくは初級スクリプト第二十回「センサーを使おう」のセンサーイベントについての説明を参照のこと。

なお、バグなのか仕様なのか不明だが、llDetectedName関数を使用した時点で対象のアバター/オブジェクトがSIM外に移動したり、EXITしてしまっている場合は、名前ではなくUUIDを返すらしい。

以下の例はタッチしたアバターの名前を表示する。
default {
  touch_start(integer num_detected) {
    llSay(0, "Hi, " + llDetectedName(0));
  }
}





llDetectedOwner

key llDetectedOwner(integer number)

検知されたオブジェクトのオーナーのUUIDを取得する。

llDetectedOwnerはデテクト系の関数の一つである。
デテクト系関数についてはllDetectedKeyの説明もしくは初級スクリプト第二十回「センサーを使おう」のセンサーイベントについての説明を参照のこと。

以下の例は衝突したオブジェクトのオーナーのUUIDを表示する。
default {
  collision_start(integer num_detected) {
    llSay(0, "Key of the owner is " + (string)llDetectedOwner(0));
  }
}

オーナーが分かるからと言って、衝突時の被害を弁償する請求が出せるわけではない。




llDetectedPos

vector llDetectedPos(integer number)

検知されたアバター/オブジェクトの位置を取得する。

llDetectedPosはデテクト系の関数の一つである。
デテクト系関数についてはllDetectedKeyの説明もしくは初級スクリプト第二十回「センサーを使おう」のセンサーイベントについての説明を参照のこと。

以下の例は衝突したアバター/オブジェクトの位置を表示する。
default {
  collision_start(integer num_detected) {
    llSay(0, "Detected position is " + (string)llDetectedPos(0));
  }
}





llDetectedRot

rotation llDetectedRot(integer number)

検知されたアバター/オブジェクトの回転値を取得する。

llDetectedRotはデテクト系の関数の一つである。
デテクト系関数についてはllDetectedKeyの説明もしくは初級スクリプト第二十回「センサーを使おう」のセンサーイベントについての説明を参照のこと。

以下の例は衝突したアバター/オブジェクトの回転値を表示する。
default {
  collision_start(integer num_detected) {
    llSay(0, "Detected rotation is " + (string)llDetectedRot(0));
  }
}


llDetectedRot関数で返されるアバターの回転は、通常はZ軸周囲の回転角度のみである(アバターはZ軸周囲しか回転しないため)。
しかし、アバターがマウスルック状態の場合は視点の回転値(=頭の回転値)を返す。




llDetectedType



検知対象の種別(アバター/オブジェクト/スクリプトの有無等)を返す。

llDetectedTypeはデテクト系の関数の一つである。
デテクト系関数についてはllDetectedKeyの説明もしくは初級スクリプト第二十回「センサーを使おう」のセンサーイベントについての説明を参照のこと。

llDetectedTypeの戻り値はビットフィールドになっている。
ビットフィールドとは、いくつかの値の組み合わせであり、フィールド内の特定の値がONかOFFかは&演算によって判別する。
  llDetectedType(0) & AGENT → フィールド"AGENT"がONならTRUE、OFFならFALSE
  llDetectedType(0) & (AGENT | ACTIVE) → フィールド"AGENT"と"ACTIVE"がともにONならTRUE、そうでなければFALSE
詳細は初級スクリプト第二十回「センサーを使おう」のセンサー関数を参照。

以下の例は衝突したのがアバターかオブジェクトかを判別する。
default {
  collision_start(integer num_detected) {
    if (llDetectedType(0) & AGENT) {
      llSay(0, "Avatar.");
    } else {
      llSay(0, "Object.");
    }
  }
}





llDetectedVel

vector llDetectedVel(integer number)

検知されたアバター/オブジェクトの速度及び進行方向を取得する。
主に衝突イベントにて使用される。

llDetectedVelはデテクト系の関数の一つである。
デテクト系関数についてはllDetectedKeyの説明もしくは初級スクリプト第二十回「センサーを使おう」のセンサーイベントについての説明を参照のこと。

以下の例は衝突したアバター/オブジェクトの速度を表示する。
default {
  collision_start(integer num_detected) {
    llSay(0, "Detected velocity is " + (string)llVecMag(llDetectedVel(0)));
  }
}





llDialog

llDialog(key id, string message, list buttons, integer chat_channel)

idで示されるUUIDを持つユーザーに対して、ダイアログを表示する。
ダイアログのメッセージにはmessageに指定した文字列が表示され、ボタンにはbuttonsに含まれる文字列型の要素が表示される。
ユーザーがダイアログボタンを押すと、チャットチャンネルchat_channelに対して、押されたボタンの名称が発言される。

ダイアログの使用方法の詳細は初級スクリプト第八回「ダイアログを使おう」を参照。




llDie

llDie()

自爆関数。
ドロンジョ一味の兵器にはすべからく実装されている。

要するにオブジェクト(自分自身)を消滅させる関数だが、アタッチメントでは無効である。
自爆時にアバターを巻き込むことを避けるために安全装置が組み込まれているのかもしれない。

この関数を使って消滅したオブジェクトは、インベントリのゴミ箱や行方不明者の集合場所にも残らない。
つまり取り戻す方法がない。
「ちょっとタンマ!」が使えないので注意すること。

以下の例はタッチして10秒後に自爆するオブジェクトである。
default {
  touch_start(integer num_detected){
    integer i;
    for (i = 0; i < 10; i++){
      llSay(0, (string)(10 - i));
      llSleep(1.0);
    }
    llSay(0, (string)"Good-bye!");
    llDie();
  }
}





llDumpList2String

string llDumpList2String(list src, string separator)

リストsrcの要素をseparatorを区切りとして文字列に変換したものを返す。

例えばリスト[1,2,3,4,5,6]について、"-"を区切り文字として指定すると、
  llDumpList2String([1,2,3,4,5,6],"-") → "1-2-3-4-5-6"

区切り文字を","にするといわゆるCSV形式の文字列となる。
  llDumpList2String([1,2,3,4,5,6],",") → "1,2,3,4,5,6"
CSV形式にするにはllList2CSV関数を使っても同様の結果を得ることができる。

llDumpList2Stringとは逆に、特定の区切り文字が使用されている文字列をリスト型に変換するには、llParseString2List関数を使用する。





同じカテゴリー(リファレンス)の記事
 リファレンス【M-P】 (2007-09-21 12:15)
 リファレンス【L】 (2007-08-28 13:54)
 リファレンス【GetU-K】 (2007-08-24 15:06)
 リファレンス【GetS-GetT】 (2007-08-13 13:49)
 リファレンス【GetP-GetR】 (2007-07-25 16:52)
 リファレンス【GetM-GetO】 (2007-07-14 12:15)
 
<ご注意>
書き込まれた内容は公開され、ブログの持ち主だけが削除できます。