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

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

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

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

Unity

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

Q&A

解決済

1回答

642閲覧

アニメーションパラメーターの値をTimelineで制御したい

ag-isbl

総合スコア11

Unity3D

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

Unity

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

0グッド

0クリップ

投稿2023/09/10 12:43

実現したいこと

Animator ControllerのParameterの値をTimelineで記録し、再生できるようにする。

前提

モーションキャプチャーしたBVHデータをUnityに取り込み、Humanoidアバターを動かそうとしています。
モーションデータには指の動きが含まれないため、指のモーションをUnity内で合成しようと考えています。

発生している問題

https://tsgcpp.hateblo.jp/entry/2020/08/10/190502
この記事を参考に5本指の開閉を制御するBlendtreeを作成しましたが、それぞれの指のパラメーターをTimelineで制御する方法が分かりません。

試したこと

パラメーターをTimelineに記録する方法について調べましたが見つかりませんでした。
Timelineのオーバーライドトラックを使用して合成するなど別の手段を試しましたがうまく動きませんでした(2本以上の指を同時に閉じようとすると、片方のモーションがオーバーライドされて1本しか閉じられない)。

補足情報

Unityのバージョンは2021.3.22を使用しています。

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

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

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

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

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

guest

回答1

0

ベストアンサー

標準機能でそのようなものがあるか検索してみたものの、ちょっと見つかりませんでした。
代替案として、パラメーター設定役のオブジェクトを用意し、それに対してタイムラインによるコントロールを行うというのはどうでしょうか。

まず下準備として、ご提示の「【Unity】指のポーズをブレンドしてハンドジェスチャーを作ろう - すぎしーのXRと3DCG」に従って指の動きを作り、パラメーター操作で指が開閉する状態にしました(手抜きして右手しか作っておりません)。

図1

そして下記のようなスクリプトを用意し...

C#

1using UnityEngine; 2 3[ExecuteAlways] 4public class AnimatorFloatParameterController : MonoBehaviour 5{ 6 [SerializeField] private Animator target; 7 [SerializeField] private string parameter0; 8 [Range(0.0f, 1.0f)] public float value0; 9 [SerializeField] private string parameter1; 10 [Range(0.0f, 1.0f)] public float value1; 11 [SerializeField] private string parameter2; 12 [Range(0.0f, 1.0f)] public float value2; 13 [SerializeField] private string parameter3; 14 [Range(0.0f, 1.0f)] public float value3; 15 [SerializeField] private string parameter4; 16 [Range(0.0f, 1.0f)] public float value4; 17 18 private int hash0; 19 private int hash1; 20 private int hash2; 21 private int hash3; 22 private int hash4; 23 24 private void Update() 25 { 26 if (this.target == null) 27 { 28 return; 29 } 30 31 void SetFloat(int hash, float value) 32 { 33 if (hash != 0) 34 { 35 this.target.SetFloat(hash, value); 36 } 37 } 38 39 SetFloat(this.hash0, this.value0); 40 SetFloat(this.hash1, this.value1); 41 SetFloat(this.hash2, this.value2); 42 SetFloat(this.hash3, this.value3); 43 SetFloat(this.hash4, this.value4); 44 } 45 46 private void OnValidate() 47 { 48 int StringToHash(string parameter) => string.IsNullOrWhiteSpace(parameter) ? 0 : Animator.StringToHash(parameter); 49 50 this.hash0 = StringToHash(this.parameter0); 51 this.hash1 = StringToHash(this.parameter1); 52 this.hash2 = StringToHash(this.parameter2); 53 this.hash3 = StringToHash(this.parameter3); 54 this.hash4 = StringToHash(this.parameter4); 55 } 56}

シーン上に空のオブジェクトを作ってスクリプトをアタッチし、Targetにはユニティちゃんを、Parameter 0~4には指開閉プロパティの名前を入力しました。

図2

タイムライン実行役としてもう一つシーン上に空オブジェクトを作り、タイムライン上にパラメーター設定役オブジェクトについてのアニメーショントラックを作成し、「Record basic animation | Timeline | 1.8.5 」の無限クリップによる方法でモーションを設定しました。

図3

ゲームを実行し、タイムラインを再生したところ設定されたモーションに従って指が開閉しました。

図4

投稿2023/09/14 21:53

Bongo

総合スコア10809

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

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

ag-isbl

2023/09/15 13:27

この方法で無事にコントロールすることができました。 分かりやすく画像も交えて説明していただき、大変助かりました。 本当にありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.39%

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

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

質問する

関連した質問