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

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

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

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

Unity3D

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

Unity

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

Q&A

解決済

1回答

1670閲覧

【Unity】AnimatorControllerのステート遷移で、意図しない遷移が発生してしまいます。

kosho206

総合スコア41

C#

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

Unity3D

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

Unity

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

0グッド

0クリップ

投稿2020/11/03 09:39

Unityで3Dゲームを作っています。

現在、この画像のようなステートがあります。
「GoldUnkoIdle」は、キャラクターの停止状態のアニメーションのステートです。
「GoldUnkoRun」は、キャラクターの走っている状態のアニメーションのステートです。
イメージ説明
このステート同士の遷移を、下記コードでパラメータを制御することで行っています。

if (MoveDiff == Vector3.zero) { Anim.SetTrigger("GoldUnkoIdle"); } if (MoveDiff != Vector3.zero) { Anim.SetTrigger("GoldUnkoRun"); }

2つのステートのTransitionのパラメータには、このコードに書いたパラメータがそれぞれ1つずつあるだけです。
キャラクターが止まっている時はIdleのアニメーションを再生し、走っている時はRunのアニメーションを再生させているのですが、この2つのアニメーション同士が遷移する時に問題が発生しました。

IdleからRunに遷移する時に、「Idle→Run→Idle→Run→Idle→Run」というように3往復ほどしてしまいます。
「Idle→Run」のように、普通に一回で遷移してほしいのですが、そうなりません。
この往復は、遷移が始まってから0.5秒間ほど発生します。
なので、停止状態から走る状態に遷移する時のアニメーションを見ると、なめらかに遷移せずにぎこちなくカクカクしてから遷移します。
逆にRunからIdleに遷移する時でも同じような現象が起こります。

このような現象が起こってしまう原因は何でしょうか?
もしかしたら、”IdelからRunに遷移した時点ではまだIdelのTriggerパラメータがtrueであり、そのせいでRun→Idleの遷移条件が満たされてしまい意図しない遷移が発生しているのかも”と考えたのですが、これを検証する方法がわかりません。
今回のようなステート同士がお互いに遷移できる形を使う場合は、Triggerパラメータではなくboolなど別のパラメータを使うしかないのですか?

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

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

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

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

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

sakura_hana

2020/11/04 02:30

このコード、どこで実行していますか? もしFixedUpdate内でやっている場合、Animator側の更新タイミングの問題でGoldUnkoIdleとGoldUnkoRunの両方が同時にtrueになる可能性があります。(理屈は「FixedUpdate Update 違い」などで調べてください) 完全に二者択一であれば、Triggerではなくboolにして「trueならRun、falseならIdle」などとした方がいいかもしれません。
kosho206

2020/11/04 09:32

ありがとうございます。 このコードはFixedUpadateではなく、Updateで実行しています。 Update() { switch(Hoge) { cese hoge { 質問投稿に載せたコード } } } のような書き方をしています。 この場合、ステート同士がなめらかに遷移しない原因は、別のコードかAnimatorControllerの設定に問題がある可能性が高いですか?
sakura_hana

2020/11/05 00:13

なるほど、「別のコードかAnimatorControllerの設定に問題がある」という可能性も確かにあります。 必要最低限のプロジェクト構成にして検証するか、とりあえず「TriggerではなくboolにしてtrueならRun、falseならIdle」を試す等してみてください。
kosho206

2020/11/06 08:59

ありがとうございます。 新しいプロジェクトで最小構成で試してみたところ、同じ現象がおきました。 引き続き原因を探ってみます。
kosho206

2020/11/07 02:03

できればコードが少なくて済むTriggerを使いたかったのですが、無理そうだったので諦めてBool型のパラメータを使うと今回のような症状はでなくなりました。 今回は回答ありがとうございました。
guest

回答1

0

自己解決

Triggerを使うのをやめてBool型のパラメータにしたら解決できました。
まだ確信はないのですが、Triggerを使った時に今回のような症状が起きた原因はこちらのサイト(https://marudice.hatenablog.jp/entry/2016/08/27/211243)
に書かれている
「実際にやってみると分かりますが、AnimatorのTriggerパラメーターは、Transitionが解決されるまでは値がOnのままになっているので、

Idle -> Idle(IdleのTriggerは使われずOnのまま) -> Run -> 即座にIdleに戻る」

のような事が起きているせいな気がします。

投稿2020/11/07 02:01

kosho206

総合スコア41

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.37%

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

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

質問する

関連した質問