C#
1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4using UnityEngine.AI; 5 6public class Human123 : MonoBehaviour 7{ 8 enum State 9 { 10 sleep, 11 gotoToilet, 12 washHand, 13 doNothing, 14 eat, 15 starveToDeath 16 } 17 18 enum DesireType 19 { 20 sleep, 21 eat, 22 toilet 23 } 24 25 class Desire 26 { 27 public DesireType type { get; private set; } 28 public float value; 29 30 public Desire(DesireType _type) 31 { 32 type = _type; 33 value = 0f; 34 } 35 36 class Desires 37 { 38 public List<Desire> desireList { get; private set; } = new List<Desire>(); 39 40 public Desire GetDesire(DesireType type) 41 { 42 foreach (Desire desire in desireList) 43 { 44 if (desire.type == type) 45 { 46 return desire; 47 } 48 } 49 50 return null; 51 52 } 53 54 55 56 public void SortDesire() 57 { 58 desireList.Sort((desire1, desire2) => desire2.value.CompareTo(desire1.value)); 59 } 60 61 62 63 public Desires() 64 { 65 int desireNum = System.Enum.GetNames(typeof(DesireType)).Length; 66 67 for (int i = 0; i < desireNum; i++) 68 { 69 DesireType type = (DesireType)System.Enum.ToObject(typeof(DesireType), i); 70 Desire newDesire = new Desire(type); 71 72 desireList.Add(newDesire); 73 } 74 } 75 } 76 77 Desires desires = new Desires(); 78 79 80 81 82 83 float sleepDisireUpSpeed = 15f; 84 float sleepDesireDownSpeed = 5f; 85 86 87 float toiletDesireUpSpeed = 8f; 88 float toiletTime = 2f;//トイレにかかる時間 89 90 float handBacteria = 0;//手の汚れ 0-1 トイレから出たら1になる 91 float handWashSpeed = 2f;//手を洗うスピード 92 93 94 float hungrySpeed = 10; 95 float eatspeed = 3; 96 97 State curretState = State.doNothing; 98 bool stateEnter = true; 99 100 void ChangeState(State newState) 101 { 102 curretState = newState; 103 stateEnter = true; 104 } 105 private void Update() 106 { 107 if (curretState != State.sleep) 108 { 109 desires.GetDesire(DesireType.sleep).value += Time.deltaTime / sleepDisireUpSpeed; 110 } 111 112 if (curretState != State.gotoToilet) 113 { 114 desires.GetDesire(DesireType.toilet).value += Time.deltaTime / toiletDesireUpSpeed; 115 } 116 117 if (curretState != State.eat) 118 { 119 desires.GetDesire(DesireType.eat).value += Time.deltaTime / hungrySpeed; 120 } 121 122 if (curretState != State.starveToDeath && desires.GetDesire(DesireType.eat).value >= 2.0f) 123 { 124 ChangeState(State.starveToDeath); 125 return; 126 } 127 128 129 130 131 132 switch (curretState) 133 { 134 case State.starveToDeath: 135 #region 136 if (stateEnter) 137 { 138 stateEnter = false; 139 Debug.Log("死んだ"); 140 } 141 #endregion 142 break; 143 144 case State.doNothing: 145 #region 146 if (stateEnter) 147 { 148 stateEnter = false; 149 Debug.Log("暇だなnanananananaー"); 150 } 151 152 desires.SortDesire(); 153 if (desires.desireList[0].value >= 1) 154 { 155 Desire desire = desires.desireList[0]; 156 switch (desire.type) 157 { 158 case DesireType.eat: 159 ChangeState(State.eat); 160 return; 161 case DesireType.sleep: 162 ChangeState(State.sleep); 163 return; 164 case DesireType.toilet: 165 ChangeState(State.gotoToilet); 166 return; 167 } 168 169 170 171 } 172 #endregion 173 break; 174 175 176 177 case State.eat: 178 #region 179 if (stateEnter) 180 { 181 stateEnter = false; 182 Debug.Log("腹減ったから、飯を食おう"); 183 184 } 185 186 desires.GetDesire(DesireType.eat).value -= Time.deltaTime / eatspeed; 187 188 if (desires.GetDesire(DesireType.eat).value <= 0) 189 { 190 desires.SortDesire(); 191 if (desires.desireList[0].value >= 1) 192 { 193 Desire desire = desires.desireList[0]; 194 switch (desire.type) 195 { 196 case DesireType.eat: 197 ChangeState(State.eat); 198 return; 199 case DesireType.sleep: 200 ChangeState(State.sleep); 201 return; 202 case DesireType.toilet: 203 ChangeState(State.gotoToilet); 204 return; 205 206 } 207 } 208 ChangeState(State.doNothing); 209 } 210 #endregion 211 break; 212 213 214 215 216 217 218 case State.gotoToilet: 219 #region 220 if (stateEnter) 221 { 222 stateEnter = false; 223 Debug.Log("トイレなうー"); 224 handBacteria += 1; 225 desires.GetDesire(DesireType.toilet).value = 1; 226 } 227 228 229 desires.GetDesire(DesireType.toilet).value -= Time.deltaTime / toiletTime; 230 231 if (desires.GetDesire(DesireType.toilet).value <= 0) 232 { 233 ChangeState(State.washHand); 234 return; 235 } 236 #endregion 237 break; 238 239 240 241 case State.washHand: 242 #region 243 if (stateEnter) 244 { 245 stateEnter = false; 246 Debug.Log("すっきりした 手を洗おう"); 247 248 } 249 250 handBacteria -= Time.deltaTime / handWashSpeed; 251 252 if (handBacteria <= 0) 253 { 254 desires.SortDesire(); 255 if (desires.desireList[0].value >= 1) 256 { 257 Desire desire = desires.desireList[0]; 258 switch (desire.type) 259 { 260 case DesireType.eat: 261 ChangeState(State.eat); 262 return; 263 case DesireType.sleep: 264 ChangeState(State.sleep); 265 return; 266 case DesireType.toilet: 267 ChangeState(State.gotoToilet); 268 return; 269 } 270 } 271 ChangeState(State.doNothing); 272 } 273 #endregion 274 break; 275 276 case State.sleep: 277 #region 278 if (stateEnter) 279 { 280 stateEnter = false; 281 Debug.Log("寝るかな"); 282 } 283 284 if(desires.GetDesire(DesireType.toilet).value >= 1.5f) 285 { 286 Debug.Log("トイレに行きたくなったから目覚めた"); 287 ChangeState(State.gotoToilet); 288 return; 289 } 290 291 desires.GetDesire(DesireType.sleep).value -= Time.deltaTime / sleepDesireDownSpeed; 292 293 if (desires.GetDesire(DesireType.toilet).value <= 0) 294 { 295 desires.SortDesire(); 296 if (desires.desireList[0].value >= 1) 297 { 298 Desire desire = desires.desireList[0]; 299 switch (desire.type) 300 { 301 case DesireType.eat: 302 ChangeState(State.eat); 303 return; 304 case DesireType.sleep: 305 ChangeState(State.sleep); 306 return; 307 case DesireType.toilet: 308 ChangeState(State.gotoToilet); 309 return; 310 } 311 } 312 ChangeState(State.doNothing); 313 } 314 #endregion 315 break; 316 } 317 318 } 319 320 321 322 } 323}
ChangeState()は正しく呼ばれていますか?
どうやって確認すればいいですか?
それこそデバッグを。
(デバッグを方法も知らずに動画だけを参考にプログラミングするのは危険)
デバッグのやり方を調べましたが、想像がつきにくいので、できればご教示いただけないでしょうか?
単に呼ばれているのかを調べるだけであれば、ChangeState()の中にブレークポイントを入れればよろしいかと。
(とはいえ、原因はYAmaGNZさんの回答に書かれている通りのような気もしてきましたが)
原因がYamagnzさんの言っている通りなら、何をすればいいんですか?
何度も質問してしまって申し訳ないです
デバッグしたいという意味であれば、同じようにUpdate()の中にブレークポイントを入れればよいです。
修正したいという意味であれば、Update()をDesireクラスの外に出す、もしくはDesireクラスの外にUpdate()を追加してDesireクラスの中のほうの関数を呼び出すといった具合でしょうか。
いずれにせよ、このくらいのことは自分で決めてやれるようにならないと、非常に厳しいとは思います。
近道をしようとして、こういうような行動をしているのですが、基礎的な部分をやってからの方が近道ですか?
本音を言ってすみませんが、現状だと本当にこのコードを理解しているのか、疑問に思っています(違ってたらすみません)。
全てを理解するのは無理ですが、意味も分からずコピペするだけだと、コードを管理する際などにそこで躓いてしまいます。
なので、大体のコードが読める程度の知識は必要になってきます。
また、勉強する際は出来るだけ自分で考えるようにしてみてください。
YAmaGNZさんの回答で原因が分かったはずなので、それをどうすればいいかは、ある程度の知識があって、考え方も分かっていれば、聞かなくてもある程度は出来るでしょう。
細かい単語の意味は(caseなど)、分かりませんがこの文が何をしているかというのは理解しているつもりです
この状態より、先に基礎を勉強したほうがいいですかね?
>デバッグのやり方を調べましたが、想像がつきにくいので、できればご教示いただけないでしょうか?
これを見たときの他者の印象は「調べてないし試してないんだね」です。ちょっと「調べてもわからないから質問してるんだよいいから教えろよ」という横暴な態度にもとれなくないです。
何を調べ何を試したか記載しないことには何も伝わらないのです。「調べた」だけで伝わる情報量はゼロです。
あと、基礎をそんなにやりたくないんですか?ショートカットなどありません。書いたとおりにしか動かないプログラミングにおいては基礎がほぼ全てです。やりたいことだけ追っててもできるようにはなりません。
いきなりフルマラソン走れる人はいないし、素振りもできないのにホームラン打てる人はいません。
> この状態より、先に基礎を勉強したほうがいいですかね?
何をやっていいのかすら分かっていないのですから、純粋に実力不足ですし、やはり基礎は必要ですよね。
何かを見てやりたいと思い立って気持ちだけが先行して中身が追いついてない人は多いです。
人のコードをコピペして継ぎ接ぎすれば動くものは出来るかも知れませんがそれは自分が作ったわけじゃないですしね。
teratailに質問者さんみたいに基礎をやることを拒否し続けて何年も入門できてない人は多く居ます。
しっかり時間取って基礎をやれば1年もあれば入門ぐらいは誰でも出来ます。