LSLのドアスクリプト:タッチで開閉し、自動で閉まる
Second Life用の無料LSLドアスクリプトです。ドアをタッチすると蝶番を軸に開き、もう一度タッチするか数秒後に自動で閉まります。閉じた位置を覚えるので、後からドアを動かしても問題なく動作し、効果音も設定できます。
Second Life用のシンプルで確実なドアスクリプトです。ドアをタッチすると蝶番を軸に開きます。もう一度タッチして閉じるか、数秒後に自動で閉まるようにできます。開くたびに閉じた位置を覚えるので、後からドアを動かしても問題なく動作します。
// Touch Door with auto-close - free LSL script from WhatSL (https://whatsl.com/scripts/lsl-door-script)
// Free to use, change and put in your own creations, also ones you sell.
//
// Put this script in an upright door that is its own object (not linked to the house).
// The door's width must run along its X axis (the red arrow in the Edit window).
// Touch to open, touch again to close. It also closes by itself after AUTO_CLOSE seconds.
float OPEN_ANGLE = 90.0; // degrees to swing; use -90.0 to open the other way
float AUTO_CLOSE = 10.0; // seconds before it closes by itself; 0.0 = stay open
integer HINGE_SIDE = 1; // 1 = hinge on the +X edge, -1 = hinge on the -X edge
string OPEN_SOUND = ""; // optional: a sound name in the door's Contents, or a sound UUID
string CLOSE_SOUND = "";
integer gOpen = FALSE;
vector gClosedPos;
rotation gClosedRot;
openDoor()
{
// remember where the closed door is, so the door can be moved and still work
gClosedPos = llGetPos();
gClosedRot = llGetRot();
vector size = llGetScale();
vector hinge = gClosedPos + <HINGE_SIDE * size.x * 0.5, 0.0, 0.0> * gClosedRot;
rotation turn = llEuler2Rot(<0.0, 0.0, OPEN_ANGLE * DEG_TO_RAD>);
llSetLinkPrimitiveParamsFast(LINK_THIS, [
PRIM_POSITION, hinge + (gClosedPos - hinge) * turn,
PRIM_ROTATION, gClosedRot * turn
]);
if (OPEN_SOUND != "") llPlaySound(OPEN_SOUND, 1.0);
gOpen = TRUE;
if (AUTO_CLOSE > 0.0) llSetTimerEvent(AUTO_CLOSE);
}
closeDoor()
{
llSetTimerEvent(0.0);
llSetLinkPrimitiveParamsFast(LINK_THIS, [PRIM_POSITION, gClosedPos, PRIM_ROTATION, gClosedRot]);
if (CLOSE_SOUND != "") llPlaySound(CLOSE_SOUND, 1.0);
gOpen = FALSE;
}
default
{
touch_start(integer total)
{
if (gOpen) closeDoor();
else openDoor();
}
timer()
{
closeDoor();
}
}
自由に使用・改変でき、販売する作品にも組み込めます。
設定方法
- ドアを作るか、ドアをrezします。ドアは直立し、家とリンクされていない独立したオブジェクトである必要があります。
- ドアの横幅がX軸(編集ウィンドウの赤い矢印)に沿っているか確認します。沿っていない場合は、ビルドツールでドアを回転させるか、サイズの値を入れ替えてください。
- コンテンツタブを開き、「新規スクリプト」をクリックして、スクリプトを貼り付けて保存します。
- ドアをタッチします。逆向きに開く場合はOPEN_ANGLEを-90.0に設定してください。反対側の端を中心に回転する場合はHINGE_SIDEを-1に設定してください。
設定項目
- OPEN_ANGLE: ドアが開く角度(度数)です。
- AUTO_CLOSE: 自動で閉まるまでの秒数です。0.0にすると、タッチするまで開いたままになります。
- HINGE_SIDE: 蝶番になる縦の端を指定します。
- OPEN_SOUND / CLOSE_SOUND: ドアのコンテンツ内にあるサウンド名、またはサウンドUUIDを指定します。無音にする場合は空欄のままにします。
ヒント
- 両開きのドアの場合は、両方のドアにスクリプトを入れ、片方をOPEN_ANGLE 90.0、もう片方を-90.0に設定します。
- リンクされた家の一部であるドアには、別の方法が必要です。一番簡単な方法は、ドアのリンクを解除して独立したオブジェクトとして残すことです。
よくある質問
ドアが真ん中を軸に回転するのはなぜですか?
スクリプトは、ドアのX方向のサイズから割り出した一方の端を軸に回転します。ドアが真ん中を軸に回転する場合は、横幅がX軸に沿っていません。赤い矢印が横幅に沿うようにドアを回転させてください。
ドアに鍵をかけられますか?
このバージョンは、誰でも開けるようになっています。鍵付きのドアにしたい場合は、touch_startの冒頭に確認処理を追加してください。例:if (llDetectedKey(0) != llGetOwner()) return;
このスクリプトは重くなりますか?
いいえ。誰かがドアをタッチしたときと、タイマーで閉じるときにだけ動作します。