ポーズスタンド用のスクリプトです。ポーズ台の三角のボタンを押すと
ポーズが切り替わり、そのポーズのアニメーションの名称を表示します。
アニメーションファイルは、オブジェクトのコンテンツの中にドラッグするだ
けでOKです。

「スクリプト内容」
1. ポーズ本体用スクリプト
//
// PoseStand script v1.1
//
// Created by Zero2000 Kid 2008/01/04
// 2008/01/12(modified)
//
integer itemType=INVENTORY_ANIMATION;
vector posePos=<0,0,1.5>;
integer itemCount;
integer counter=0;
string animation;
key sitavakey=NULL_KEY;
stopAnimation() {
list anims = llGetAnimationList(llGetPermissionsKey());
integer aminct = llGetListLength(anims);
integer i;
for (i = 0; i < aminct; i++){
llStopAnimation(llList2Key(anims, i));
}
}
startAnimation(integer num) {
if (itemCount==0) return;
stopAnimation();
counter+=num;
if (itemCount<=counter)
counter=0;
else if (counter==-1)
counter=itemCount-1;
animation=llGetInventoryName(itemType,counter);
showText();
llStartAnimation(animation);
}
showText() {
itemCount = llGetInventoryNumber(itemType);
string msg;
if (sitavakey==NULL_KEY)
msg="-- PoseStand --\n" + (string)itemCount + " styles animation";
else
msg="-- PoseStand --\n" + animation + "(" + (string)(counter+1) + "/" + (string)itemCount + ")";
llSetText(msg,<1,1,1>, 1.0);
}
default {
state_entry(){
llSetSitText("Pose");
llSitTarget(posePos,ZERO_ROTATION);
showText();
}
on_rez(integer int) {
llResetScript();
}
changed(integer change) {
if (change & CHANGED_LINK) {
sitavakey = llAvatarOnSitTarget();
if( sitavakey != NULL_KEY ) {
if ((llGetPermissions() & PERMISSION_TRIGGER_ANIMATION)
&& llGetPermissionsKey() == sitavakey) {
startAnimation(0);
} else {
llRequestPermissions(sitavakey, PERMISSION_TRIGGER_ANIMATION);
}
} else {
animation="";
counter=0;
showText();
}
} else if (change & CHANGED_INVENTORY) {
showText();
}
}
run_time_permissions(integer perm){
if(perm & PERMISSION_TRIGGER_ANIMATION){
startAnimation(0);
}
}
link_message(integer sender_num, integer num, string str, key id){
if (llGetPermissionsKey() == sitavakey) { // add 2008/01/12
startAnimation(num);
} // add 2008/01/12
}
}
2. ポーズ切り替えボタン①用スクリプト
//
// button1 script v1.0
//
integer i = -1;
default {
touch_start(integer detected) {
llMessageLinked(LINK_ROOT,i,"", NULL_KEY);
}
}
3. ポーズ切り替えボタン②用スクリプト
//
// button2 script v1.0
//
integer i = 1;
default {
touch_start(integer detected) {
llMessageLinked(LINK_ROOT,i,"", NULL_KEY);
}
}
「作成方法」
1. ポーズ本体用のオブジェクトを作成します。
2. ポーズ切り替えボタン①用のオブジェクトを作成します。
3. ポーズ切り替えボタン②用のオブジェクトを作成します。
4. 本体用オブジェクトにポーズ本体用スクリプトをドラッグします。
5. ポーズ切り替えボタン①オブジェクトにポーズ切り替えボタン①用スクリプトをドラッグします。
6. ポーズ切り替えボタン②オブジェクトにポーズ切り替えボタン②用スクリプトをドラッグします。
7. 作成した3つのオブジェクトを本体オブジェクトがルートプリムとなるようにリンクします。
以上です。
「使用方法」
1. ポーズスタンドを右クリックし、コンテンツの中にアニメーションファイルをドラッグします。
2. ポーズスタンドを右クリックし、パイメニューからPoseをクリックします。
* ポーズ位置の調整は、ポーズ本体用スクリプト2行目のvector posePos=<0,0,1.5>で調整できます。
括弧の中の数字を変更してください。数値は、X,Y,Zの順番で並んでいます。<0,0,1.5>の場合、
Z軸方向に1.5m上にポーズ位置を取ります。
「スクリプトの説明」
こまかい説明は、割愛させて頂きますが・・^^;、このスクリプトで重要なポイントは、リンクメッセージを
利用している点でしょうか。ポーズスタンドのボタンがクリックされると
llMessageLinked(LINK_ROOT,i,"", NULL_KEY);
を実行して、ルートプリムに対してメッセージを送信します。このコマンドのLINK_ROOTというパラメータが
ルートプリムへ信号を送る意味になります。(詳しくは、llMessageLinkedを参照ください)ここでは、変数i
の数値をメッセージとして送信しています。
ルートプリム側では、link_messageイベントを利用して、メッセージを受信します。このスクリプトの例では、
ボタン1の場合 1、ボタン2の場合 -1 という数値をルートプリム側で受信します。ルートプリム側では受
信した数値に応じて、変数であるcounterをプラス1したりマイナ1したりします。counter変数は、アバター
に実行させるアニメーションを選択する際に利用している変数です。実際にアニメーション名称を取得して
いる箇所は、
animation=llGetInventoryName(itemType,counter);
という行になります。このコマンドは、コンテンツの中にある指定したタイプのcounter番目のアイテム名称
を返す関数です。itemTypeは、一行目で
integer itemType=INVENTORY_ANIMATION;
と指定していますのでアニメーションファイルとなります。つまりこのコマンドは、コンテンツの中にあるcounter
番目のアニメーション名称を返すことになります。(詳しくは、llGetInventoryNameを参照ください)
あとは、llStartAnimation()コマンドを利用して、取得したアニメーションを実行させます。
* リンクメッセージコマンドは、HUD等を作成する際には、必須のコマンドとなりますので覚えておくととても便利ですw
リンデンスクリプト Tips Intexへ