Adsense

2008年11月7日金曜日

[MLDU] 初期ダンス設定方法

MLDU は llStartAnimation/llStopAnimation を指定間隔で行うわけですが、llStartAnimation の指示あとでダンスに参加した Avatar は現在他の人が踊っている Animation に途中から参加することができません。

元々シンクロ(同期)ダンスを踊るための MLDU だったので、おくれて入ってきても、、、同じダンスをおどっても意味がない、という考えのもとでした。

そこで、MLDU3 まではコンテンツ フォルダの中の一番上にあるアニメーションをデフォルト ダンス アニメーションとして取り込んで、danceSlot スクリプトが同期スクリプトの SynchManager から「同期の指示がくるまで」そのダンスを踊らせる仕様でした。

llStartAnimation はプリム内のコンテンツ フォルダにあるダンス アニメーションの「名前」を使ってダンスを踊らせますから、llGetInventoryName を使って、アニメーション タイプのオブジェクトの名前をフォルダから取得していたわけです。

string initAnimName = llGetInventoryName(INVENTORY_ANIMATION,0);

こんな感じでした。

しかし、、、この待ちのダンス、「待っているような」ダンスを躍らせたい、というリクエストがあったわけです。

Sine Wave の dance 14 とか、そんなダンスも存在しているわけで、たしかにそうしたいのもわかるというもの。

そこで MLDU4 では 00:XXXXXXXXXX というノートカードを使っています。


ノートカードを使っているといっても、00:XXXXXXXXXX のノートカードの中身は空です。
つまり、ノートカードの名前の XXXXXXXXXX の部分を使っているわけです。
SynchManager と Animations というスクリプトからノートカードを読み込む方法をとっているにもかかわらず、この「名前」をとる方法にしたのは、、、単純にシンプルにしたかったためです。(というか、、、楽したかった?)
ノートカードの読み込みは dataserver イベントを使っているので軽い処理ではありません。そのため、ノートカードの読み込みが重なってしまうとエラーになることもあったわけです。
この初期ダンスの設定は MLDU4 リセット時に 50 ダンススロットバージョンだと 50 のスクリプトのリセットが走るわけですから、、、なるべくシンプルにしたかったのです。
ということで、、、ノートカード 00:XXXXXXXXXX は初期ダンスを指定するためのノートカードになります。
ブランクが入ってもかまいませんが、正確に名前を入れる必要があります。
もし、XXXXXXXXXXX で指定したダンス アニメーションが無かった場合は、MLDU3 までと同じようにコンテンツ フォルダにある一番上のアニメーションを使用します。
スクリプトとしては以下のようなものを使っています。
string initAnimName = "";
integer numberOfNotecards = llGetInventoryNumber(INVENTORY_NOTECARD); //ノートの数を取得
integer i;
for(i=0;i<numberOfNotecards;++i){ //ノートの数ぶん for をまわします
     string tName = llGetInventoryName(INVENTORY_NOTECARD, i);
     if(llGetSubString(tName, 0, 2)=="00:"){ //もしノートカードの名前の最初の3つの文字が 00: だったら
          string tName2 = llGetSubString(tName, 3, -1); //00: 以降のストリングを取り込み
          if(llGetInventoryType(tName2)!=-1){ //その名前のダンスがコンテンツ フォルダに存在していれば
               initAnimName = tName2; //初期ダンスとして登録します
          } else { //存在してなければ
               initAnimName = llGetInventoryName(INVENTORY_ANIMATION,0); //最初のアニメを登録
          }
          i = numberOfNotecards; // for を終わらせるため max 値をいれます
     }
}
//このあとで 00:XXXXXX ノートカードそのものが存在していない場合の処理を。。。
llStringTrim を使って 00: の後のダンス アニメーション名の前後のスペースの削除とかしてませんから、00: に続けてアニメーション名を「名前の変更」でいれてください。