2015/12/04

ランダムアニメーション

装着するとランダムにアニメーションします。
友だちが「どこでもダンス」とかで、アニメーションをメニューでいちいち選ぶのはめんどう、というので作ってみました(^^)/

オブジェクトを装着するとすぐアニメーションがはじまり、一定時間ごとに切り替わります。
はずせば終了。
とっても簡単です。
(最初はアニメーションを許すか聞いてきますが、次からはそれもなし)

スクリプトはこんな感じ:
default {
  attach(key id) {
    if (id) { // アバターに装着
      Id = id;
      Attach = TRUE;
      llSetTimerEvent(CycleTime); // 時間切替をセット
    }
    else Attach = FALSE; // アバターからはずれた
    // アニメーション許可申請
    llRequestPermissions(Id,PERMISSION_TRIGGER_ANIMATION);
  }
  timer() { // 一定時間ごとに切替
    llRequestPermissions(Id,PERMISSION_TRIGGER_ANIMATION);
  }
  run_time_permissions(integer perms) {
    if (perms & PERMISSION_TRIGGER_ANIMATION) { // アニメーション許可
      if (Anim) llStopAnimation(Anim); // 前のアニメをストップ
      if (Attach) { // アバターに装着されてれば
        integer n = llList2Integer(Nums,Index); // アニメ番号
        Anim = llGetInventoryName(INVENTORY_ANIMATION,n);
        llStartAnimation(Anim); // 新しいアニメをスタート
        if (NumAnims <= ++Index) { // インデックスを増やして超過したら
          Index = 0;
          Nums = llListRandomize(Nums,1); // アニメ番号を並び替え
        }
      }
      else llResetScript(); // アバターからはずれた
    }
  }
}
llListRandomize() という関数は、リストの内容をランダムに並び替えます。
アニメを毎回ランダムに選んでもいいのですが、それだと短い間に同じものが何度もでてくることもあるので、順番をバラバラにした番号リストを一巡して、また順番を並び替えて、というふうにやるとまんべんなくしかもランダムに選べます。