講義メモ ・p.105「インクリメント演算子:補足(前置と後置の違い)」の後でp.106「メッセージの中に回数を入れる」に進みます アレンジ演習:p.105 Chap3_3_1 ・「ハロー」の表示回数(5)をパブリック変数で指定できるようにしよう 作成例 //アレンジ演習:p.105 Chap3_3_1 using UnityEngine; public class chap3_3_1 : MonoBehaviour { public int num = 5; //パブリック変数に void Start() { for (int cnt = 0; cnt < num; cnt++) { //num回繰り返す Debug.Log("ハロー"); } } } p.105 インクリメント演算子【再掲載】 ・複合代入演算子で1を足しこむ処理はカウントアップなどで多用されるので、専用の単項++演算子が提供されており、インクリメント演算子と言われる ・「変数 += 1」は「変数++」または「++変数」と記述できる ・for文のカウントアップのように、1を足しこむ処理を単独で行うのであれば「変数++」「++変数」のどちらでも良い p.105 インクリメント演算子:補足(前置と後置の違い) ・「++変数」を前置インクリメント、「変数++」を後置インクリメントといい、演算子の評価タイミングが異なる ・前置インクリメント「++変数」では「前もって+1し、した後の値が評価になる」 ・後置インクリメント「変数++」では「現在の値を評価とし、その後で+1する」 ・どちらを使うというルールを決めることはあまりなく、ニーズに合わせて使い分けると良いが、for文のカウントアップのように、1を足しこむ処理を単独で行う場合は、どちらかに決めておくことが多い(このテキストでは後置) ミニ演習 mini105a.cs ・変数numを5で初期化しておき、「++num」「num」「num++」「num」の順に出力することで、値の変化を確認しよう 作成例 using UnityEngine; public class mini105a : MonoBehaviour { void Start() { int num = 5; Debug.Log(++num); //6(+1してから値を返す) Debug.Log(num); //6(+1されている) Debug.Log(num++); //6(値を返してから+1する) Debug.Log(num); //7(+1されている) } } p.106 メッセージの中に回数を入れる ・for文の先頭で代入・初期化したカウント用の変数は、forブロックの中で利用可能 ・なお、for文の先頭で初期化したカウント用の変数の有効範囲は、forブロックの中だけになる ・こうすることで、for文を多数記述しても、カウント用の変数は同じ名前でかまわない(同名の異なる変数とみなされる) ・よって、カウント用の変数をforブロックの外(後方)でも用いたい場合は、for文の前であらかじめ宣言しておけばよい。 アレンジ演習:p.105 Chap3_3_2 ・forブロックの終わりの「}」の次の行として、cntの値を表示する処理を追記し、エラーになることを確認しよう ・それから、for文の前に、変数cntの宣言を挿入し、for文先頭の初期化を代入に変更して、エラーを解消しよう 作成例 //アレンジ演習:p.105 Chap3_3_2 using UnityEngine; public class Chap3_3_2 : MonoBehaviour { void Start() { int cnt; //【追加】forブロックの後でも利用できるように事前に宣言 for (cnt = 0; cnt < 5; cnt++) { //【変更】初期化ではなく代入して利用 Debug.Log(cnt + "回目のハロー!"); } Debug.Log("次は" + cnt + "回目のハロー!"); //【追加】forブロックの後でも利用できる } } p.108 逆順で繰り返す ・forによる繰り返しはインクリメントに限るものではない ・必要に応じて、デクリメントを用いてカウントダウンで繰り返すことも多い ・初期値の設定や、継続条件に注意して、無限ループにならないよう、注意しよう アレンジ演習:p.108 Chap3_4_1 ・Debug.Logの回数(5)をパブリック変数で指定できるようにしよう 作成例 using UnityEngine; public class Chap3_4_1 : MonoBehaviour{ public int num = 5; //【追加】 void Start() { for (int cnt = num; cnt > 0; cnt--) { //【変更】 Debug.Log(cnt + "回目のハロー!"); } } } ミニ演習 mini108a.cs ・for文で、2以上10以下の偶数を全て表示しよう ・この10をパブリック変数で指定できるようにしよう ・なお、1以下が指定されたら、なにも表示されないことも確認しよう 作成例 using UnityEngine; public class mini108a : MonoBehaviour{ public int num = 10; void Start() { for (int cnt = 2; cnt <= num; cnt += 2) { //2から10まで+2しつつ繰返す Debug.Log(cnt); } } } ミニ演習 mini108b.cs ・身長(m)をdouble型のパブリック変数で、体重(kg)の下限と上限をint型のパブリック変数で受け取り、1kg刻みでBMIを表示しよう ・BMIは体重(kg)÷身長(m)÷身長(m)で得られる ・できたら、何kg刻みで表示するかも、int型のパブリック変数で受け取るようにしよう 作成例 using UnityEngine; public class mini108b : MonoBehaviour{ public double height = 1.7; [Header("体重何kgから何kgまで何kgごとに?")] public int from = 50; public int to = 60; public int each = 2; void Start() { for (int i = from; i <= to; i += each) { //form以上、to以下、eachごとに繰返す Debug.Log("体重" + i + "kgのBMIは" + i / height / height); } } } 補足:前判定繰り返しと後判定繰り返し ・繰り返しには繰返し条件の判断タイミングで、前判定と後判定がある ・while文とfor文は前判定であり、繰り返しの初回を行う前に継続条件を評価する ・よって、最初から継続条件がfalseになる場合、1度も実行しないので、そのような場合に便利  例:モンスターがいる間、戦う=いなければ1度も戦わない場合、事前にモンスターがいるかどうかの判断は不要になる ・しかし、繰り返しを行ってから続けるかどうか判断する場合に不便なので、後判定繰り返しの構文としてdo-while文も提供されている 補足:do-while文 ・唯一の後判定繰り返しの構文 ・書式: do { 繰り返し内容 } while(継続条件); //末尾にセミコロンが必要 ・p.101 chap3_2_1のように「●●した結果、●●になるまで繰返す」処理に向いている ・あるいは、動的に情報を得る処理で「適切な情報が得られるまで先に進まない」場合に便利 ・なお、この場合の継続条件は「適切ではない情報が得られている間」になる ミニ演習 mini108c.cs ・p.101 chap3_2_1をdo-while文で書き直そう 作成例 //ミニ演習 mini108c.cs :p.101 chap3_2_1をdo-while文で using UnityEngine; public class mini108c : MonoBehaviour { public int shikin = 30000; //パブリック変数で資金を const int unit = 5080; //単金を表す定数の定義 void Start() { do { //【変更】以下繰返し Debug.Log(shikin); shikin -= unit; //資金から単金を差し引く } while (shikin >= unit); //【変更】資金が単金以上ある間、繰り返す Debug.Log("終了時の資金は" + shikin); } } p.109 繰り返しからの脱出 ・繰り返しの終了は本来は継続条件がfalseになった時が望ましい ・しかし、例外的状況の発生や、継続条件が複雑な場合に、脱出用の文として、breakを利用できる ・switch文でも使われていたように、breakはブロック脱出文であり、while/for/doでも利用可能 ・なお、while(true)やfor(;;)で無限ループにしておき、なんらかの状況によりbreakで脱出するケースは(特にゲームでは)多い ・breakはいくつでも記述できるが、break直後に処理文があると絶対に実行されないので、文法エラーになる ・なお、breakにより、breakがある繰り返しブロックの末尾の「}」の後ろへジャンプするので、後続の処理が実行される(終了とは限らない) ・また、多重ループの場合、外側のループは継続される(後述) ミニ演習 mini109a.cs ・p.105 chap3_3_1で「ハロー」の表示回数(5)をパブリック変数で指定できるようにしよう ・ただし、6回目になったらbreakするようにしよう ・つまり、繰り返し回数を自由にする代わりに、リミッターを儲けたい場合にbreakは便利 ・また、forブロックの末尾の「}」の後に適当なDebug.Logを追記し、breakした場合にも実行されることを確認しよう 作成例 //ミニ演習 mini109a.cs :p.105 Chap3_3_1・改 using UnityEngine; public class mini109a : MonoBehaviour { public int num = 5; //パブリック変数で回数を指定 void Start() { for (int cnt = 0; cnt < num; cnt++) { //num回繰り返す Debug.Log(cnt + "回目のハロー!"); if (cnt >= 6) { //ただし6回以上になったら break; //脱出する } Debug.Log("次へ!"); //breakすると実行されない } Debug.Log("終了!"); //breakしても実行される } } p.109 繰り返しのスキップ:continue ・for/while/doの中で「continue;」を実行すると、実行中の繰り返しの後続部分をスキップして、続行できる ・つまり「今回は、ここまででOKなので、次へ行け」としたい場合に用いる ・よって、break;とは異なり、繰り返しは続行される ・主に、繰り返しの中に特殊パターンがあり、if文などでは表現しづらい場合に便利 ・あるいは、繰り返し内容が長く、ifなどのネストが深い場合に用いると読みやすくなることがある ミニ演習 mini109b.cs ・1から10まで下記を繰返す  ① 3の倍数ならば   ・「3の倍数」と表示   ・しかも、偶数ならばこれ以降はスキップする  ② カウンタの値を表示 作成例 using UnityEngine; public class mini109b : MonoBehaviour{ void Start() { for(int i = 1; i <= 10; i++) { if (i % 3 == 0) { //3の倍数? Debug.Log("3の倍数"); if (i % 2 == 0) { //しかも偶数? continue; //これ以降はスキップして次へ } } Debug.Log("カウンタは" + i); } } } ミニ演習 mini109c.cs:breakとcontinueの併用 ・string型のパブリック変数flgを定義して"y"で初期化しておく ・1から10まで下記を繰返す  ① 3の倍数ならば   ・flgが"y"であれば、スキップ(continue)する   ・flgが"y"以外であれば、繰り返しを脱出(break)する  ② カウンタの値を表示 ・表示した値の合計を表示 提出:ミニ演習 mini109c.cs:breakとcontinueの併用 次回予告:p.110「繰り返し文を2つ組み合わせる」から