仕事用のめもとか。

メディア等気になることを適当に。

スカイボックスの1Fと2Fの間を移動なスクリプト下書き

※ぐっぐる先生から拾ってきた諸姉諸兄の情報を適当につなぎあわせただけです。まだちゃんと動いてないので信じちゃらめぇ。

おうち買っちゃった... - 仕事用のめもとか。
の続き。

BlackSheep-LSL@Wiki - 衝突判定
衝突判定。
BlackSheep-LSL@Wiki - rez!
テンポラリオブジェクトをスクリプトで生成。
あたりを参考にさせていただくとして。

ふと気づいたんだけど、1分で消えるとかのテンポラリーオブジェクトだと、2Fに行ったリフトが消える前に次の人が起動させると、頭がつかえる!
単なるテンポラリオブジェクトじゃなくて、人がどいたら消えるように書かないとだめですの。
て、あったあった。
LSLスクリプトTips集|オブジェクトを消去(削除)|セカンドライフ,llDie
いやはやありがたいことでございます。
というか、よく考えたら床板にスクリプト仕込めばいいのか。で、上からも普通に降りよう...

用意するもの。
・正方形の床板の方が穴ふさぎプリムの大きさ計算がラクだよね!ということで穴が空いた床板(2F)と、普通の床板(1F)
・穴の大きさにぴったりの適当な厚みのあるプリム2枚。名前はlift_upとlift_downで、床板に仕込む。

んで、床板に入れるスクリプト。1F床編。

default {
collision_start(integer num_detected){
// 誰かがぶつかったのでなんか始めるお!ていうかコイツ誰?
if (llDetectedType(0) & AGENT){
// ぶつかったのがアバター(AGENT)であるならば、
llRezObject("lift_up", llGetPos() + <0.0, 0.0, 0.0>, ZERO_VECTOR, ZERO_ROTATION, 1);
// lift_upというプリムを出すヨ。場所は中心点が自分とぴったり重なる位置。
}
}
}

これだと床に埋まった状態でlift_upてプリムができるので、その状態でうまくアバターをのっけて動かせるかどうかちと不安。
同様に2Fの穴空き床でもlift_downてプリムを作る。
#ここまでは問題なく作動。

が、肝心の移動スクリプトが...
最初は

default
{
on_rez(integer param){
// 生まれた時に〜
llResetScript();
// とりあえず、スクリプトを止めておくよー ※前回起動時にトラブルがあってもリセット
state moving
// ステートをムービングにしとくよー
}
}
}

moving
{
collision_start(integer num_detected){
// 誰かがぶつかったのでなんか始めるお!ていうかこいつ誰?
if (llDetectedType(0) & AGENT){
// ぶつかったのがアバター(AGENT)であるならば、
llMoveToTarget(llGetPos() + <0.0,0.0,5.0>, 2.5);
// 自分の位置より5m上方向に2.5秒で到達してみたいと思います。_downは-5m設定で。
state die
}
}
}

die
{
collision_end(integer num_detected){
// のっかってたヤツがどいたっぽいよー!
llDie();
// 死して屍拾うものなし!
}
}
}

みたいなことをしてたんだけれど、動かない!
で、あちこちいらんところをカットしたり、もっと単純なスクリプト入れたりしてるうちに、「一枚板のみ用意、タッチで上下に動くだけ」の方がよくね? 床板から少しはみ出させていれば、上にいきっぱでも下からクリックして降ろせるし」と思いついてみたり。
プリムを動かすコマンドはいくつかあるっぽいのだけれど、物理じゃないやつで「動きをつける」(瞬間移動ではない)だと、llMoveToTargetになるぽい。ただ色々クセがある模様。最大移動距離65m未満、対象に近づくにつれて勝手に減速など。
Aquarium&Diving:llMoveToTarget の特徴
んが、IIMoveToTargetがどうにも動かないので、IIsetPosに変えて見たら動いた!

default{
touch_start(integer detected){
llSetPos(0,0.5.0)
}
} 

が...のっかってクリックしたら、アバターはすこーんと抜けて板だけ5m上に...
しかも瞬間移動だし...
「アバターを載せたままゆっくり動く」命令ってどうすりゃいいんだロー
ええかげん、ワサーで聞いてみようかしら...でも、あまりにも初歩で聞くのもなんだかニャー。

って、llMoveToTargetを使ったエレベータースクリプトの例。物理オブジェクト使ってるんだけど、物理オブジェクトの挙動を安定させるためにシャフト作らないといけないぽい。
かっぱな生活:エレベーター
なにこれめんどくせえええええ!
って、あれ?そいや乗り物用のパラメタやら制御もあったはず...
板一枚、上下に5m移動するだけでも乗り物は乗り物。そっちでやった方が早いのかも?
Database error
..........いやこれ、あの...訳してくださった方のご苦労に号泣ですが、原文が凄すぎる悪寒。
にゃぉーん♪:物理そしてビークル
ビークル関連のスクリプト例。
あと、元に戻ってllSetPosを使った空飛ぶ絨毯。
【特集】ゼロからはじめるセカンドライフプログラミング (5) 空飛ぶ絨毯(じゅうたん)の作成 | パソコン | マイナビニュース
うにうに触手マシン?
Second Life:擬似ビハイクル「エニクマ」発進! | oitake blog

要するに、自分のしたいことは、階段(なんかうまくできなくてイーッてなること多いしスペースとるし)や瞬間移動(おもろないねん...)以外の方法で、「なるべくプリム数を使わずに、コマンド選択の手間もかけずに(上にのっかるだけ、クリックするだけくらいで)、1Fから2Fへ上がりたい(できたら2Fから1Fも)」ストレートにそれをやるのは難しいくさい。
NOT FOUND - metabirds -
エレベーターの仕組みそのものはコレに近いんだけど、ボタンクリック→座るだしにゃー。

・立ったままいける?llMoveToTargetを使うなら物理オブジェクトで(挙動安定のため色々工夫が必要)。
・llSetPos(たぶんビークルも)を使うならsit前提。
昨日、ラモナさんに機能限定版高々度飛行HUD教えてもらって、自分は問題なく飛行で行き来ができるようにはなったんだけど、にんとも。

瞬間移動になっちゃうけど、ハシゴ作っておいて、sitコマンド使うと上の階に座るかたちで出現てのも可能ではあるのかなー...sitの向きとか位置とか工夫すれば、立ち上がった時に穴から落ちなくても済むくぽ?
Makapu@BlackSheep-LSL:テレポート
sitを利用した簡易テレポーターあったー! んで、クリックで即飛ばすのもできるっぽい。
テレポーター|セカンドライフJAPAN
これなら穴塞いじゃってもできそうではあるっていうか穴の意味がなくなる感じ。穴用に床板分割しているから、プリム圧縮ウマー。
スクリプトのみでアニメーションできないのは哀しいけれどコレ仕様ですからよい旅を...
どうしてもこだわるんだったら、連続的に位置を変えてパラパラマンガにできなくもない...気もするけれど、それもそれでなんかめんどくさいしみたいな。