LSL:llSitTargetの落とし穴・・・

jinko

2007年11月25日 01:34


知ってる人は、こんな落とし穴にハマったりしないと思うのですが・・・

やっちゃいましたー

露天風呂を作る記事を書いたのですが、カタチ作りまでは、なんとかなったのねー
あと必要なのは、、、、

(1)水面を動かす
(2)湯気を出す
(3)温泉に入っているポーズをセットする

の3つだけなんですよねー

水面を動かすのは、llSetTextureAnim()という関数。
この間ダンスボールを作ったときに実験したので大丈夫よねー

湯気を出すのは、llParticleSystem()という関数。
ロケットを作ったときにパーティクル勉強したからこれも大丈夫。

ポーズをセットするのは、llStartAnimation()とかのAO(Animation Override)系のスクリプト。
ホウキとかこの間のAFKのときとかいつも使ってるので、これも問題なし。
座ったときに位置を設定するのにllSitTarget()という関数を使うんですが、
だいぶん前に椅子をつくったときにやったので、これも大丈夫・・・
と思ってたんですよねー

でも、使い慣れていない関数には落とし穴。

・・・はい、きっちりハマりました




座ったときにポーズしてくれるはずなんですが、、、普通に座ってるだけですよねー

あちこちにデバッグ用のllOwnerSay()を入れて変数を確認すると・・・
なんと、座ったアバターのキーが取得できてないんですねー

llAvatarOnSitTarget()

この関数は、キーとして座ったアバターのUUIDを返す関数なのですが、
ちゃんと座っているにもかかわらず、戻り値が、NULL_KEYになっちゃってます。

なんでー

Wikiで確認すると・・・

誰も座ってないときとか、sit targetがないときは、NULL_KEYを返す

みたいなことが書いてあります。
sit targetは、llSitTarget関数で設定するんですよねー

はい、あの、座る位置を指定するアレです。

llSitTarget(, ZERO_ROTATION);

みたいな書きかたをよくしますよねー
関数の定義は、こんな感じです。

Function: llSitTarget( vector offset, rotation rot );

この関数。実は落とし穴があったんですよねー
説明の欄には1行こんなことが書いてあります。
http://wiki.secondlife.com/wiki/LlSitTarget

Set the sit location for this object (if offset == clear it)

つまり、最初のパラメータoffsetというのをゼロにすると、クリアされます
ということなのねー

さらに、LSL Wiki版のllSitTargetとこを見てみると、、、
(LSLのWikiはオフィシャル版とLSL Wiki版とほかにもあるみたいですねー)


sit targetsは、プリムのプロパティでスクリプトじゃない!!


とか書いてます。
このため、座っている状態でスクリプトを削除しても、sit targetsは、残っているということらしいです。

つまり、llSitTarget()という関数は
プリムのプロパティをセットする動作をして、
パラメータをゼロにしたときクリアされるということです。

座るのがプリムの中心でいいやーって思ってもは使えなくて、

llSitTarget(, ZERO_ROTATION);

とせなアカンってことでしたー

以下LSLWIkiのサンプルからの転載です。
日本語訳は適当なので・・・ごめんねー
座った人のキーを調べて立たせる・・・という動きをする役にたたないスクリプトです^^

default {
    state_entry() {
        llSitTarget(, ZERO_ROTATION); //llAvatarOnSitTargetのために絶対必要!!
        //注意:両方のパラメータをゼロにすると、SitTargetは、セットされずにリセットされます。
//(プロパティやからリセットじゃなくて英文のとおり"除去"の方が正確かなー)
    }
    
    changed(integer change) { // なにか変化した
        if (change & CHANGED_LINK) { // そんで、リンクが変化した
            llSleep(0.5); // llUnSitをうまく動かすためにディレイがあった方がいいみたい
            if (llAvatarOnSitTarget() != NULL_KEY) { // 誰かが座った!!
                llSay(0, "Get off!");
                llUnSit(llAvatarOnSitTarget()); // 座った人をすぐたたせる
            }
        }
    }
}


もいっかい書いとくねー

llSitTarget(,ZERO_ROTATION);
は、リセットになります!!



試験にでるよー


ふぅ、やっと温泉にはいれそーやわー



服を着たままでごめんねー
Tips