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

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

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

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

Unity

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

Blender

Blenderとは、オープンソースの3DCGソフトウェアです。フリーでありながら、3Dモデル作成、レンダリング、アニメーション、コンポジットなどのハイエンドに匹敵する高い機能を持ち、さらにゲームエンジンも搭載しています。

Q&A

解決済

1回答

2291閲覧

UnityのAnimatorControllerが難しい...

nattyu

総合スコア4

C#

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

Unity

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

Blender

Blenderとは、オープンソースの3DCGソフトウェアです。フリーでありながら、3Dモデル作成、レンダリング、アニメーション、コンポジットなどのハイエンドに匹敵する高い機能を持ち、さらにゲームエンジンも搭載しています。

0グッド

0クリップ

投稿2020/07/04 12:50

UnityのAnimatorControllerで困っています。

現在高校で数学の教員をやっている初心者プログラマーです。
Unityで3Dの数学ゲームを作成していて、Blenderで3Dキャラを作成してUnityで動かそうと思ったのですが、AnimatorControllerの扱いが調べてもよくわからなかったので質問します。

発生している問題

ゲームを開始したらRunアニメーションがTrueで、問題の正誤によってhappy、damageアニメーションがそれぞれTrueになり、3問不正解するとWaitアニメーションがTrueになるという仕様にしたいのですが、ずっとWaitがTrueになってしまっています。
AnimatorControllerの遷移図は以下の通りです。
イメージ説明

ゲーム画面はこんな感じです。
イメージ説明

キャラクターのソースコード

作成したキャラクターを動かすためのコードは以下の通りです。

C#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4using TMPro; 5using UnityEngine.UI; 6 7public class PlayerController : MonoBehaviour 8{ 9 public List<GameObject> Answers = new List<GameObject>(); 10 List<GameObject> GeneratedAnswersList = new List<GameObject>(); 11 List<string> Question = new List<string>(); 12 13 public GameObject explosion; 14 15 public Button BtnRight; 16 public Button BtnLeft; 17 public GameObject[] Lifes; 18 public Text ScoreText; 19 20 const int MinLane = -1; 21 const int MaxLane = 1; 22 const float LaneWidth = 4.0f; 23 const int DefLife = 3; 24 const float StunDur = 0.5f; 25 26 CharacterController controller; 27 Animator animator; 28 29 Vector3 moveDirection = Vector3.zero; 30 int targetLane; 31 int life = DefLife; 32 float recTime = 0.0f; 33 34 public float gravity; 35 public float speedZ; 36 public float speedX; 37 public float speedJump; 38 public float accelerationZ; 39 40 public Text Ques; 41 42 string[] ad; 43 string[] ques; 44 45 int crr; 46 int score = 0; 47 48 public AudioClip crrSound; 49 public AudioClip misSound; 50 AudioSource AS; 51 52 public int Life() 53 { 54 return life; 55 } 56 57 bool IsStun() 58 { 59 return recTime > 0.0f || life <= 0; 60 } 61 62 void Start() 63 { 64 controller = GetComponent<CharacterController>(); 65 animator = GetComponent<Animator>(); 66 67 CsvLoad(); 68 69 Instantiate(Answers[0], transform.position + new Vector3(0.0f, 0.0f, 10.0f),Quaternion.identity); 70 71 Ques.text = ques[0]; 72 73 AS = GetComponent<AudioSource>(); 74 } 75 76 void Update() 77 { 78 if (Input.GetKeyDown("left")) GoLeft(); 79 if (Input.GetKeyDown("right")) GoRight(); 80 //if (Input.GetKeyDown("space")) Jump(); 81 82 if (IsStun()) 83 { 84 moveDirection.x = 0.0f; 85 moveDirection.z = 0.0f; 86 recTime -= Time.deltaTime; 87 } 88 else 89 { 90 float acceleratedZ = moveDirection.z + (accelerationZ * Time.deltaTime); 91 moveDirection.z = Mathf.Clamp(acceleratedZ, 0, speedZ); 92 93 float ratioX = (targetLane * LaneWidth - transform.position.x) / LaneWidth; 94 moveDirection.x = ratioX * speedX; 95 } 96 97 moveDirection.y -= gravity * Time.deltaTime; 98 99 Vector3 globalDirection = transform.TransformDirection(moveDirection); 100 controller.Move(globalDirection * Time.deltaTime); 101 102 if (controller.isGrounded) moveDirection.y = 0; 103 104 animator.SetBool("Run", moveDirection.z > 0.0f); 105 106 ScoreText.text = " Score : " + score + " pt"; 107 108 animator.SetBool("Wait", life <= 0); 109 } 110 111 void CsvLoad() 112 { 113 TextAsset adTextFile = Resources.Load("text/sample", typeof(TextAsset)) as TextAsset; 114 ad = adTextFile.text.Split("\n"[0]); 115 116 ques = new string[ad.Length]; 117 118 for (int i = 0; i < ad.Length; i++) 119 { 120 ques[i] = ad[i].Split(","[0])[0]; 121 Question.Add(ques[i]); 122 } 123 } 124 public void QuestionLoad() 125 { 126 int rnd = Random.Range(1, Answers.Count); 127 128 float zpos = transform.position.z; 129 130 string question = Question[rnd]; 131 Ques.text = question; 132 133 GameObject GenerateAnswer = Answers[rnd]; 134 GeneratedAnswersList.Add(GenerateAnswer); 135 136 Instantiate(GenerateAnswer, new Vector3(0.0f, 0.0f, zpos + 10.0f), Quaternion.identity); 137 Answers.RemoveAt(rnd); 138 Question.RemoveAt(rnd); 139 } 140 141 public void GoLeft() 142 { 143 if (IsStun()) return; 144 if (controller.isGrounded && targetLane > MinLane) targetLane--; 145 } 146 147 public void GoRight() 148 { 149 if (IsStun()) return; 150 if (controller.isGrounded && targetLane < MaxLane) targetLane++; 151 } 152 153 /*public void Jump() 154 { 155 if (IsStun()) return; 156 if (controller.isGrounded) 157 { 158 moveDirection.y = speedJump; 159 160 animator.SetTrigger("jump"); 161 } 162 }*/ 163 164 void OnTriggerEnter(Collider other) 165 { 166 QuestionLoad(); 167 168 if (IsStun()) return; 169 170 if (other.gameObject.tag == "mistake") 171 { 172 AS.PlayOneShot(misSound); 173 if (score < 5) score = 0; 174 else score -= 5; 175 life--; 176 Lifes[life].SetActive(false); 177 recTime = StunDur; 178 Instantiate(explosion, this.transform.position, Quaternion.identity); 179 Destroy(other.gameObject); 180 DestroyBombs(); 181 animator.SetTrigger("damage"); 182 } 183 else if (other.gameObject.tag == "answer") 184 { 185 AS.PlayOneShot(crrSound); 186 score += 10; 187 crr++; 188 if (crr % 5 == 0 && crr > 0) speedZ += 1.0f; 189 animator.SetTrigger("happy"); 190 } 191 } 192 193 void DestroyBombs() 194 { 195 Destroy(GameObject.FindGameObjectWithTag("explode"), 0.5f); 196 Destroy(GameObject.Find("explosion(Clone)"), 0.5f); 197 } 198}

補足情報

Unity2019.3.9f1
Blender2.8
Microsoft Visual Studio

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

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

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

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

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

guest

回答1

0

ベストアンサー

その通りで、Animator Controller は難しいです。遷移図の設計とか最初はわけわかりません。

なので最初は Transition など消してしまって Animator.Play("State名") で直接「ステートに設定したアニメーション」を再生してしまいましょう。

アニメーションのブレンドとかがやりたくなったら、パラメータによる State Transition を勉強すればよいし、ブレンドがやりたくてもどうしても Animator Controller が難しいという場合は SimpleAnimation を使えばよいです。

趣味とか、ただ動くものが作りたいだけならそれで充分だと思います。

投稿2020/07/04 13:57

bboydaisuke

総合スコア5308

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

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

nattyu

2020/07/04 14:30

ご回答ありがとうございます! Animatorのすべての部分をAnimator.Playに変更したところ、上手くいきました! しかし、happyアニメーションが一瞬で終わってしまうのですが、何か改善策はありますでしょうか?
bboydaisuke

2020/07/04 14:41

それは happy アニメーション、正しく言うならば happy ステートの Motion に割り当てているアニメーションが一瞬だからです。いろいろ解決方法はあるのですが、それは状況とやりたい事によって何通りも考えられます。 とりあえず State の Speed を小さくしたらどうでしょう。もしくはそのアニメーションを編集して長くするとか、もしくはずっと繰り返していて欲しいならアニメーションの Loop Time にチェックを入れればよいでしょう。
nattyu

2020/07/04 15:01

・アニメーションの長さは問題ありませんでした。 ・Speedを1から0.1にしてみましたが変化はありませんでした。 ・元はTriggerの設定にするつもりだったので、ループさせる必要はないです。 何度も申し訳ありませんが、何か手立てはないでしょうか?
bboydaisuke

2020/07/04 16:11

「問題ありませんでした」ってそのアニメーションの長さは実際何フレームなんですか? 実行中にAnimatorコンポーネントが追加されたオブジェクトを選択した状態にしてAnimatorウインドウを見ていれば、どのステートが再生されているかが見えるのでそれを見てトラブルシュートしてください。 そろそろ「情報不足の中で回答する限界」に来ているし、あれはどうなってるのか、これはどうなっているのかと手取り足取り回答するのも大変なので、一回自分で調べて「期待する挙動」と「実際の挙動」、それから「期待する挙動を期待した根拠」を並べて新しい質問を作った方がよいでしょう。
nattyu

2020/07/05 02:41

アニメーションの長さは20フレームで、編集画面などでは正常に動いてました。 すみません。何度もありがとうございました。 もう少し調べてみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問