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);
は、リセットになります!!
試験にでるよー
ふぅ、やっと温泉にはいれそーやわー
服を着たままでごめんねー