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
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/07/04 14:30
2020/07/04 14:41
2020/07/04 15:01
2020/07/04 16:11
2020/07/05 02:41