講義メモ ・p.070「Chapter 2のためのゲームオブジェクトの追加」から p.070 空のゲームオブジェクトを追加する ・「create」をクリック ⇒ 左上の「+」をクリック p.072 比較演算子 ・p.69の例に登場した「age < 20」の「<」は2項<演算子といい、左辺が所定の比較方法により右辺より小さいとなる場合にtrueを、でなければfalseを返すもので比較演算子(関係演算子)の一つ ・比較演算子(関係演算子)は2項<(小なり),>(大なり),<=(以下),>=(以上),==(等価),!=(非等価)演算子の6種。 ・「<=」「>=」「!=」は「=」が右側。「==」を含めて間の空白は不可 ・比較演算子が返すbool値(true/false)をDebug.LogするとTrue/Falseとなる。 アレンジ演習:p.073 Chap2_3_1.cs ・Chap2_3_2.csも含めよう ・2項<=(以下),>=(以上),==(等価),!=(非等価)演算子も試そう(エラーも)  ⇒「< =」とすると「=は無効です」エラーになる  ⇒「=>」とすると「構文エラーです。','が必要です」になる  ⇒「=!」とすると左辺・右辺の値により異なるエラーになるので注意 作成例 using UnityEngine; public class chap2_3_1 : MonoBehaviour { void Start() { Debug.Log(4 < 5); //True Debug.Log(6 < 5); //False Debug.Log(4 <= 5); //True Debug.Log(4 >= 5); //False Debug.Log(4 == 5); //False Debug.Log(6 != 5); //True } } 補足:整数と実数の比較演算子による処理 ・整数と実数を比較演算子のオペランドにした場合、実数に揃えた結果で比較される ・例えば、整数5と実数5.0は厳密には等しくないが、整数5を実数5.0にしてから比較するので等価になる ・整数型、実数型などで型が異なる変数の場合も基本的に同様 アレンジ演習:p.073 Chap2_3_1.cs:つづき ・各種の整数型、実数型、文字型、論理型の変数を交えて、比較可能か確認しよう  ⇒整数型、実数型、文字型の混在による比較は可能(型を揃えてから行われる)。   ただし、文字型と整数型・実数型の比較は文字コードによって行われる   よって、文字'4'と整数4は等しくない。   論理型と、論理型以外の型の混在による比較は文法エラーになる。 作成例 using UnityEngine; public class chap2_3_1 : MonoBehaviour { void Start() { Debug.Log(4 < 5); //True Debug.Log(6 < 5); //False Debug.Log(4 <= 5); //True Debug.Log(4 >= 5); //False Debug.Log(4 == 5); //False Debug.Log(6 != 5); //True int i = 5; uint u = 5U; float f = 5.0f; double d = 5.0; char c = '5'; Debug.Log("5 == 5U : " + (i == u)); //True(longで比較) Debug.Log("5 == 5.0F : " + (i == f)); //True(floatで比較) Debug.Log("5 == 5.0 : " + (i == d)); //True(doubleで比較) Debug.Log("5 == '5' : " + (i == c)); //False(文字コードをintで比較) Debug.Log("65 == 'A' : " + (65 == 'A')); //True(同上,'A'はコード65) bool b = false; //Debug.Log("5 == false : " + (i == b)); //文法エラー //Debug.Log("'5'== false : " + (c == b)); //文法エラー } } p.074 パブリック変数を組み合わせてみよう ・変数値をパブリック変数で与えることで、比較結果が変わることを確認できる アレンジ演習:p.074 Chap2_3_3.cs ・実数値や文字もパブリック変数で与えて、これらを用いる比較演算を行い、動作を確認しよう 作成例 //アレンジ演習:p.074 Chap2_3_3.cs using UnityEngine; public class chap2_3_3 : MonoBehaviour { public int age; public double aged; public char agec; void Start() { Debug.Log(age < 20); //整数比較 Debug.Log(aged < 20); //20.0にして実数比較 Debug.Log(agec < 20); //文字コードで比較 } } p.075 文字列を比較する ・文字列どうしの等価比較(==、!=)は文字列として全く同じかどうかの比較になる ・大文字小文字、1バイト文字2バイト文字は別の文字として扱われる p.075 mini075.cs 文字列を比較する ・文字列どうしの大小比較がどうなるか試そう ⇒文法エラーになる ・文字列型と他の型との比較演算ができるかどうか試そう ⇒文法エラーになる 作成例 using UnityEngine; public class mini075 : MonoBehaviour { void Start() { Debug.Log("apple" == "apple"); //True Debug.Log("apple" == "orange"); //False Debug.Log("apple" != "apple"); //False Debug.Log("apple" != "orange"); //True //Debug.Log("apple" < "orange"); //文法エラーになる //Debug.Log("apple" == 0); //文法エラーになる //Debug.Log("apple" == 'a'); //文法エラーになる } } 補足: 比較の左辺と右辺の使い分けについて ・変数とリテラルを比較する場合「変数 演算子 リテラル」でも「リテラル 演算子 変数」でも問題ない ・しかし、チームルールによっては「変数 演算子 リテラル」とすることを推奨している場合がある  例:「6 < a」は「a > 6」にする ・なお、複数の比較演算子の連続記述はエラーになる  例:「6 < a < 10」//文法エラー ・ちなみに「6 == a == true」であれば先に「6 == a」が評価されてbool値が返るのでエラーにならない p.076 if文 ・条件に応じて実行内容を変更できるのが分岐構文で、最も代表的な分岐構文がif文。 ・書式例: if(bool型の式){式がtrueの場合に実行する文; …} ・bool型の式として、比較演算子の式を用いると「●が■なら▲する」という構文を記述しやすい ・例: if (a > 0) { Debug.Log("aは正の数"); } ・ifの{}をブロック(ifブロック)といい、通常、内容をインデントして対象範囲をわかりやすくする(VSでは自動的に行われる) ・テキストでは「Tabキーを押して」とあるが、複数個のスペースでも良く、チームルールが決められていることもある。 アレンジ演習:p.077 Chap2_4_1 ・「●歳は未成年」というように、ageの値も表示しよう 作成例 using UnityEngine; public class Chap2_4_1 : MonoBehaviour { public int age; void Start() { if (age < 20) { //ageの値が20未満? Debug.Log(age + "歳は未成年"); //表示 } //ageの値が20以上ならばなにも表示しない } } p.078 ブロック内で複数の処理を行う ・ブロック内で複数の処理を行うことができる ・なお、ブロック内が1文であれば{}を省略できるが、推奨されない場合もある  ※if文の対象範囲がわかりづらくなり、保守性が下がる懸念があるため アレンジ演習:p.077 Chap2_4_1⇒Chap2_4_2 ・未成年であれば、成年まであと何年かも表示しよう ・例: 「19歳は」 「未成年」 「成年まであと1年」 作成例 using UnityEngine; public class Chap2_4_1 : MonoBehaviour { public int age; void Start() { if (age < 20) { //ageの値が20未満? Debug.Log(age + "歳は"); //表示 Debug.Log("未成年"); //表示 Debug.Log("成年まであと" + (20 - age) + "年"); //【追加】 } //ageの値が20以上ならばなにも表示しない } } p.079 ブロックとフローチャート:分岐からの合流 ・分岐構造のポイントは入口も出口も1つずつであり、どう分岐しても必要な処理を終えたら合流する  ※まれに合流せずに終了する場合もあるが、本来の形ではない アレンジ演習:p.077 Chap2_4_1⇒Chap2_4_2 つづき ・p.079の通りブロックの外で「ブロック外だよ」を表示しよう ・すると、未成年の場合もそうではない場合も「ブロック外だよ」が表示されることを確認しよう 作成例 using UnityEngine; public class Chap2_4_1 : MonoBehaviour { public int age; void Start() { if (age < 20) { //ageの値が20未満? Debug.Log(age + "歳は"); //表示 Debug.Log("未成年"); //表示 Debug.Log("成年まであと" + (20 - age) + "年"); //【追加】 } Debug.Log("ブロック外だよ"); //常に表示される } } p.080 else文 ・1つのifには1つだけelseとそのブロックを追記して「●が■なら▲する、でなければ▼する」という構文を記述できる ・elseも対象が1文のみであれば{}を省略できるが、推奨されないことがある。  ※ ifの{}があるときに、elseの{}を省略するのは避けた方が良い。 ・対応するifがないelseは文法エラーになる アレンジ演習:p.081 Chap2_5_1 ・未成年であれば「成年まであと何年」を表示しよう ・成年であれば、「成年からもう何年」も表示しよう 作成例 using UnityEngine; public class Chap2_5_1 : MonoBehaviour { public int age; void Start() { if (age < 20) { //ageの値が20未満? Debug.Log("未成年"); //表示 Debug.Log("成年まであと" + (20 - age) + "年"); } else { Debug.Log("成人"); //表示 Debug.Log("成年からもう" + (age - 20) + "年"); } } } p.84 else-if文 ・if文にelse-ifを書き加えることで「●が■なら▲する、ではなく▼ならば★する」という構文を記述できる  例:if(a < 20) { Debug.Log("未成年"); }    else if(a > 60) { Debug.Log("高齢者"); } ・else-ifは複数記述できる ・最後のelse-ifの後に1つだけelseブロックが記述できる ・これにより「上記のどれにも当てはまらない場合は☆する」という構文が可能 アレンジ演習:p.081 Chap2_6_1 ・未成年であれば「成年まであと何年」を表示しよう ・成年であれば、「成年からもう何年」も表示しよう ・高齢者であれば、上記は表示しなくて良い 作成例 using UnityEngine; public class Chap2_6_1 : MonoBehaviour { public int age; void Start() { if (age < 20) { //ageの値が20未満? Debug.Log("未成年"); //表示 Debug.Log("成年まであと" + (20 - age) + "年"); } else if (age < 65) { //ではなくて(20以上で)65未満? Debug.Log("成人"); //表示 Debug.Log("成年からもう" + (age - 20) + "年"); } else { //上記のどれもなければ(65以上?) Debug.Log("高齢者"); //表示 } } } p.84 else-if文:補足 ・同じ変数を比較に用いる場合などで、else-if構造にすると、分岐の順序によって実行されない部分ができてしまうことに注意を。 ・例えば、Chap2_6_1で「age < 20」と「age < 65」を逆にすると「未成年」が表示されなくなる ・VSでは可能な限り、このような問題点を指摘してくれるが、されないこともある アレンジ演習:p.081 Chap2_6_1:つづき ・ifの条件とelse-ifの条件、それぞれの実行内容を取り換えるとどうなるか確認しよう  ⇒文法エラー等にはならず警告も表示されないが、絶対に実行されない部分ができてしまう 作成例 using UnityEngine; public class Chap2_6_1 : MonoBehaviour { public int age; void Start() { if (age < 65) { //ageの値が20未満? Debug.Log("成人"); //表示 Debug.Log("成年からもう" + (age - 20) + "年"); } else if (age < 20) { //ではなくて(20以上で)65未満? ←無意味 Debug.Log("未成年"); //表示 ←ageがどんな値でも実行されない Debug.Log("成年まであと" + (20 - age) + "年"); //←同上 } else { //上記のどれもなければ(65以上?) Debug.Log("高齢者"); //表示 } } } 提出:アレンジ演習:p.081 Chap2_6_1:つづき② ・上記の変更を元に戻してから、ageが負の数であれば「負の数は用いない」と表示する処理を追加しよう 次回予告:p.087「else if文をif文にすると」及び、if文のネストについての補足から