ソラマメブログ

  

Posted by at

2010年08月08日

スクリプト:ゆっくり開く回転ドア

あーつーいー(枕詞)


さてさて、スクリプトご紹介シリーズのつづきですよん。


前回はドアや引き出しなど、いろんな動きを指定できるスクリプトでしたが
今回は回転して開くドアに限定したスクリプトでっす。


まあ単なる回転ドアだと味気ないので、
まったりゆっくり開くドアのスクリプトをご紹介。

私が日頃使ってるものとほぼ一緒な感じです。
そのまま直ぐに使えまっせダンナ。


さっそくまいりましょー第2回目。



■用途:

ゆっくり開く回転ドア用スクリプトです。 開いた後、自動で閉まります。
建物にリンクされていない単独のドア、建物にリンクされているドア、両方に使えます。



■前提条件:

・ ドアが開く角度は90度です。
・ ドアの回転軸は、ドアプリムを角度x:0, y:0, z:0で設置した際のZ軸となります。
・ 建物にリンクされているドアは1プリムで作ってください。
・ 建物にリンクされているドアの場合、子プリムが可動対象です。
 (ドアを建物のルートプリムにしないでください)
・ 建物にリンクされていないドアは、ドアのルートプリムの回転軸を中心に回転します。
 (ドアが1プリムの場合は、そのプリムの回転軸を中心に回転します)



■参考動画:



こげな感じで。

建物にリンクされている青いドアは1プリムのBOXです。
建物とリンクされていないドアはプリム数の制限なしに動かすことができます。

1プリムドアの注意点・作り方は、前回の最後の方を御覧くださいませ。





■設定手順:

まあ今回は設定もへったくれもなく、スクリプト1つを仕込みゃ完成です。

●スクリプト1: s2door

float S_Open = -1; // ドアの開く方向・・・ 1:反時計回り -1:時計回り
float S_Speed = 1.5; // ドアが開くまでの時間(秒)
float S_Auto = 5; // 自動で閉まるまでの時間(秒) 0は自動で閉まらない

string S_SoundOpen1 = ""; // 開く音(UUID)
string S_SoundOpen2 = ""; // 閉じ始める音(UUID)
string S_SoundClose = ""; // 閉じ切った音(UUID)

rotation S_InitRot;
integer S_Mode = 0;

SSound(string name) {
if (name) llPlaySound(name, 1.0);
}

STurn() {
if (S_Mode == 1) {
SSound(S_SoundOpen1);
S_InitRot = llGetLocalRot();
} else
SSound(S_SoundOpen2);
llSetTimerEvent(S_Speed);
llTargetOmega(<0, 0, S_Open>*S_InitRot, (2-S_Mode)*PI_BY_TWO/S_Speed, 1);
}

default
{
touch_start(integer num) {
if (S_Mode%2 == 0) {
S_Mode++;
STurn();
}
}

timer() {
llSetTimerEvent(0.0);
llTargetOmega(ZERO_VECTOR, 0, 0);
if (S_Mode == 2 && S_Auto > 0) {
S_Mode++;
STurn();
} else {
if (S_Mode == 1)
llSetLocalRot(llEuler2Rot(<0,0,90*S_Open>*DEG_TO_RAD)*S_InitRot);
else {
SSound(S_SoundClose);
llSetLocalRot(S_InitRot);
}
if (++S_Mode > 3) S_Mode = 0;
if (S_Mode > 0 && S_Auto > 0) llSetTimerEvent(S_Auto);
}
}
}

このスクリプトを・・・
 建物にリンクされているドアには、ドアのプリムに
 建物にリンクされていないドアには、ドアのルートプリムに
それぞれ入れてください。

スクリプトの入れ方がわかんなーいな方は、前回の記事 設定手順 1) をご参照ください。



さてこのスクリプト、頭のところで色々な設定ができるようになってます。
float S_Open    = -1;   // ドアの開く方向・・・ 1:反時計回り -1:時計回り
float S_Speed = 1.5; // ドアが開くまでの時間(秒)
float S_Auto = 5; // 自動で閉まるまでの時間(秒) 0は自動で閉まらない

ドアの開く方向
 ドアが奥に開くか、手前に開くかです。 1 か -1 を指定してください。

ドアが開くまでの時間(秒)
 クリックしたドアが開ききるまでの時間です。
 大きい数字を入れるとゆっくり開きます。 ※ 0 は指定しないでください

自動で閉まるまでの時間(秒)
 ドアが開いた後、自動で閉まるまでの時間です。
 0 を指定すると自動で閉まらなくなります。



続いて音の指定について。
このまま何も指定しなければ無音のままですが、試しに以下のような UUID を指定すると、ぎ~、ばたん、と音が鳴るようになります。
string S_SoundOpen1 = "0db01d64-d31e-3146-57f5-d8eee762227c";   // 開く音(UUID)
string S_SoundOpen2 = "0db01d64-d31e-3146-57f5-d8eee762227c"; // 閉じ始める音(UUID)
string S_SoundClose = "1c158e0d-df97-705a-0d06-868060ac3d9d"; // 閉じ切った音(UUID)

音の UUID ってなんじゃらほいな方は、前回の記事 設定手順 5) をご参照のほど。



今回は以上で完成です。 まぁ1つのスクリプト入れるだけなんで簡単ですね。
これでズゴゴゴゴゴゴゴ・・・とゆっくり開く岩の扉とか作って遊んでみてちょ!






■注意点など:

今回の注意点は3つほど。

まず最初、このゆっくり開くドアスクリプト(長い)は、SIM や PC の状況によっては 「90度以上開いた状態に見える」 ことがあります。 が、単に見えるだけなので、ドア的にはなんら問題ありません。

続いて2点目、ドアの当たり判定ですが、ドアが開いている最中は通りぬけできません。 ドアが開いているように見えて、実はまだドアが閉まっているんですね。 完全に開ききった時にようやくアバターが通り抜けできます。
なので10秒くらいかけてゆっくり開くドアを作った場合、10秒待たないと入れませんのでご注意w

最後に、このスクリプトはドアがどんな角度でも動くようになっていますが、
・ 建物にリンクされているドアで、
・ ルートプリムとの角度関係が微妙な(簡単にいうと妙に斜めってる)場合、
・ 開いてる/閉じてる最中の回転軸と、開ききった/閉じきった時の回転軸が、
少ーーーーしずれているように見えます。 ま、注意してみなければ気がつかない程度ですが。
これも 「見える」 だけなので、ドアの位置がずれるとかはないのでご安心を。



てなわけで。

いかがでしたか第2回目。


あ、そうそう。
前回の記事にコメントいただきましたが、ドアのクリックした面によって手前に開いたり奥に開いたりする方法を補足として書いておきましょ。

上記スクリプトの touch_start の部分に少し追記してあげればOKです。
    touch_start(integer num) {
if (S_Mode%2 == 0) {
if (S_Mode == 0) {
if (llDetectedTouchFace(0) == 1) S_Open = 1;
else S_Open = -1;
}
S_Mode++;
STurn();
}
}
こんな感じで。
クリックされたドアの面番号を見て、 S_Open に 1 か -1 を入れてあげてください。



さて次回はどうしようかな。さっそくネタが切れたようなw
というかまぁ当初の目的はこの2回分で果たされた感じですがいかかでしょうか。


なんかリクエストありましたら引き続きコメントにどうぞ~  


Posted by えすつー at 05:34Comments(2)lslスクリプト

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回、まぁ、気が向いたらそのうち。はっはっは。  


Posted by えすつー at 11:33Comments(4)lslスクリプト