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

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

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

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

Unity

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

Q&A

解決済

1回答

2436閲覧

【Unity】AnimatorControllerのParameter nameの取得方法はありますか?

PotePui

総合スコア69

C#

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

Unity

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

0グッド

0クリップ

投稿2021/07/13 03:49

前提・実現したいこと

イメージ説明

上図のような設定をしていたとして、
スクリプト上から、通常は

C#

1animator.SetTrigger("GetHit");

のように、Paramater Nameをそのまま記載しますが、
汎用性を高めるために、animatorのParamater Nameを取得できる方法はありますでしょうか?

具体的には、上図の例でいうと、
上から3つ目のDieではIndexが降られていて、

C#

1animator.GetParameterName(IndexNumber);

のようなものをご存知の方がいらっしゃれば教えてください。

しばらく経っても、お返事がなければ、今回の件は締め切りますね。
名前をそのまま文字列で設定しようと思います!

試したこと

ググったりしましたが、情報が出てこなくて、
質問に至りました。

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

Unity 3.13f1

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

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

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

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

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

guest

回答1

0

ベストアンサー

ご質問者さんもAnimatorに何かしらの手段が用意されているだろうと目星を付けていらっしゃったかと思うのですが、ここは単にググるよりも本家リファレンスにターゲットを絞った方がよかったかもしれませんね。
恥ずかしながら私も知らなかったため探してみたところ、どうやらparameterCountでパラメーターの数を取得、GetParameterでインデックスを指定してパラメーター情報を取得、parametersですべてのパラメーター情報を配列として取得できるようです。そして取得したパラメーター情報のnameがパラメーター名を表しているようですね。ご参考になりますでしょうか?

パラメーター番号をもとにパラメーターを設定する例

lang

1using System.Linq; 2using UnityEngine; 3 4[RequireComponent(typeof(Animator))] 5public class CharacterAnimationController : MonoBehaviour 6{ 7 Animator animator; 8 int[] parameterIds; 9 10 void Awake() 11 { 12 animator = GetComponent<Animator>(); 13 14 // あらかじめAnimatorからパラメーターを取得して配列にしておく 15 // さらに、高速化のためパラメーター名の代わりにパラメーターIDを使う 16 parameterIds = animator.parameters.Select(parameter => parameter.nameHash).ToArray(); 17 } 18 19 void Update() 20 { 21 // そして、ゲーム実行中にパラメーターを操作したい時にはparameterIdsから 22 // パラメーターIDを取得する 23 // たとえば下記の例では、3番目のパラメーター(Parametersの上から数えて4番目)を 24 // スペースキーを押したらtrue、離したらfalseにする 25 animator.SetBool(parameterIds[3], Input.GetKey(KeyCode.Space)); 26 } 27}

投稿2021/07/13 10:00

編集2021/07/15 21:09
Bongo

総合スコア10807

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

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

PotePui

2021/07/15 15:41 編集

お返事ありがとうございます! 公式やUnityCommunityも検索してみました。 ご指摘に近いのは、以下かなと思いました。 for文でここではLoopしてますが。 >> https://answers.unity.com/questions/494966/get-list-of-parameters-of-an-animatorcontroller.html 現在はnamespaceが使えなくなっているようで、公式も見てみましたが、以下のnamespaceで利用できるのかと思いきや、参照先が見つからないと出て??になってしまいました。 >> https://docs.unity3d.com/ja/2020.3/Manual/UpgradeGuide5-Animation.html 結論として、ご指摘いただいた方法に近い手順でParamater Nameは取得できるのだと思いますが、 僕がやりたかったのは、処理を重くしないでインデックスを単純に指定すればAnimatorControllerの Parameter Nameが取得できる方法があれば嬉しいということでした。 これが実現できれば文字列でParamater Nameを指定しないでも済むし、仮にParamater Nameを変更してもIndexさえ変更しなければ、Paramater名は同じになるからいいなと思ってのことです。 未だ色々な書籍等も見てもやっぱり文字列で指定しているので、ここは単純に文字列でParamater Nameを指定してあげることにします! スッキリしました。 ありがとうございます^^
Bongo

2021/07/15 21:10

ご参考になりましたようで幸いです。 ご質問者さんの意図を読み違えていたらすみませんが、スクリプトのソースコード上に直接パラメーター名を書きたくない、かつなるべく余計な負荷はかけたくない...となると、あらかじめアクセス用のIDを配列化しておくというのはどうでしょうか。例を回答に追記しました。 ただしあのようにパラメーター番号でアクセスする場合ですと、確かにパラメーター名を変更してもスクリプトの変更は不要になるでしょうが、パラメーターを追加してパラメーター番号がずれると対応関係が崩れてしまうでしょう。 一方、書籍で見かけるようなパラメーター名でのアクセスだと、パラメーターを後で追加してもスクリプトの変更が不要だという利点があるかと思います。それぞれ一長一短といった感じですかね...
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問