2010/08/06
スクリプト:ドアや引き出しを動かす
どもども。
暑いっすな!
あ、さて。
先日SL House&Garden Huntをひととおり廻って、いそいそと景品を開封してたのですが。意外とまぁ、リンクがバラバラな家とかが少なくなく。 あれですね、ドアとかの可動部分を、建物本体にリンクしていない物がたまにあるんですよ。 それってREZした後に位置をずらしたり回転させたら、ドアだけ後に残ってしまって目も当てられないという。
( ゜Д゜)< めんどくさいからリンクして1つにしててよ!
というね。他にも、今回のトレハンの景品ではないのですが、扉一つ、引き出し一つ動かすのに2つや3つもスクリプトが入っているという。
( ゜Д゜)< なんだそれ!
っていうね。 まあ文句ばっかりでゴメンナサイ。
でもアレよ、本体にリンクされているドアや引き出しとかを動かすのって、そんなたいしたスクリプトじゃないんですよね。 ただ位置や回転の角度を指定するのがちょっと面倒という。 だからもっと使う人やSIMに優しくしようぜブラザー。
ということで。
すぐに使える lsl スクリプトのサンプルでもブログで紹介しようかなと。
っつっても、用途や挙動によってスクリプトも少しづつ変わってくるので、その種類によって何回かブログを書きたいと思います。
長いよ?w
てなことで、第1回目。

■ 用途:
本体にリンクされている扉や引き出しをクリックで動かすスクリプトです。
複数の位置を記録できます。
■ 前提条件:
・ 本体にリンクされている子プリムが可動対象です(ルートプリムは対象外)。
・ 可動対象は1プリム単独です。2プリム以上は同時に動かせません。
(2プリム以上を別々に動かす事は可能です)
・ スクリプト設定後、ルートプリムの位置や角度、またはルートプリム自体を変更できません。
(ルートプリムを変更した場合は、スクリプトを再設定する必要があります)
■ 参考動画:
ま、こんな感じです。
左の青いドアが 「閉じる」 「開く」 の 2パターン、
右の黒いフタが 「閉じる」 「開く1」 「開く2」 「開く3」 の 4パターンで稼働します。
(サンプルでは黒いフタの 「開く1」 と 「開く3」 が同じ位置ですが)
■ 設定手順:
0) 可動部分のプリムを子プリムとして、本体にリンクします。
ドアや窓、引き出しなどを1プリムで用意し(スカルプでも可)、本体にリンクします。
この時、ルートプリム(編集画面で黄色く選択されているプリム)はコレ!と決めたら以後変更しないでください。ルートプリムとの位置や角度が変わってしまうと、もう一度設定する必要があります。
1) 位置情報のチェックスクリプトを可動プリムに仕込みます。
まず以下のスクリプトをコピーしましょう。
●スクリプト1: s2check
default
{
touch_start(integer num) {
string S_Tmp = "\n\t\t//----------------\n";
S_Tmp += "\t\tS_Pos += [" + (string)llGetLocalPos() + "];\n";
S_Tmp += "\t\tS_Rot += [" + (string)(llRot2Euler(llGetLocalRot())*RAD_TO_DEG) + "];\n";
S_Tmp += "\t\tS_Snd += [\"\"];\n";
S_Tmp += "\t\t//----------------";
llOwnerSay(S_Tmp);
}
}
SLの編集ウィンドウの 「リンク部分を編集」 にチェックを入れ、可動プリムを選択します。

編集の 「中身(コンテンツ)」 タブを選択し、「新しいスクリプト」 ボタンをクリックします。

新しくできたスクリプトを開き、既に書かれてあるスクリプトは全部消します。
先程コピーしたスクリプト s2check をペーストします。 ま、中身を全部入れ替えですな。

スクリプトを保存して、編集画面は閉じてください。
あ、スクリプト名は好きにつけておいてくださいね。
2) 可動する位置を記録します。
まず可動プリムを初期の位置にして、可動プリムをクリックします。

するとチャット窓になにやら怪しい数字が出てきます。これが位置情報です。
気にせず可動プリムを次の位置にあわせて、再度可動プリムをクリックします。

こんなふうに。
この例だとドアなので閉じた状態と開いた状態の2パターンしかありませんが、3パターン、4パターンとある場合は続けて同じようにして位置情報を表示させてください。
3) メインのスクリプトと入れ替えます。
続いて以下のスクリプトをコピーしてください。
●スクリプト2: s2main
list S_Pos = [];
list S_Rot = [];
list S_Snd = [];
integer S_Mode = 0;
SMove(integer num) {
if (llGetListLength(S_Pos) > num) {
key S_Sound = llList2Key(S_Snd, num);
if (S_Sound) llPlaySound(S_Sound, 1.0);
llSetPrimitiveParams([
PRIM_POSITION, llList2Vector(S_Pos, num),
PRIM_ROTATION, llEuler2Rot(llList2Vector(S_Rot, num)*DEG_TO_RAD) / llGetRootRotation()
]);
}
}
default
{
state_entry() {
// ここへ順番にコピペしてください。一番最初が初期位置となります。
// ここまで
SMove(0);
}
touch_start(integer num) {
if (++S_Mode >= llGetListLength(S_Pos)) S_Mode = 0;
SMove(S_Mode);
}
}
そして上記手順 1) で可動プリムに仕込んだスクリプトを開き、中身をこちらと入れ替えます。 開いて中身全消ししてペーストしちゃってください。
4) メインのスクリプトに位置情報を追記します。
さてここで、上記手順 2) でチャット窓に表示させた位置情報をコピーして、メインのスクリプトに挿入していきます。 挿入する箇所は、スクリプト中のオレンジ色のコメントの部分、
// ここへ順番にコピペしてください。一番最初が初期位置となります。ここのど真ん中です。
// ここまで

こんな感じで。
全部の位置情報を追記し終えたら、スクリプトを保存して編集画面を閉じちゃってください。
はい、これで完成!
思う存分クリックして、ギッコンバッタンして遊んでください!
・・・あ、そうそう、忘れてました。
5) メインのスクリプトに音の情報を追記します。(任意)
一応音を出すこともできます。 開いたときにギー、閉じたときにバタン、などなど。
それにはまずフルパーミッションのサウンドを用意してください。
そしてマウスの右クリックメニューから、UUIDをコピーします。

くりっと。
そして可動プリムの中にあるメインのスクリプトに、音の情報として UUID を追記します。

追記する場所はここね。
音を出したい位置情報の、 [” と ”] の間に UUID の情報をペーストしてください。
スクリプトを保存して編集画面を閉じれば完成です。
最後に、自分でオリジナルのサウンドを用意できない!てな方は、フリーを漁るとフルパーミッションのサウンドありますよん。 FREEBIE DUNGEON とかじっくり探せば結構見つかります。 ここは昔よくいりびたってましたw
■ 注意点など:
さてここで注意点を3つほど。
まず、横にスライドする引き戸などではなく回転するドアなどは、そのプリムの作り方に工夫が必要です。
普通にプリムでドアを作るとこうなりますね。

これはダメなドアです。
何故ダメなのかというと、普通の箱プリムそのままの場合は回転軸がド真ん中に来てしまいます。 このまま回転ドアとして使用すると、実際に動かした場合に、ドアの根元(チョウツガイの所)がふわふわ浮いたような挙動になってしまいます。
ではどういうドアがいいかといいますと。

こんなふうに、回転軸が端っこ(ドアのチョウツガイの所)に来ているドアがベストです。
じゃあどうすりゃいいんだYO!
てなことですが。
こうすりゃいいんです。

編集画面の 「パスカット(始点と終点)」 に、 0.375 と 0.875 を入れてください。
これだけです。
こうすることで回転軸が端っこにきたドアを作ることができます。
※ スカルプのドアも同じことが言えます。 回転軸が端っこに来ていないスカルプのドアは、回転ドアには不向きです。 スカルプの回転軸はインワールドでは変更できないので、その場合はスカルプがいじれるお友達に相談しましょうw
そして2つめの注意点。
上の参考動画を見てもらえばわかるように、ドアをクリックするとぬるっと動いています。 が、例えば別 SIM から TP してきて初めてドアをクリックする場合などは、ぬるっと動かずにいきなりガッっと動きます。 一度動かしてしまえば、2度目以降はぬるっと動きます。 これはリンデンの仕様です。
これを回避するためには、スクリプト側で最初にちょっぴり動かしていきなりガッっと動かないように細工する必要があります。 スクリプト的には何ら特殊な技術を使っているわけではないのですが、まぁ言ってしまえばメンドクサイということで、今回の「汎用性を持たせたフリースクリプト」には仕込んでおりません。 その辺はあしからず。
注意点最後として、
これは REZ 用オブジェクト向けの可動スクリプトです。 装着用ではまた少し変わってきます。
まあ単純なことなのですが、装着してしまうとルートプリムの角度を取得するのがメンドクサイので(結局それか)、今回のスクリプトには仕込んでいません。 あしからずん。
ということで、
第1回目のドアなどの可動スクリプト特集いかがでしたでしょうか。
実は対象を回転ドアに限定すればスクリプトももっと簡単になります。
第2回目は、普通に開く回転ドアや、ゆっくりぬる~~~っと開く回転ドアのスクリプトとか。 今回はしょった装着系のものもいいかな。 まぁ中身は至極簡単なものなので、そんなもったいぶるものでもないですがw
他にも、何かしら動かすスクリプトで皆でシェアしたい!ていう要望ありましたら、コメント欄に是非どうぞ。 コメント欄にね。 IMでいきなり「スクリプト作ってくれ」て言われても困ってしまいますがな。はっはっは。
第2回、まぁ、気が向いたらそのうち。はっはっは。
この記事へのトラックバックURL
http://stwo.slmame.com/t940823
この記事へのコメント
なるほど、、やってみます。。アップありがとうございます。
ふと思ったのですが、今使ってるのが アバターの位置情報を所得してその反対側に開くドアなんですが、アバターの位置情報じゃなくて、クリックされた面を所得なら、これと組み込みやすいかしら???と
すみません スクリプト全然解らなくて だいたいいつも3日くらい悩んであちこち引きまくって書いてるので、自分でも言ってることが正解なのかどうなのか解ってません。これならどうかと、頭でシミュレーションとかほど遠い段階です。。。。いろいろやってみて 挫折して来ます。。
ふと思ったのですが、今使ってるのが アバターの位置情報を所得してその反対側に開くドアなんですが、アバターの位置情報じゃなくて、クリックされた面を所得なら、これと組み込みやすいかしら???と
すみません スクリプト全然解らなくて だいたいいつも3日くらい悩んであちこち引きまくって書いてるので、自分でも言ってることが正解なのかどうなのか解ってません。これならどうかと、頭でシミュレーションとかほど遠い段階です。。。。いろいろやってみて 挫折して来ます。。
Posted by miki at 2010年08月06日 15:10
クリック面感知&回転ドアならシンプルにできますよー
もしこのサンプルスクリプトを流用するのであれば、位置情報を
0:閉じた状態
1:奥に開いた状態
2:手前に開いた状態
と3パターン持っておいて、クリックされた面によって
0 → 1 → 0
0 → 2 → 0
と動かすパターンを変えてあげればいいですね。
あと timer 使って自動で閉まれば完璧ですw
もしこのサンプルスクリプトを流用するのであれば、位置情報を
0:閉じた状態
1:奥に開いた状態
2:手前に開いた状態
と3パターン持っておいて、クリックされた面によって
0 → 1 → 0
0 → 2 → 0
と動かすパターンを変えてあげればいいですね。
あと timer 使って自動で閉まれば完璧ですw
Posted by えすつー at 2010年08月06日 16:13
というか次回のネタにすればいいのかw
Posted by えすつー at 2010年08月06日 16:51
次回ネタ ワクワク・:*(〃∇〃人)*:・
あーーでも ゆっくり閉まるもワクワクもの。。
自分であくせくしたあと、さらっと作られた奇麗なコードを見て がっくり来るのが 最近快感です。ww
あーーでも ゆっくり閉まるもワクワクもの。。
自分であくせくしたあと、さらっと作られた奇麗なコードを見て がっくり来るのが 最近快感です。ww
Posted by miki at 2010年08月06日 17:10



