アバターの状態でアニメーションを変更するスクリのサンプルです。
Timer でアバターの状態を取得して、状態によってアニメを切り替えます。
サンプルは2つのアニメを切り替えるだけですが
以下の状態わけで再生するアニメーションを変更できますので
string anim_* を追加してゆけばそれぞれ別のアニメを再生することが可能です。
ではみなさんお楽しんでね!!
AOの実装には向きません1
ステータス | 説明 |
---|---|
AGENT_ALWAYS_RUN | 走行モード("常に走る") になっている、もしくは tap-tap-hold を使っている |
AGENT_ATTACHMENTS | 装着している |
AGENT_AUTOPILOT | "オートパイロット" モード |
AGENT_AWAY | "away" モード |
AGENT_BUSY | "busy" モード |
AGENT_CROUCHING | しゃがんでいる |
AGENT_FLYING | 飛んでいる |
AGENT_IN_AIR | 空中に浮かんでいる |
AGENT_MOUSELOOK | マウスルック |
AGENT_ON_OBJECT | オブジェクトに座っている |
AGENT_SCRIPTED | スクリプトを装着 |
AGENT_SITTING | 座っている |
AGENT_TYPING | 入力している |
AGENT_WALKING | 歩いている、走っている、しゃがみ歩きをしている |
string anim_1 = "patapata";
string anim_2 = "patapata 1";
float gap = 0.5;
string currentAnim = "";
startAnimation(string anim)
{
if(currentAnim == anim) return;
stopAnimation();
currentAnim = anim;
if( currentAnim != "")
{
llStartAnimation(currentAnim);
}
}
stopAnimation()
{
if(currentAnim != "")
{
llStopAnimation(currentAnim);
currentAnim = "";
}
}
default
{
state_entry()
{
llRequestPermissions(llGetOwner(),PERMISSION_TRIGGER_ANIMATION);
//channel = genCh();
//handle = llListen(channel, "", llGetOwner(), "");
}
changed(integer change)
{
if(change & CHANGED_OWNER)
{
llResetScript();
}
}
attach(key id)
{
if(id)
{
llRequestPermissions(llGetOwner(),PERMISSION_TRIGGER_ANIMATION);
}
else
{
currentAnim = "";
}
}
run_time_permissions(integer perm)
{
if (perm & PERMISSION_TRIGGER_ANIMATION)
{
llStopAnimation("sit");
startAnimation(anim_1);
llSetTimerEvent(gap);
}
}
timer()
{
/*
AGENT_ALWAYS_RUN // 走行モード("常に走る") になっている、もしくは tap-tap-hold を使っている
AGENT_ATTACHMENTS // 装着している
AGENT_AUTOPILOT // is in "オートパイロット" モード
AGENT_AWAY // "away" モード
AGENT_BUSY // "busy" モード
AGENT_CROUCHING // しゃがんでいる
AGENT_FLYING // 飛んでいる
AGENT_IN_AIR // 空中に浮かんでいる
AGENT_MOUSELOOK // マウスルック
AGENT_ON_OBJECT // オブジェクトに座っている
AGENT_SCRIPTED // スクリプトを装着
AGENT_SITTING // 座っている
AGENT_TYPING // 入力している
AGENT_WALKING // 歩いている、走っている、しゃがみ歩きをしている
*/
integer info = llGetAgentInfo(llGetOwner());
if( info & AGENT_FLYING )
{
startAnimation(anim_1);
}
else if( info & AGENT_IN_AIR )
{
startAnimation(anim_1);
}
else if( info & AGENT_TYPING )
{
startAnimation(anim_2);
}
else if( info & AGENT_WALKING )
{
startAnimation(anim_1);
}
else if( info & AGENT_ATTACHMENTS )
{
startAnimation(anim_1);
}
else
{
stopAnimation();
}
}
}
-
AO には 本来 llSetAnimationOverride を使うべきです。そうすれば Timer の使用もせずきれいにまとまります。本スクリは装着物に応じた変更を AO もしている状態でどう実装するかというのに対するアプローチの一例であることを前置きします。http://wiki.secondlife.com/wiki/LlSetAnimationOverride/ja ↩