C#
1do{ 2 targetplayer = originallist[UnityEngine.Random.Range(0,originallist.Count)]; 3 debugcount++; 4 Debug.Log("targetplayer"+targetplayer.PlayerName+" attacker "+attacker.PlayerName); 5 Debug.Log(targetplayer.Team+""+targetplayer.isLive+" "+attacker.Team+attacker.isLive); 6 if(debugcount > 50){ 7 Debug.Log("無限ループ"); 8 break; 9 } 10}while((targetplayer.isLive == false) || (targetplayer.Team == attacker.Team))
do while文で上記のような条件式を書いたのですが、targetplayer.isLive == trueで且つtargetplayer.Team != attacker.Teamのような条件の時でもwhile文から抜けずループしてしまうことがあります。
条件式の書き方でおかしいところがあるでしょうか?。
分かりにくいですがdoの中身とデバックの結果を追記しました。
実際にそのような動作をしている決定的な場面を提示できますでしょうか。
ループ文の中でConsole.WriteLineとか(Debug.WriteLineでもいいけど)でその変数の値を出力しつづけ、確実にループを抜けるはずなのになかったと判断できるエビデンスが欲しいです。
変数の値と併せて
(targetplayer.isLive == false) と
(targetplayer.Team == attacker.Team)
の評価結果を出力した方がいいかも。
まぁ要するに「勘違いじゃない」という確認をどの程度しているのかわからんと、何とも言えない。
クッソわかりにくい…
targetplayer.isLive == true
targetplayer.Team == 1
attacker.Team == 2
の時に
((targetplayer.isLive == false) || (targetplayer.Team == attacker.Team))
を満たさないから抜けるはずが次のループへ進んでる、ということかな。
まぁそれなら確かにおかしい気はする。
bool b1 = !targetplayer.isLive;
bool b2 = (targetplayer.Team == attacker.Team)
として、ログにb1とb2の評価結果を個別に出し、
while (b1 || b2)
という条件にしたらどうですか?
分かりにくくて申し訳ありません。読んでいただきありがとうございます。
条件式の中身を個別に評価してみるんですね。やってみたいと思います。
もうひとつ、本当に抜けてないのか確認するためにループを抜けた場合に抜けたことがわかるようなログを出してみてほしいです。
回答2件
あなたの回答
tips
プレビュー