質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

Q&A

解決済

2回答

7169閲覧

AnimationControllerで指定したオブジェクトだけアニメーションさせたい

silverman

総合スコア10

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

0グッド

2クリップ

投稿2017/08/05 07:30

編集2017/08/06 12:10

Unityアニメーションについての質問です。

一つのAnimationControllerを複数のオブジェクトで共有したいと考えています。
指定した一つのオブジェクトだけ再生を行いたいのですが、全てのオブジェクトで同時にアニメーションが再生されてしまいました。
以下のスクリプトを動かしたいオブジェクト全てに適用しています。

c#

1using UnityEngine; 2 3public class animation : MonoBehaviour { 4 5 // Use this for initialization 6 void Start () { 7 8 } 9 10 // Update is called once per frame 11 void Update () { 12 GetComponent<Animator>().Play("ステート名"); 13 } 14}

AnimatorControllerを共有した状態で、アニメーションをオブジェクト別に制御することはできるのでしょうか。

環境はUnity5.6、c#です。オブジェクトにはfbx、モーションにはvmdを使用し、mmd4mechanimを使いfbxに変換してAnimationControllerに取り込んでいます。
ご存知の方よろしければ回答お願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

fiveHundred

2017/08/05 08:02

ソースの記述が足りないです。 「GetComponent<Animator>().Play();」はどこに書いているのでしょうか? あと、「モーションにはvmd」とありますが、vmdは直接使えないですよね? MMD4Mecanimを使っているのでしょうか?
guest

回答2

0

コメントの通り、ソース1行ではなんとも言えませんので、推測ですが、
0. 1体目のGetComponent<Animator>().Play();によって、1体目のアニメーションが再生される。
0. 1体目のアニメーションが終わりまで再生される。
0. 2体目のGetComponent<Animator>().Play();によって、2体目のアニメーションが再生される。
0. 2体目のアニメーションが終わりまで再生される。
0. (以下省略)

と考えたのかもしれません。

しかし、GetComponent<Animator>().Play();はアニメーションの終わりまで待つという処理はありません。
よって、アニメーションの終わりになっているかどうかを検知してから、次のGetComponent<Animator>().Play();を実行する、といったことをする必要があります。

アニメーションの終わりになっているかどうかについては、以下のページが参考になると思います。
http://tsubakit1.hateblo.jp/entry/2016/02/11/021743


追記:
void Update()内に書かれた処理は、アタッチされた全てのオブジェクトごとに、毎フレーム実行されます。
よって、アタッチされた全てのオブジェクトで同時に再生されてしまうのは当たり前です。
正直、Update()内に直接書いている時点で、プログラミングをあまり理解していないとしか思えないです。
まずは基本的なことから、プログラミングを理解しましょう。

Animator.Play()を使って、アニメーションをオブジェクト別に制御することは出来ます。
制御の方法については、すごくざっくり言うと、「○○だったとき、Playする」といった感じです。
実装に必要な知識を挙げてみると、以下の通りです(過不足はあると思いますが)。
・if文(ものすごく当たり前ですが)
・「○○だったとき」の○○を取得する方法
・他のオブジェクトにあるComponentを取得・操作する方法


追記2:
解決済みとのことですが、少々問題になりそうな点があったので、追記します。

Update()内に直接書いている時点で~

と言いましたが、これは関数化するべきというわけではありません。
(明らかに誤解を招く表現で申し訳ないです…)
これは、「Animator.Play()は1回呼べば十分なのに、なぜUpdate()で毎回呼んでいるんだ…」ということです。
もし、仮にUpdate()に書くのであれば、このようにif文と組み合わせて書くべきでしょう

C#

1 void Update() { 2 if (再生したい条件) { 3 gameObject.GetComponent<Animator>().Play("ステート名"); 4 } 5 }

また、待機用と再生用の別々のAnimationControllerを用意するよりも、1つのAnimationControllerに待機用のStateと再生用のStateを用意するほうがよいです。
以下、サンプルソースとAnimationControllerの設定です。

C#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4 5public class AnimationPlayer : MonoBehaviour 6{ 7 bool alreadyPlaying = false; // 再生済みならtrue 8 9 void Update() 10 { 11 Animator animator = gameObject.GetComponent<Animator>(); 12 AnimatorStateInfo animInfo = animator.GetCurrentAnimatorStateInfo(0); 13 if (!alreadyPlaying) 14 { 15 if (!animator.GetBool("playFlag")) 16 { 17 animator.SetBool("playFlag", true); // 再生 18 } 19 else if (!(animInfo.normalizedTime < 1.0f)) 20 { 21 animator.SetBool("playFlag", false); //再生が終了し、待機状態に戻す 22 alreadyPlaying = true; 23 } 24 } 25 } 26}

AnimationController
全体

wait→play間の矢印
wait→play

play→wait間の矢印
play→wait

投稿2017/08/05 10:01

編集2017/08/07 10:35
fiveHundred

総合スコア9801

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

自己解決

質問文に具体性がなく分かりづらかったかもしれません。
少々強引ですが、以下の方法で実装することができました。

c#

1void Updata() 2{ 3 GameObject gameObject = GameObject.Find("アニメーションさせたいオブジェクト名"); 4 gameObject.GetComponent<Animator>().runtimeAnimatorController = (RuntimeAnimatorController)Instantiate(Resources.Load("AnimatorController")); 5 gameObject.GetComponent<Animator>().Play("ステート名"); 6 AnimatorStateInfo animInfo = animator.GetCurrentAnimatorStateInfo(0); 7 if (!(animInfo.normalizedTime < 1.0f)) 8 { 9 actor.GetComponent<Animator>().runtimeAnimatorController = RuntimeAnimatorController)Instantiate(Resources.Load("Wait")); 10 } 11}

初期状態を待機用のAnimationControllerに設定しておき、アニメーションさせたいときだけ切り替え、アニメーションの終了を検知したなら待機用のAnimationControllerに戻すことにしました。
当初の目的と若干ずれてしまった気もしますが、一応AnimationControllerを共有した状態で個別にアニメーションさせることができたので自己解決とさせていただきます。
fiveHundredさん、アドバイスありがとうございました。まずは関数化から始めてみようと思います。

投稿2017/08/07 05:02

silverman

総合スコア10

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

fiveHundred

2017/08/07 06:27

すいません。Update()内に直接書いている云々は、気にしないでください。提示のソースに「GetComponent<Animator>().Play("ステート名");」しか書かれてなかったので、単に驚いただけです。 ちゃんと理解しているのであれば、Update()に直接書いて大丈夫です。 (もちろん、適宜、関数分けすると見やすくなるのでいいと思いますが)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問