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

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

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

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

Q&A

解決済

1回答

2438閲覧

Unity Animatorの同期

HiruLow

総合スコア55

Unity3D

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

0グッド

0クリップ

投稿2018/05/10 04:19

Animatorコンポーネントの動きを他のオブジェクトで同期させたいです。

キャラクターAとBが有ったとし、それぞれAnimatorコンポーネントが付いている場合、それぞれを同期して動かすようなイメージです。

単純に、スクリプトからマウスやキーボード操作を取得しAnimatorに値を流し込むだけでしたらそれぞれのキャラクターA、Bに同じスクリプトを付けてあげるだけで問題有りませんが、どうしても同じスクリプトを取り付けられないケースになってしまい、なんとかAnimatorを同期する処理が無いか探しています。


構造としましては
Input処理

キャラクターAのAnimatorに適応

キャラクターAのAnimatorの動きをキャラクターBに同期


ちなみに、キャラクターAとBは同じアニメーションcontrollerを持ち、同様のクリップを持っています。
アバターは違います。



そもそもなぜこのような処理が必要かと言いますと
キャラクターをAssetStoreで購入し、衣装が1つでは寂しいのでキャラクターに着せ替え機能を付けたく思っておりました。
運よくそのキャラクターのモデル(裸)は同じで衣装のみが違うモデルがダウンロードできたので、そちらで代用しようと思っていた矢先、それぞれのボーン構造は少しづつ違っており、ボーンを再度重み付けするとなると結構な時間がかかってしまいます。しかし、モデルリグは同じHumanoidなので同じアニメーションコントローラでしたら問題なく動作します。
Playerを制御するスクリプトを各衣装毎に設置してしまってはInputされる値が変動してしまいますし、Animatorを複数取り付けるとなると、スクリプトだけでなくプラグインを全体的に修正する必要が有り、あまり利口な方法ではありません。

そこで今回の質問をさせていただいています。

AnimationPlayableOutput等、色々と使えそうな関数はあるのですが、ぴったりの処理が無く困っています。

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

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

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

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

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

sakura_hana

2018/05/10 05:06

「どうしても同じスクリプトを取り付けられない」「Playerを制御するスクリプトを各衣装毎に設置してしまってはInputされる値が変動してしまいます」の理由が分かりません。同じスクリプト、同じAnimator、同じクリップが付いているなら、同じ入力から同じモーションが再生されると思うのですが。
HiruLow

2018/05/10 09:09

【同じスクリプト、同じAnimator、同じクリップが付いているなら、同じ入力から同じモーションが再生されると思うのですが。】これは同じスクリプトを付けた場合の話でしょうか? 仮にプレイヤーの動きを制御するスクリプトが有った場合、なにかしらのInput処理でほかのイベントを開始させる動作はよくやると思います。(マウスクリックで弾を発射等)このようなスクリプトを同期させたいAnimator毎に設置したら各スクリプト毎にそれらインプット処理を制御しなくてはなりません。質問文後半にあるように、自分で書いた処理だけならまだいいのですが、Animatorと連動するほとんどのプラグインはAnimatorが一つの想定で書いてあります、なので他プラグインと連動させるとなると、各プラグイン毎に処理を書かなくてはならないためあまり利口ではありません
HiruLow

2018/05/10 09:10

そこでAnimator同士をリンクさせてしまえば一番スマートで拡張性の有る実装かと思いこのような質問をさせていただきました。
guest

回答1

0

ベストアンサー

C#

1void Update() { 2 //「0」はレイヤーID、「0.5f」は遷移時間 3 myAnimator.CrossFade (originalAnimator.GetCurrentAnimatorStateInfo(0).shortNameHash, 0.5f); 4}

一応こんな感じで直接ステート遷移出来るようなのですが、未検証です。
恐らく1フレーム遅れる、遷移時間との同調が取れるか怪しい、実際に使う際は「現在そのステートに入っていないこと」という条件分岐が必要かもです。


「質問への追記・修正の依頼」を見ましたがやっぱり意味が分かりません。
同じスクリプトを付け、自分のAnimatorへの参照を張っておけば如何なる入力があろうと同じ動きをするはずだからです(入力に対しては)。

C#

1public class Test : MonoBehaviour { 2 //自分のアニメーター 3 private Animator myAnimator; 4 5 // Use this for initialization 6 void Start () { 7 myAnimator = GetComponent<Animator> (); 8 } 9 10 // Update is called once per frame 11 void Update () { 12 if (Input.GetMouseButtonDown (0)) { 13 myAnimator.SetTrigger ("パラメータ名"); 14 } 15 } 16}

例えば以下のスクリプトを(SetTrigger ("パラメータ名")を自分のAnimatorに合致するようにして)2つのキャラクターに付けて動かしてみてください。

・キャラクターAのオブジェクト:Animator(キャラクターAのAvatarが付いている)+Text.cs
・キャラクターBのオブジェクト:Animator(キャラクターBのAvatarが付いている)+Text.cs
(両者のAnimatorについて、AnimationControllerは共通の物をセットする)

これでどちらもマウスクリック時に同じ動きをするはずです。

「プラグイン」が何を使っているか知りませんが、大抵は同じような構成で動くはずです。
(「着替え差分」ということは2体が同時に表示される(=操作される)ことは無いと思うので、後は必要なタイミングでオブジェクトを入れ替えればいいだけだと思います)

投稿2018/05/10 12:58

sakura_hana

総合スコア11425

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

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

HiruLow

2018/05/10 13:29

とても参考になります。ありがとうございます。 追記に関しては、sakura_hana様のおっしゃるように、Trigger等の処理は同期するのですが、他の処理(Animatorとは別のシステム部分)との衝突が起こりやすい為とゆう意味です、説明不足でした。申し訳ありません。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問