ソラマメブログ

2007年04月19日

アニメさせよう(スクリプト初級第十三回)

十三回もやってんのかって感じのスクリプト講座です(^^;
振り返ってみてみると、脱初級者までの道のりは、もうそれほど遠くはありませんね。
「ステート」「イベント」「処理」の三段構成を押さえ、最も多様性のあるイベントlistenも扱ったし、便利なダイアログも出てきたし。
パーミッションが少々モヤモヤ感がありますが、今回のアニメーションスクリプトでもパーミッションと格闘することになりますので、より理解が進むかと思います。

というわけで、今回は特にパーミッションに焦点をあてながら、アニメーションを扱うスクリプトについて見ていくことにしましょう。
アニメーションのデータ

スクリプトからアニメーションを扱うには、パーミッションにさえ気をつけていれば難しいことはほとんどありません。
ここで言うアニメーションとは、アバターの動きのことです。
ダンスとか、パンチ・キックなどのアクション、あるいはモデルポーズみたいに固まったままのものもあります。

スクリプトで制御するのは「どのアニメーションを実行するか」だけです。
そのアニメーションが実際に「どのような動きをするか」については、スクリプトからは判断ができません。

「どのような動きをするか」はアニメーション・データ次第です。
SLではアニメーションのデータを自作することができますが、詳しくはSL Wiki Japanのアニメーション作成の記事が参考になります。

外部のアニメーション作成ツールを使ってデータを作成し、SLにデータをアップロードします。
SLのアニメーションを作れるツールはいくつかありますので、自分の使いやすいものを選べば良いでしょう。
ちなみに私はQAvimatorというシンプルなツールを良く使います。
というか、高機能なものは使い方を理解するだけの頭がございません(^^;

アニメさせよう(スクリプト初級第十三回)
QAvimatorの画面イメージ

自分でアニメーションデータを作ることができなくても、もとからSLに用意されているデータや、フリーで出回っているものを使うことができます。
非常に良くできたものもありますので、興味のある方は探してみてください。

なお、今回のスクリプトでは「ダンスアニメーション」を使います。
手元に使えそうなアニメーションデータが無いという方は、私の店にフリーアニメーションが置いてありますのでご自由にお持ち下さい(^^
「free animation pack」と書かれた音符マークの緑色の箱です。

ちゃっかり宣伝:Silent Stream
/adder/104/210/0/


アニメーション開始!

さっそくアニメーションを実行する関数から見てみます。

  llStartAnimation(string anim);

今まで出てきた関数の中でも、かなり簡単そうに見えます!w
引数には実行するアニメーションの名前を指定します。
もともとSLに組み込まれているアニメーション以外を使う場合は、オブジェクトのコンテンツの中にアニメーションが入っていなければなりません。

ちなみに、アニメーションを止めるときは、

  llStopAnimation(string anim);

もはや説明する必要もないでしょうが、引数で指定したアニメーションを止める関数です。
指定したアニメーションが実行中ではない場合には何の意味もありません。

このように、関数自体は非常に簡単そうに見えます。
しかし、この二つの関数をジッと見ていると、ふとした疑問が出てきませんか?

llStartAnimation(string anim)・・・。

animで指定したアニメーションを実行する・・・。

指定したアニメーションをさせる・・。

アニメーションさせる・・・。

・・・・・。

誰を?w

そう、この関数には「誰を」アニメーションさせるかの指定がないのです。

目的語を必要としない動詞であれば、意味は問題なく通じます。
例えば、
「あのさー、俺さー、昨日、泣いちゃったんだよ」
これは意味がわかります。
何故泣いたのかは不明ですが、文章としては完結します。

しかし、
「あのさー、俺さー、昨日、やっちゃったんだよ」
これは謎ですw
「何をしたんだ・・・?」
そう聞かずにはおれない文章です。
一体何を・・・。
ついにヤツの頭に銃をつきつけて引き金を引いてしまったではないかと、ボヘミイアン・ラプソディ並みに心配させる文章です。

同様にスクリプトllStartAnimation(string anim)も、
「さあ、animのようにアニメーションさせるのだ」
そう命令しているわけですが、命令されたほうは、
「だ、誰をですか・・・?」
そう聞き返さずにはいられない状況としか思えません。

しかしながら、スクリプトは迷うことなくアニメーションを実行するのです。
それは別のところで「誰を」アニメーションさせるか明示しているからなのですが、そこで出てくるのが例のパーミッションです。

踊るのは誰か

実は、アニメーション対象は「直前にパーミッションを取得したヤツ」と決まっています。
こんなん言われなきゃわかりません(^^;

私がlslをいじり始めたての頃、この辺りのことがわからないままにアニメーションのスクリプトを組んだものです。
すると友達がオブジェクトにタッチしているにも関わらず、踊りだすのは私という、マリオネットなスクリプトが完成しました(^^;

誰をアニメーションさせるのかわかった後には笑い話ですが、わかるまでは「?」でいっぱいな状態でしたね・・・。

つまりアニメーションを実行するには、以下のステップが必要になります。

(1)パーミッションの取得
    アニメーションさせたい相手に関して、アニメーションのパーミッションを取得します。
(2)アニメーションの実行
    パーミッションを取得した相手に対してアニメーションを実行する

このステップを無視すると、アニメーションが動作しないだけでなく、予期せぬ人が(主に自分w)いきなり動き出すという事態になります。

従って、タッチしたときにアニメーションするような、ダンスボールみたいな仕組みを作るには、
「タッチイベント」で「アニメーションの実行」
これだけだとうまく動きません。

(1)「タッチイベント」で「パーミッションを要求する」
(2)「パーミッションイベント」で「アニメーションの実行」

このようなステップになります。
このへんがアニメーションスクリプトの面倒なところです。

アニメーション実行までの流れ

パーミッションの扱い方は、ベンダーのときと同じ流れです。
復習になりますが、わかりにくいところですので再び詳細に追いかけてみましょう。

まずパーミッションを取得するための関数はllRequestPermissions()関数です。

  llRequestPermissions(key agent, integer perm)

key型引数agentには、パーミッションを取得する相手のUUIDを指定します。
permは取得するパーミッションの種類です。
アニメーションのパーミッション定数はPERMISSION_TRIGGER_ANIMATIONという名前になっていますので、今回はこの値を使います。

「タッチしたとき」に「パーミッションを要求する」には、

  touch_start(integer detected){
    llRequestPermissions(llDetectedKey(0), PERMISSION_TRIGGER_ANIMATION);
  }

このようになります。
これでタッチした人に対してパーミッション要求のダイアログが表示されます。

パーミッションのダイアログに対して返答がなされると、run_time_permissionsイベントが起こります。
ベンダースクリプトのお金のパーミッションのときと同様ですね。

  run_time_permissions(integer perm)

このイベントは、パーミッションが承認されても、却下されても、どちらでも発生しますので、承認されたかどうかの確認はイベント内で行わなければなりません。

  run_time_permissions(integer perm) {
    if (perm & PERMISSION_TRIGGER_ANIMATION){
      // PERMISSION_TRIGGER_ANIMATIONパーミッションが許可された
    } else {
      // PERMISSION_TRIGGER_ANIMATIONパーミッションが許可されなかった
    }
  }

パーミッションが承認されればアニメーションの実行が可能ですので、

  run_time_permissions(integer perm) {
    if (perm & PERMISSION_TRIGGER_ANIMATION){
      llStartAnimation("boogie");
    }
  }

こんなふうにしてやれば動き出します。
パーミッションが却下された場合は何もしなくてよいので、if文の後半は削りました。

しかし、これだけではアニメーションのスタートは実現できますが、停止ができません。
一度踊りだしたらもう止まらないスクリプトというのも面白いとは思いますがw

停止するために

タッチすると踊りだし、もう一度タッチすると止まるような仕組みを考えてみましょう。
パーミッションの要求部分については共通で使えます。

(1)「タッチしたとき」・・・「パーミッションを要求する」
(2)「パーミッションが承認されたとき」
          「まだアニメーションしていない場合」・・・「アニメーション実行」
          「すでにアニメーションしている場合」・・・「アニメーション停止」

これが出来れば、タッチするたびに「アニメーション実行」「アニメーション停止」が切り替わりますね。

「すでにアニメーションしているかどうか」を調べるには、llGetAnimationList()関数が使えます。
llGetAnimationList()関数は、指定したアバターが実行しているアニメーションのリストを取得する関数です。

  list llGetAnimationList(key id)

idにはアバターのUUIDを指定します。
返ってくるlistは、実行中のアニメーションのUUID一覧です。

なぜlist型で返ってくるかというと、実は同時に実行できるアニメーションの数は一つではないからです。
アニメーションには5段階の優先順位があって、例えばwalk(歩くアニメーション)は優先順位0です。
対してsit(座るアニメーション)は優先順位4になっており、walkとsitを同時に実行すると、sitのほうが優先されて動きます。
また、アニメーションの中には全身を動かさないようなものもあります。
表情のアニメなどは特にそうですが、laugh(笑うアニメーション)とwalk(歩くアニメーション)を同時に実行すると、表情は笑顔で身体は歩いている状態にすることができます。
そのように複数のアニメーションが実行可能なため、llGetAnimationList()関数は実行中のアニメーションをlistで返すのです。

従って、特定のアニメーションに関して「すでにアニメーションしているかどうか」を調べるには、listの中にそのアニメーションが含まれているかどうかを調べなければなりません。

ここでもう一点注意しなければならないことは、llGetAnimationList()関数で返ってくるリストはアニメーションのUUIDです。
"boogie"という名前のアニメーションが実行されているかどうかを調べるには、まずUUIDと名前の変換をしてやらなければいけません。

名前をUUIDに変換するには、llGetInventoryKey()関数が使えます。
llGetInventoryKey()関数はオブジェクトのコンテンツに入っているもののUUIDを取得する関数で、引数には調べたいものの名前を指定します。

  key llGetInventoryKey(string name)

例えば"boogie"という名前のアニメーションのUUIDを調べたい場合は、
  key chk = llGetInventoryKey("boogie");
このようにすれば変数chkに"boogie"のUUIDが格納されます。

「すでにアニメーションしているかどうか」を調べて、アニメーションしていたら停止、していなかったら実行するようにするには、以下のようなコードになります。
以下の例ではアニメーションの名前は"boogie"、アニメーション対象のUUIDは変数agentとしています。

  key chk = llGetInventoryKey("boogie");
  list anms = llGetAnimationList(agent);
  integer i;
  for (i = 0; i < llGetListLength(anms); i++){
    if (chk == llList2Key(anms, i)) {
      // アニメ"boogie"は実行中
      llStopAnimation("boogie");
      return;
    }
  }
  // アニメ"boogie"は実行中のアニメリストの中に無かった=まだ実行していない
  llStartAnimation("boogie");

これでだいぶできてきました。
クリアすべき点はあと1点のみです。

上の例ではアニメーション対象のUUIDをagentという変数で示していますが、このUUIDはどのように取得すればいいのでしょうか。
アニメーション対象は「直前にパーミッションを取得した相手」です。
これを調べるための関数はllGetPermissionsKey()と言います。

  key llGetPermissionsKey();

引数はありません。無条件に「現在パーミッションを取得しているアバターのUUID」が返ります。
誰のパーミッションも取得していない場合はNULL_KEY(存在なし)が返ってきます。

アニメーションスクリプト

※一番最初に掲載した際にコードにミスがありました。以下は修正後のコードです。
string animation_name="boogie";
key agent = NULL_KEY;

default {
  touch_start(integer detected){
    if (agent == NULL_KEY) {
      agent = llDetectedKey(0);
      llRequestPermissions(agent, PERMISSION_TRIGGER_ANIMATION);
    }
  }

  run_time_permissions(integer perm) {
    key perm_key = llGetPermissionsKey();
    if (perm_key == agent) {
      if (perm & PERMISSION_TRIGGER_ANIMATION){
        key chk = llGetInventoryKey(animation_name);
        list anms = llGetAnimationList(agent);
        integer i;
        for (i = 0; i < llGetListLength(anms); i++){
          if (chk == llList2Key(anms, i)) {
            llStopAnimation(animation_name);
            agent = NULL_KEY;
            return;
          }
        }
        llStartAnimation(animation_name);
      }
      agent = NULL_KEY;
    }
  }
}


コードは短いですが、アニメーションの仕組みが理解できていないと読み取れないスクリプトです。
実行するアニメーションはstring型の変数animation_nameとしてスクリプトの先頭に定義しました。
ここでは"boogie"というアニメーションを使っていますが、ここを変更すると様々なアニメーションに対応可能です。

「パーミッションのリクエスト」と「パーミッションイベント」の間の整合性を確保するために、少々小細工を弄しています。
どういうことかと言うと、「パーミッションのリクエスト」をしたときの相手と、「パーミッションイベント」の起きたときの相手が、必ずしも同じではない場合があり得るということです。
以下のような場合を考えてみて下さい。

(1)私(Miz)がオブジェクトにタッチする。
(2)Mizに対してパーミッションダイアログが表示される
(3)Mizはそれを放置(ぉぃ
(4)その間に私の友人のYasichiくんがオブジェクトにタッチ
(5)Yasichiくんに対してパーミッションダイアログを表示
(6)Yasichiくんは即座にパーミッションを受け入れる
(7)パーミッションイベントが起きる。このときパーミッションの相手はYasichiくん
(8)Yasichiくん、踊りだす
(9)楽しそうなYasichiくんを見て、Mizがようやくパーミッション受け入れのボタンを押す
(10)パーミッションイベントが起きる。しかしこのとき、パーミッションの相手はYasichiくん
(11)スクリプトはYasichiくんの実行中アニメーションを調べ、すでに踊っているのでアニメーションを停止
(12)何が起こったのかわからないMizとYasichiくんは険悪な状態に(ぇ

(10)の時点で、「直前のパーミッション要求」は(5)の処理ですので、相手はYasichiくんです。
こんなふうに、パーミッション要求と返答が入り混じってしまうと、たちまちおかしな動作になります。

ですので小細工してパーミッション要求と返答が入り混じらないようにしています。
key型変数agentを用意しているのはそのためです。
agentにはパーミッション要求した相手のUUIDを保管するようにしておき、誰にも要求を出していないときにはNULL_KEYを入れておきます。

タッチイベントが起きたとき、agentがNULL_KEYであれば誰にも要求を出していないので、要求を出す相手をagentに設定し、パーミッションリクエストを行います。
run_time_permissionsイベントが起きたときには、まず要求を出している相手のUUIDを調べ、それをagentと比較します。
これが一致していれば、正しい順序でパーミッション要求と返答が来ている事になりますので、アニメーションの処理を行います。
アニメーションの処理が終わったら、agentにNULL_KEYをセットし、次のタッチイベントに備えます。

今回のポイント

・アニメーションの開始:
  llStartAnimation(string anim);
animは開始するアニメーション名。
対象は直前にパーミッションを取得した相手。

・アニメーションの終了:
  llStopAnimation(string anim);
animは停止するアニメーション名。
対象は直前にパーミッションを取得した相手。

・実行中のアニメーション取得:
  list llGetAnimationList(key id)

・オブジェクトコンテンツの中にあるもののUUID取得:
  key llGetInventoryKey(string name)

・直前にパーミッション要求を出した相手のUUID:
  key llGetPermissionsKey();

繰り返しになりますが、アニメーションで面倒なのはパーミッションの処理だけです。
パーミッションの扱い方法を理解し、現在誰に対してのパーミッションを取得するのかを意識すれば、アニメーションを自由に操れます。

例えば、しばしばクラブなどで見かけるダンスボールですが、不特定多数の人がタッチして踊れるようになっており、しかも一定時間でダンスアニメーションを切り替えるものもあります。
あれを実現しようとすると、結構複雑なパーミッション管理を行う必要が出てきます。
というか、正攻法で作るのはおそらく困難を極めますw
もしも作れたら、初級者卒業はもちろん、かなりのスクリプト技術があると言ってもいいでしょう。
中級者でも悩む人いるんじゃないかな?(^^;

ダンスボールについては、正攻法以外の裏技もありますけどねw
裏技ならば、今回のスクリプトを改造して対応可能です(いずれ機会があればダンスボールの作り方は解説します)。

さて。
アニメーションスクリプトの基礎が出来たところで、次回は応用をしてみましょう。
以前作った椅子スクリプトがありますが、あれにアニメーションの処理を追加し、デフォルト以外のポーズで座れる椅子を作ってみる、なんてのを考えています。

では、また次回。


同じカテゴリー(初級スクリプト)の記事画像
衝突判定(スクリプト初級第二十三回)
カメラ制御(スクリプト初級第二十二回)
センサーを使おう(スクリプト初級第二十回)
HUDを作ろう(スクリプト初級第十六回)
prim間通信(スクリプト初級第十五回)
お金を扱う(初級スクリプト第十一回)
同じカテゴリー(初級スクリプト)の記事
 衝突判定(スクリプト初級第二十三回) (2007-05-08 12:15)
 カメラ制御(スクリプト初級第二十二回) (2007-05-07 14:36)
 デモ商品を作ろう(スクリプト初級第二十一回) (2007-05-02 12:15)
 センサーを使おう(スクリプト初級第二十回) (2007-05-01 12:15)
 ステートのこと(スクリプト初級第十九回) (2007-04-27 12:15)
 rez!(スクリプト初級第十八回) (2007-04-26 12:15)
この記事へのトラックバック
 
3つのアニメーション同時実行の図
 
昨日はアニメーション合成HUD作成へ向けてのテストに際して
タッチON・OFF付ジェスチャリングスクリプトへの道のり【Rinsui SL+ Making Blog】at 2007年08月15日 00:54
ここ2週間くらい、スクリプトと格闘しています。何を作ろうとしているかと言いますと、「フルパーミッションでないアニメファイルを1クリックで動かすツール」です。といいますのも...
苦戦中なのです・・・【SecondLife、イけるとこまでイってみる】at 2007年08月31日 12:35
この記事へのコメント
いつもすばらしい情報ありがとうございます!
言葉使いや表現がやわらかくて、わかりやすいですっ。

でも、私の頭ではまだまだ付いていけそうにありません…orz
頑張って勉強させていただきやすっ!!
Posted by 5号@SLMaMeスタッフ at 2007年04月19日 17:01
>5号@SLMaMeスタッフさん

コメントありがとうございます。
スクリプトには慣れもありますので、まずは動くコードを丸写しして使いつつ、
「ここを変えたらどうなるのか?」
と予想しながら実験を繰り返すと理解が深まったりしますよ。

なるべくそのまま動くコードを紹介していきますので、まずは意味のわかったところから改造して遊んでみて下さい(^^
Posted by Miz at 2007年04月20日 14:25
フリーアニメーションいただきました^^。
スクリプトもちゃんと動きました。
熟読させていただいてます(順番は前後してますが)。

ベンダーも作ってみたのですがお金が0なので動作確認ができないです。
L$0でも動作確認できる方法はないでしょうか?。
Posted by もに at 2007年05月08日 01:06
>もにさん

>L$0でも動作確認できる方法はないでしょうか?。
βテストグリッドで試す方法はありますね。
テストグリッドでは、お試し用に5000L$ほど支給されているような気がします。
ただし4/13以前に登録した人じゃないと使えないようです・・・。

βテストグリッドについてはfurry japanに紹介記事がありました。
http://www15.ocn.ne.jp/~soloren/sl/beta.html
Posted by Miz at 2007年05月08日 10:10
おお、そういうのが在るのですか。
ありがとうございます。
僕が登録したのはもっと前なので大丈夫です^^。
Posted by もに at 2007年05月08日 23:23
こんにちは、貴重な情報をありがとうございます。

一つお聞きしたいのですが、こちらで公開されているスクリプトやアニメーションを埋め込んだアイテムを販売してもよろしいでしょうか?
ご検討ください。


それと上記からお店の方にteleportしたのですが落とされてしまいます(GAMEが異常終了します)
調べてみたところ、オプションのグラフィック詳細-ライティング細部を[陽光と月光のみ]にするとおちなくなり、[ローカルライトの近く]にすると確実に落ちます。

私のpcのVideo性能が低いのが原因かと思いますが、お店を少し離れて飛び回ったり歩き回っても落ちなくなります(もちろんお店の中でも落ちません)
もしかすると、周りの土地のオーナから嫌がらせを受けてるのかも?

ライティングを[日光と月光のみ]にしてログインしそのまま5分放置、落ちないことを確認した後[ローカルライト]設定に変えカメラを回転させるとすぐに落ちたので対策としてはこれでいけると思います。

もしかするとポイントの周囲を高い壁で囲むと解決するかもしれませんね?
樹木のテクスチャーでも張っておけばクレームもこないでしょうし。

それではよろしくお願いします。
Posted by Syousa at 2007年07月11日 14:01
>Syousaさん

スクリプトに関してはどうぞご自由に利用なさって下さい。
特に「初級スクリプト」で紹介しているようなものに関しては、特別なノウハウを駆使しているわけでもありませんので、私の製作物というよりはサンプルコードのようなものです。

アニメーションに関しては、フリーで出回っている再利用可のものですので、商品に組み込んで使うのは問題ないかと思います。
(しかしながら、余計な補足ですが、アニメーションを単品で販売するのはモラルの観点から言ってよろしくないとは思います)

お店はしばらく放置状態でしたが、そんな罠が仕掛けられていましたか(^^;
変なことになっていないかどうか今度確認しておきます。
失礼いたしました。
Posted by Miz at 2007年07月11日 15:03
快諾していただきありがとうございます。

実はスクリプトもアニメーションも全く手を付けていない初心者です(><
数日前からアイテム作りを始めたのですが、どうにも歪むというかきっちりいきません。
素人判断ですがAVとカメラをきっちり固定(チェックする際にさっきと同じ位置にセット)できないのが原因だと思いました。

Posing Standなるものでポーズを固定できるとわかったので1日探し回ったのですが、独特のポーズを取る物ばかりで「大の字仁王立ち」のようなものを見つけることが出来ませんでした。

そこで自作を模索してこのプログにたどり着いたしだいです(^^;

作りたい物は「カメラコントロール機能付きPosing Stand」です。
一体化が無理なら椅子にPosingを机にカメラコントロールというふうに分けてもいいかと考えております。

アニメーションはポーズを固定するのに必要と書かれていたのでそれ用で単品販売は考えておりません。
何分何も手を付けていないのでいつ完成するかも不明ですが、販売についてお伺いしたのは、自分専用だと適当なところで満足するのが見えていたためです(><
販売すると思えば高い完成度を目指せますから。

それではどうもありがとうございました。
これからも有益な情報をよろしくお願いします(^^
Posted by Syousa at 2007年07月11日 16:34
>Syousaさん

「カメラコントロール機能付きPosing Stand」というのは面白いですね。
服やアクセサリー、アバターの製作をしている方には需要があるかもしれません。

そう言えばカメラコントロールについては簡易機能しか紹介していませんでした・・・。
いろんなアングルにカメラを動かすにはもう一歩踏み込んだスクリプトが必要になりますね。
今度追加記事考えてみます。
Posted by Miz at 2007年07月11日 16:45
はじめまして。いつも読ませてもらってます。

ここで質問していいのかわかりませんが。。。
ベンダースクリプトのお金のパーミッションの回と読み合わせて、ダンスパッドを作成しようと思ったのですが、なかなかうまくいきません。
2種類のパーミッションを、違うタイミングで取得するのはダメなのでしょうか?
PERMISSION_DEBITは、起動直後にオーナーが取得し、今回の
PERMISSION_TRIGGER_ANIMATIONは、踊る人がその都度取得すればいけると思ってました。。。
しかし、デバッグしてみると、PERMISSION_TRIGGER_ANIMATION許可を取ると同時に、PERMISSION_DEBIT許可が消えてしまっています。
ダンスパッドは上級技なのでしょうか?
Posted by Erisa Yoshikawa at 2007年08月05日 02:39
>Erisa Yoshikawaさん

パーミッションは一度に1人に対してしか取得できませんので、オーナーとダンサーの二人に対してパーミッションを得るには工夫がいりますね。

一番手っ取り早いのはスクリプトを二つに分けてしまうことです。

・支払用スクリプト・・・オーナーのパーミッションのみ考慮
・ダンス用スクリプト・・・ダンサーのパーミッションのみ考慮

ダンス用スクリプトでは、ダンサーが一定時間踊ったら、llMessageLinked関数でリンクメッセージを送信するようにします。

支払用スクリプトではlink_messageイベントを用意しておき、ダンス用スクリプトからのメッセージに反応してL$を支払うようにします。

ヒントのレベルですが、こんな感じで実現できるのではないでしょうか。
Posted by MizMiz at 2007年08月13日 11:11
いつも拝見させて頂いております^^とても参考になり、初心者の私でも楽しみを感じることが出来ております^^いつもご質問ばかりで申し訳ないのですが、どのようにしたらよいのか全く見当もつきませんので教えて頂ければ嬉しいです。ポーズボールなどで、たとえばダンス等の2人で一緒に踊るような場合、ポーズボールが2つありますが、それぞれにアニメーションが入っていてそれにタッチするとアニメーションが始まりますが、そのタイミングをあわせるにはどのようにしたら良いのでしょうか。また、同じようなもので、自分の持っているアニメーションで、相手に同意を求めてアニメーションをしてもらうような仕組みは、どのようになっているのでしょうか。ご存知でしたら教えて頂ければ嬉しいです。お手数をお掛けして申し訳ございませんが、宜しくお願い致します。
Posted by Hiroe at 2007年09月30日 02:36
>Hiroeさん

アニメーションの同期は、二つのスクリプトで同時にアニメーションを開始すればいいので、何らかの方法で「いっせーの、せ」でllStartAnimationを実行できれば実現できます。

タイミングを合わせる方法としては、スクリプトが一つのオブジェクトの中に入っているのであれば、リンクメッセージを使うのが一番です。リンクメッセージについては「prim間通信」の記事で説明しています。

最低限の流れを書くと以下のようになります。
(1)ポーズボール1に誰かが座ったら、ポーズボール2にリンクメッセージを送信
(2)ポーズボール2に誰かが座ったら、ポーズボール1にリンクメッセージを送信
(3)リンクメッセージを受信したら、ボール1、2ともにアニメーションをスタート

それから、相手に同意を求めてからアニメーションを開始する方法は、この回のスクリプトで可能です。
Posted by MizMiz at 2007年09月30日 20:13
はじめまして^^
オリジナルのダンスボールがあるのですが
スタートしたとき、balltouced っていうのがでるんですが。なぜか、アニメの数分チャット表示されてしまいますw
contentsのsolopserverをrisetしてもなおりません
使うこと自体問題ないんですが、とめる方法わかったら。おせーてください^^
  お願いしマース^^b
Posted by しゃんしゃん at 2007年12月21日 12:11
>しゃんさん

スクリプトコードがわからないので何とも言えませんが、チャットメッセージが出力されるということは、llSayやllWhisperなどが使われているのは間違いないことかと思います。

llSay、llWhisper、llShout、llResonSay、llOwnerSayを使っている個所を探して、該当行を削除するか、行頭に//を付けてコメントアウトしてみてください。
Posted by Miz at 2008年01月04日 14:26
いつも勉強させていただいております。
ここで紹介していただいているスクリプトを装備アイテムに入れてみました。
作成者(自分)で装備した場合は問題ないのですが、このアイテムを他人に渡してその人が装備後アイテムにタッチした場合、アニメはスタートするのですが、もう一度タッチしてもアニメが止まりません。
何が問題なのでしょうか。
お手数お掛けしますが、よろしくお願いします。
Posted by 三角 at 2008年07月09日 21:02
三角さんと同じ状態で、他の人に渡して装着してもらったアイテムでは、
タッチしてもアニメが止まりません。
じっくりスクリプトを見ても原因がよくわかりませんでした。

よろしければ、回答お願いします。
Posted by yam at 2009年04月29日 02:27
お手数お掛けしますが、よろしくお願いします。
Posted by christian louboutin bridal shoes at 2011年06月17日 17:02
contentsのsolopserverをrisetしてもなおりません
使うこと自体問題ないんですが、とめる方法わかったら。おせーてください^^
Posted by Cheap Prices Jordans at 2011年07月02日 14:57
智慧的分享!
Posted by Margie at 2013年09月04日 20:02
 
<ご注意>
書き込まれた内容は公開され、ブログの持ち主だけが削除できます。