
サンゴ礁のSIMにちなんで、スクリプトのテーマは「泳ぐ」でお送りします。
ではさっそくスクリプトの紹介から。
〜スクリプト〜
===================================================
1:string animation_name="swimming-1";
2:key owner;
3:vector size;
4:key agent = NULL_KEY;
5:init()
6:{
7: owner=llGetOwner();
8: llRequestPermissions(owner, PERMISSION_TRIGGER_ANIMATION);
9:}
10:default
11:{
12: state_entry()
13: {
14: init();
15: }
16: attach(key agent)
17: {
18: init();
19: }
20: run_time_permissions(integer perm)
21: {
22: if (perm & PERMISSION_TRIGGER_ANIMATION)
23: {
24: llSetTimerEvent(0.5);
25: }
26: }
27: timer()
28: {
29: size=llGetAgentSize(owner);
30: if ( ((llGround(ZERO_VECTOR)+(size.z/2)+0.3)<=llWater(ZERO_VECTOR)) && (!(llGetAgentInfo(owner)&AGENT_FLYING)) )
31: {
32: llStartAnimation(animation_name);
33: }
34: else
35: {
36: llStopAnimation(animation_name);
37: }
38: }
39:}
===================================================
泳ぐということで、アニメーションのスクリプトと海に入った時の判定スクリプトがメインです。
1行目のstring animation_name="swimming-1"
のswimming-1はアニメーション名です。
今回はデフォルトアニメーションではありませんので別途、泳ぐアニメーションをご用意してください。
そのアニメーション名をswimming-1と置き換えてください。
〜海面の高さ〜
海に入ったときの判定は、29〜30行目です。
LSLでは水面の高さと地面の高さを得る式があるのでこれを応用します。
海に入るということは、「水面が地面よりも高い時」になりますので、
地面の高さ<水面の高さ になります。
地面の高さはllGround(ZERO_VECTOR)
水面の高さはllWater(ZERO_VECTOR)
です。
LSLで書くとllGround(ZERO_VECTOR)
自分のいる位置で高さを判定しているので、このままでは足が水に触れた瞬間に式が成り立ってしまします。
そこで、アバターが腰上まで水に浸かった時に式が成り立つようにします。
ほかの方法もありますが、今回はあえてアバターの身長から算出しています。
身長は29行目のllGetAgentSize(owner)で調べます。
この文は奥行き、幅、高さが得られるのですが、高さ以外はどんなアバターでも同じ数値になります。
ちなみに奥行きは0.45、幅は0.6です。
だったら、高さだけ教えろって感じですが^^;
size=llGetAgentSize(owner)として変数sizeに代入しています。
このままでは奥行き、幅、高さの値がとして入っているので、y(高さ)だけ求めます。
これは簡単で
size.zで求められます。
もののサイズや位置はという形で成り立ってていて、これをvector
型といいます。
この
vector型では変数の名前(今回の例ではsize)の後ろに.xや.yとつけると、xやyの値を知ることができます。
では、腰上あたりを求めるので、+(size.z/2)+0.3としました。(身長/2+30cm)
(llGround(ZERO_VECTOR)+(size.z/2)+0.3)<=llWater(ZERO_VECTOR)
これで、腰上あたりまで水に入ったときに成り立つ式になります。
※不等号は<でも<=でも構いません。「腰上あたり」なので
〜飛んでる?〜
このスクリプトを作ったときは海底散歩がテーマでつくったので、海底にいる時のみ泳がせました。
なので、飛行中は泳がないようにしてあります。
では飛行を判定するには?
llGetAgentInfo(owner)では下記の様なアバターの行動を知ることができます。
AGENT_FLYING(飛行)
AGENT_ATTACHMENTS (何か装着をしている)
AGENT_SCRIPTED (スクリプトの入ったものを装着している)
AGENT_MOUSELOOK (マウスルックにしている)
AGENT_SITTING (座っている※地面もしくはオブジェクト)
AGENT_ON_OBJECT (座っている※オブジェクトのみ)
AGENT_AWAY (AWAY)
AGENT_WALKING (歩行)
AGENT_IN_AIR (ジャンプ)
AGENT_TYPING (チャット入力している)
AGENT_CROUCHING (しゃがんでいる)
AGENT_BUSY (BUSY)
AGENT_ALWAYS_RUN (「常に走る」になっている)
この中のAGENT_FLYINGで飛行しているか判断します。
llGetAgentInfo(owner)&AGENT_FLYINGがそれですが、
飛行していないばあいは頭に!をつけて否定にします。
!(llGetAgentInfo(owner)&AGENT_FLYING)
これで飛行していない場合になります。
水中判定文と飛行判定文の両方が成り立った時に泳ぐアニメーションを起こすので
30行目の
if ( ((llGround(ZERO_VECTOR)+(size.z/2)+0.3)<=llWater(ZERO_VECTOR)) && (!(llGetAgentInfo(owner)&AGENT_FLYING)) )
となり。
&&でつなげます。
ifは「もし」です。もし〜〜だったら、〜〜する。という条件式で
if (A) {B} else {C}と書きます。もしAだったらBをして、AでなかったらCをするという意味です。
要約すると30〜37行目は
「もし、アバターが飛ばすに腰上まで水につかっていたら、泳ぐアニメーションをし、
そうでなかったら、泳ぐアニメーションをやめる。」ということになります。
〜海で泳ぐ〜

このあとは、実際に海にいって泳いできました^^
SIMの名前はMitsubishiCorporation
場所は
http://slurl.com/secondlife/MitsubishiCorporation/129/128/44
です。
ここにはサンゴ教室というものがあり、その奥にこのスクリプトを仕込んだスキューバダイビングセットが
フリーで置いてあります^^
行ってみてくださいね〜♪
ちなみにこのスクリプトを応用したものを2点オフィシャルショップに置きました(こっちは有料ですw)
浮き輪と水中スクーターですw
ちなみに浮き輪は、装着すると海に浮きます(当り前かw)移動もできます(それも当り前かw)
着けたまま海に沈むには苦労しますw
水中スクーターは、潜水すると泡と音がでます。ライトもつきます。
以上、宣伝でしたw


投稿者:メルティングドッツ|

