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

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

新規登録して質問してみよう
ただいま回答率
85.31%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Q&A

解決済

1回答

2279閲覧

Unityで装備に応じてモーションを入れ替える方法についてのアドバイスをいただきたいです

cushionA

総合スコア90

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

0グッド

0クリップ

投稿2022/02/05 19:48

編集2022/02/05 20:04

前提・実現したいこと

Unityで装備に応じて移動や攻撃、その他のモーションを入れ替えられるようにしたいです。
また仕様として左手の装備もあり、左手の装備のアニメも別途入れ替える必要があります。

考えている仕様について

・アニメーターコントローラーの入れ替えによるモーション変更。

最初は同一名の別モーションを入れたアニメーターコントローラーを入れ替えることによって、装備ごとのモーションをプレイヤーに適用しようかと思いました。
しかしこれはアニメーターコントローラーをランタイムで入れ替える方法が見つからなかったため断念しました。

・装備に応じてアニメーターコンポーネントをつけたゲームオブジェクトのプレハブを呼び出し、そのプレハブからアニメーターコンポーネントを獲得する方法。

さきほど記したアニメーターコントローラーの入れ替えに近い方法です。
装備ごとにモーションを格納したアニメーターを持たせたゲームオブジェクトをプレハブ化して保存します。
そして装備変更に応じてプレイヤーオブジェクトのルート下に呼び出し、そこからアニメーターコンポーネントを参照するといった形になります。
あるいはアニメーターのリストを保持しておいてそこから切り替えるというのも考えています。
現状最有力候補です。

・すべてのアニメーションをアニメーターに含んでおいて、装備ごとに固有の文字列を用いてアニメーション名と組み合わせることでplayする。
mecanimを使用しない方法です。
.play()メソッドによるアニメーション呼び出しの際、装備ごとに定めた文字列とアニメーション名の共通部分を組み合わせることで特定の装備のモーションを呼び出します。
しかしアニメーターにアニメーションをあまり多く入れるとエディターのメモリ使用率が跳ね上がり、嫌な予感がしたため取りやめました。

・同じアニメーターでアニメーションクリップを差し替える方法。
現状二番目の候補です。
一番目ではない理由は、武器によってはアニメーターの内部に固有のステートを作ったりする見通しがあるからです(たとえばある武器を持っていると二段ジャンプができたり)。
その場合ステートを削除したり追加したりする必要に迫られるため、その管理を個人的にあまりやりたくないと感じたというのは大きな理由です。
それから2個目の方法のほうが負荷が軽そうだというのも理由になります。

そして左手装備のアニメーションについてですが、私は3番目の方法の時以外のケースでなら一つ考えがあります。
それはいずれかの方法でアニメーターの内容を切り替えたあと、アニメーション(OneHandGuard、いわゆる片手ガード、左手の盾などでガードになる)の名前でステートを取得しその中身のみを装備に応じたアニメーションで差し替えるようなやり方です。

最後に

みなさんならどの方法で実装なさるのか、あるいは全く別の方法でより良い形で実装できるのか。
アドバイスをお聞かせ願えると幸いです。
よろしくお願いいたします。

補足情報(FW/ツールのバージョンなど)

Unity 2020.3.26f1
アニメーターのmecanimによるアニメーション遷移を使用しています。

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

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

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

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

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

guest

回答1

0

ベストアンサー

アニメーターコントローラーをランタイムで入れ替える方法が見つからなかった

Animator.runtimeAnimatorController を使って入れ替えます。

Animator.runtimeAnimatorController
https://docs.unity3d.com/2020.3/Documentation/ScriptReference/Animator-runtimeAnimatorController.html

その他の方法を検討するならば、まずは Unity Technologies が公開している SimpleAnimation を試してみるとよいと思います。もし SimpleAnimation の機能に不満や不備があると感じたら、それを改造するなり、SimpleAnimation を踏まえて新たなアニメーション管理システムを作るのがよいと思います。

投稿2022/02/06 04:36

bboydaisuke

総合スコア5339

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

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

cushionA

2022/02/06 07:44 編集

ご回答ありがとうございます。 不勉強につきAnimator.runtimeAnimatorControllerをAnimatorContorollerを取得するための変数だと勘違いしており、それ自体定義してランタイムで入れ替えられることを知りませんでした。 ご教授に感謝いたします。 最後にこの質問を見たほかのユーザーさんの参考になりそうな記事も添えて質問を閉じさせていただきます。 ありがとうございました。 大変助かりました。 nico様の「ロバメモ - 素人のUnity覚書と奮闘記」より2017-07-06の記事、アニメーションを切り替える(https://robamemo.hatenablog.com/entry/2017/07/06/114102)にて詳しい手順を見つけました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.31%

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

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

質問する

関連した質問