講義メモ ・p.058「メソッドとオブジェクト」 提出フォロー: ミニ演習 mini057.cs ・例:(int)'A' ⇒ 文字'A'の文字コードである65になる(10進数に変換される) ・例:(char)66 ⇒ 文字コード66である文字'B'になる ・上記を試して、結果を表示しよう ・また、文字コードを16進数(前に0xを付ける)で与えてみよう 作成例 using UnityEngine; public class mini057 : MonoBehaviour { void Start() { Debug.Log((int)'A'); //65(10進数)、16進数41 Debug.Log((char)66); //'B'(10進数66) Debug.Log((char)0x42); //'B'(16進数42) } } p.058 メソッドとオブジェクト:引数と戻り値 ・メソッド:0個以上の情報を受け取り、動作し、0または1個の情報を返す仕組みで、C言語などにおける関数(ファンクション)と同様のもの ・この「受け取る情報」を引数(パラメータ)、「返す情報」を戻り値(返却値)という ・なお、Debug.LogはUnityが提供しているメソッドで、引数には表示したい情報を指定する。戻り値は0個(無し)となっている。 ・Debug.Log(引数)となっている通り、メソッドの引数はカッコ内に記述し、2個以上の場合はカンマで区切る。 ・また、Unityが提供しているメソッドに平方根を計算してくれる Mathf.Sqrt()メソッドがあり、引数は単精度実数、戻り値も単精度実数(float型)。 ・メソッドの戻り値はそのまま表示や処理したり、式の一部として用いることが可能  例: 変数 = Mathf.Sqrt(16) + 1.0; //16の平方根4.0に1.0を加えた結果を変数に代入 ・最大値を返すMathf.Max()メソッドがあり、引数はint型またはfloat型で個数は可変、戻り値はint型またはfloat型。 ・Chap1_12_1では、int型の引数を4個与えて、int型の戻り値を得ている。 ・また、変数の初期化における初期値をメソッドの戻り値にすることもできるので、初期化においてメソッド内の処理を実行できる アレンジ演習:p.059 Chap1_12_1.cs ・上の例「変数 = Mathf.Sqrt(16) + 1.0;」を適切な変数型を指定して追記しよう。  ⇒ 1.0はdouble型なので、float型 + double型で、変数はdouble型にする ・また、この変数値を表示しよう。 作成例 using UnityEngine; public class Chap1_12_1 : MonoBehaviour { void Start() { int value = Mathf.Max(10, 40, 20, 30); //メソッドの戻り値で初期化 Debug.Log(value); //【以下追加】 double d = Mathf.Sqrt(16) + 1.0; //float型 + double型でdouble型になる Debug.Log(d + " 型は" + d.GetType()); //5 型はSystem.Double //【以下参考】 float f = Mathf.Sqrt(16) + 1.0f; //float型 + float型でfloat型になる Debug.Log(f + " 型は" + f.GetType()); //5 型はSystem.Single } } 補足:Unityが提供するメソッドの情報を得る方法 ・Unityのリファレンスでオフィシャル情報を得ることができるが、VSでも要約情報が得られる ・なお、入力中にもヒントが得られるが、未入力部分をVSが推測した結果になるので、望んでいない情報になることもある 補足:メソッドのオーバーロードについて ・Mathf.Sqrt()メソッドは引数、戻り値共にfloat型のみと定義されている ・しかし、C#などのオブジェクト指向言語ではオーバーロードが可能 ・オーバーロードとは「同じ名前のメソッドに型や個数&順序が異なる引数を与えると動作を変えられる」こと ・Mathf.Max()メソッドにはオーバーロードが4つ定義されている ①引数が2個のfloat型であれば単精度実数における最大値を得て、float型の戻り値として返す ②引数の型が全てfloat型であれば単精度実数における最大値を得て、float型の戻り値として返す ③引数が2個のint型であれば整数における最大値を得て、int型の戻り値として返す ④引数の型が全てint型であれば整数における最大値を得て、int型の戻り値として返す ・どれが呼び出されるかは呼び出し時の引数によって決まる ・今回の「Mathf.Max(10, 40, 20, 30)」では④が呼び出され、int型の戻り値40が返されたことがわかる。 ・なお、オーバーロードとして定義されているパターンにあてはまらない呼び出し方をすると文法エラーになる  例:Mathf.Max(10.1, 40.4, 20.2, 30.1); //double型なのでエラー  例:Mathf.Max(10.1, 40.4, 20.2, 30.1); //double型なのでエラー  例:Mathf.Max(10.1f, 40.4f, 20.2f, 30.1f); //float型なのでOK  例:Mathf.Max('A', 'B', 'a', 'b'); //char型はint型に暗黙変換できるのでOK  例:Mathf.Max(10, 10.1f); //10はint型だがfloat型に暗黙変換し、戻り値はfloat型 ・なお、プログラマが自前のメソッドを記述でき、オーバーロードを定義することも可能 ミニ演習 mini060.cs ・パブリック変数で4個の整数値(int型)を受け取り、最大値を表示しよう 作成例 using UnityEngine; public class mini060 : MonoBehaviour { public int a, b, c, d; //パブリック変数 void Start() {no Debug.Log(Mathf.Max(a, b, c, d)); //最大値を得て表示 } } 補足:自前のメソッド ・Unityのスクリプトでは、MonoBehaviourを継承しているクラスの中に自由にメソッドを記述できる ・そして、Start()メソッドやUpdate()メソッドの中から呼び出すことができる ・あるいは、自前のメソッドの中で自前のメソッドを呼び出すこともできる ・定義書式: 戻り値型 メソッド名(引数の型 引数名, …) {処理内容} ・なお、戻り値がない場合は戻り値型を「void」とする(無の意味) ・引数がない場合はカッコの中は不要だが、カッコは必要 ・例: void Greet() { Debug.Log("処理開始"); } //開始表示をする自前のメソッド ・定義しただけでは動作しないので、呼び出す必要がある ・呼び出し書式: メソッド名(引数, …) ・なお、戻り値がある場合、呼び出しをDebug.Log()の中で行うと、戻り値を表示できる。  呼び出しを式の中で行うと、戻り値が式に渡される。 ・引数がない場合はカッコだけを書く(使わない引数を書くとエラー) ミニ演習 mini060a.cs ・int型の引数を2つ渡すと和を表示する自前のAddメソッドをStartメソッドの上または下に記述する void Greet() { Debug.Log("処理開始"); } ・Startメソッドでこれを呼び出してみよう 作成例 using UnityEngine; public class mini060a : MonoBehaviour { void Greet() { //自前のメソッドGreet()の定義 Debug.Log("処理開始"); } void Start() { Greet(); //自前のメソッドGreet()を呼ぶ } } ミニ演習 mini060b.cs ・int型の引数を2つ渡すと和を表示する自前のAdd2メソッドをStartメソッドの上または下に記述する ・Startメソッドでこれを呼び出してみよう 作成例 using UnityEngine; public class mini060b : MonoBehaviour { void Add2(int a, int b) { //自前のメソッドAdd2(int,int)の定義 Debug.Log(a + b); //和を表示 } void Start() { Add2(10, 20); //自前のメソッドAdd2()に2引数を渡して呼ぶ } } 補足:自前のメソッド:戻り値の返し方 ・戻り値のメソッドでは「return 式または値;」を最後に必ず実行する必要がある。 ・この式または値の型と、メソッドの戻り値型を合わせるのが基本。 ・例: string Greets() { return "やあ"; } //文字列「やあ」を返すメソッド ミニ演習 mini060c.cs ・int型の引数を2つ渡すと和を返す(表示しない)自前のAddメソッドをStartメソッドの上または下に記述する ・Startメソッドでこれを呼び出して、戻り値を表示しよう 作成例(動作順序説明バージョン) using UnityEngine; public class mini060c : MonoBehaviour { int Add(int a, int b) { //自前のメソッド int Add(int,int)の定義 return a + b; //③和を返す } void Start() { int r; //①戻り値を格納する為の変数 r = Add(10, 20); //②Add()に2引数を渡して呼び、④戻り値を代入 Debug.Log(r); //⑤戻り値を表示 } } 作成例(短縮バージョン) using UnityEngine; public class mini060c : MonoBehaviour { int Add(int a, int b) { //自前のメソッド int Add(int,int)の定義 return a + b; //②和を返す } void Start() { Debug.Log(Add(10, 20)); //①引数を渡してAddを呼び、③戻り値を得て表示 } } 補足:自前のメソッド:オーバーロード ・自前のメソッドでもオーバーロード(同じ名前のメソッドに型や個数&順序が異なる引数を与えると動作を変えられること)が可能。 例: int Add(int a, int b) { return a + b; } double Add(double a, double b) { return a + b; } ・ただし、戻り値型のみが異なるメソッドはオーバーロードにはならず、定義すると文法エラーになる ・引数の数や並び順が異なるオーバーロードも可能 例: int Add(int a, int b, int c) { return a + b + c; } int Add(int a, double b) { return a + (int)b; } int Add(double a, int b) { return (int)a + b; } ミニ演習 mini060d.cs ・上記の5つのメソッドを全て定義するとどうなるか確認しよう  この時、どれが呼ばれたか分かるように「Debug.Log」で適当な文字列を表示しよう ・Startメソッドで5つ全てを呼び出して、結果を確認しよう 作成例 using UnityEngine; public class mini060d : MonoBehaviour { int Add(int a, int b) { //自前のメソッド①int Add(int,int)の定義 Debug.Log("①int Add(int,int)が呼ばれた"); return a + b; //整数和を返す } double Add(double a, double b) { //自前のメソッド②double Add(double,double)の定義 Debug.Log("②double Add(double,double)が呼ばれた"); return a + b; //実数和を返す } int Add(int a, int b, int c) { //自前のメソッド③int Add(int,int,int)の定義 Debug.Log("③int Add(int,int,int)が呼ばれた"); return a + b + c; //整数の総和を返す } int Add(int a, double b) { //自前のメソッド④int Add(int,double)の定義 Debug.Log("④int Add(int,double)が呼ばれた"); return a + (int)b; //整数と整数化した実数の和を返す } int Add(double a, int b) { //自前のメソッド⑤int Add(double,int)の定義 Debug.Log("⑤int Add(double,int)が呼ばれた"); return (int)a + b; //整数化した実数と整数の和を返す } void Start() { Debug.Log(Add(10, 20)); //引数を渡してAdd①を呼び、戻り値を得て表示 Debug.Log(Add(3.14, 20.5)); //引数を渡してAdd②を呼び、戻り値を得て表示 Debug.Log(Add(10, 20, 30)); //引数を渡してAdd③を呼び、戻り値を得て表示 Debug.Log(Add(10, 3.14)); //引数を渡してAdd④を呼び、戻り値を得て表示 Debug.Log(Add(3.14, 100)); //引数を渡してAdd⑤を呼び、戻り値を得て表示 } } 提出:ミニ演習 mini060a/b/c/d.csのどれか 次回予告:p.060「メソッドの.(ドット)の前にあるものは」から