講義メモ ・p.060「メソッドの.(ドット)の前にあるものは」から p.060 メソッドの.(ドット)の前にあるものは ・C言語やC++などの関数とC#やJavaなどのメソッドは近い概念だが、メソッドの基本は「クラスや構造体に所属する」ことが異なる ・よって例えば「Debug.Log」メソッドは、DebugクラスのLogメソッドを示す ・つまり「.」は日本語の「の」 ・なお、自前のクラス内に自前のメソッドを書くと、自前のクラスに所属するメソッドとして扱われるが、自分の中なので「自前のクラス名.」は基本的に不要。 ・Unityでは機能ごとにクラスを提供し、その中にメソッドを置くことで、グループ化すると共に「同じ名前でもクラスが違うと別のもの」になっている p.061 静的メソッドとインスタンスメソッド ・自らのデータを持つ必要がないメソッドと、必要があるメソッドがある ・例えば、Debug.Logは引数で与えられた情報を処理するだけなので、自らのデータを持つ必要がない ・このようなメソッドはクラスに所属するだけで良いので、静的メソッドとなりキーワード「static」を付けて定義される ・MathfクラスのMathf.MaxやMathf.Sqrtも同様 ・これに対して、スライムをクラスで扱う場合、HPやMPはクラスではなくクラスをもとに生成するオブジェクト(インスタンス)で持つ必要がある ・例えばスライムのスラリンを表現するには、スライムはクラス(設計図)、スラリンはインスタンス(実体)とすることで、他のスライムの個体も扱える ・ということは、スライムクラスにHPやMPを扱うメソッドを記述した場合、これはクラスではなくインスタンスに含まれないと困る ・このようなメソッドがインスタンスメソッドで、これが本来のメソッド。 例: class Slime {   public int hp = 10;   public void dispHP() { Debug.Log(hp); } //クラス定義 } : Slime sulalin = new Slime(); //スライムクラスのインスタンスsulalinを生成 sulalin.dispHP(); //インスタンスメソッドでsulalinのHPを表示(10) sulalin.hp = 20; //sulalinのHPを変更 sulalin.dispHP(); //インスタンスメソッドでsulalinのHPを表示(20) Slime hoimin = new Slime(); //スライムクラスのインスタンスhoiminを生成 hoimin.hp = 50; //hoiminのHPを変更 hoimin.dispHP(); //インスタンスメソッドでhoiminのHPを表示(50) ・p.061には書かれていないが、クラスにはデータ(インスタンス変数)を定義でき、生成したインスタンスごとに領域がとられ、これを扱うにはインスタンスメソッドを用いる https://ha252.rundog.org/wp-content/uploads/2025/06/b88b52a7115ce77cea123258541b3378.png ミニ演習 mini061.cs ・スライムクラスを実装してインスタンスメソッドを試してみよう ・Unityの場合、制限があり、用意されるクラスの中にクラスを定義して用いる(内部クラスという) 作成例 using UnityEngine; public class mini061 : MonoBehaviour { class Slime { //スライムを表すクラス(内部クラス) public int hp; //インスタンス変数(インスタンスごとの変数) public void dispHP() { //インスタンスメソッド Debug.Log("HPは" + hp); //インスタンス変数の値を用いる } } void Start() { Slime slalin = new Slime(); //スライムクラスのインスタンスslalinを生成 slalin.hp = 20; //インスタンスslalinのHPを設定 slalin.dispHP(); //slalinのインスタンスメソッドdispHPを呼ぶ Slime hoimin = new Slime(); //スライムクラスのインスタンスhoiminを生成 hoimin.hp = 50; //インスタンスhoiminのHPを設定 hoimin.dispHP(); //hoiminのインスタンスメソッドdispHPを呼ぶ } } 補足:静的メソッドとインスタンスメソッドの共存(使い分け) ・クラスに含まれる情報には、インスタンスごとに持つべきデータ(インスタンス変数)と、クラスで持った方が良いデータ(静的変数(クラス変数))がある ・インスタンス変数の例:HP、MP、名前など ・静的変数(クラス変数)の例:種族名、生成したインスタンスの数など ・よって、インスタンス変数を扱うメソッドはインスタンスメソッドにする ・静的変数(クラス変数)を扱うメソッドは静的メソッドにする ・静的変数(クラス変数)の書式例: public static 型 変数名; ・静的メソッドの書式例: public 戻り値型 メソッド名(引数型 引数名,…) {…} ・静的メソッドとインスタンスメソッドの共存できるが、静的メソッドからはインスタンス変数やインスタンスメソッドは使えない(特定できないので) ミニ演習 mini061.cs・改造 ・静的変数(クラス変数)として下記を追加  public static string cname = "スライム"; ・静的メソッドとして下記を追加  public void dispCname() { Debug.Log("種族:" + cname); } ・インスタンス変数として下記を追加  public string name; ・dispHP()メソッドでnameも表示するようにしよう ・start()において、slalin.name、hoimin.nameに名前を代入しよう ・静的メソッドであるdispCname()は「Slime.dispCname()」で実行しよう 作成例 using UnityEngine; public class mini061 : MonoBehaviour { class Slime { //スライムを表すクラス(内部クラス) public static string cname = "スライム"; //静的変数(クラスごとの種族名) public static void dispCname() { //静的メソッド Debug.Log("種族:" + cname); //静的変数の値を用いる } public string name; //インスタンス変数(インスタンスごとの名前) public int hp; //インスタンス変数(インスタンスごとのHP) public void dispHP() { //インスタンスメソッド Debug.Log(name + "のHPは" + hp); //インスタンス変数の値を用いる } } void Start() { Slime.dispCname(); //静的メソッドで種族名を表示(インスタンス不要) Slime slalin = new Slime(); //スライムクラスのインスタンスslalinを生成 slalin.name = "スラリン"; //インスタンスslalinのnameを設定 slalin.hp = 20; //インスタンスslalinのHPを設定 slalin.dispHP(); //slalinのインスタンスメソッドdispHPを呼ぶ Slime hoimin = new Slime(); //スライムクラスのインスタンスhoiminを生成 hoimin.name = "ホイミン"; //インスタンスhoiminのnameを設定 hoimin.hp = 50; //インスタンスhoiminのHPを設定 hoimin.dispHP(); //hoiminのインスタンスメソッドdispHPを呼ぶ } } p.062 エラーメッセージを読み解こう:名前を間違えた場合 ・テキストでは英語表記になっているが、Unity6でVS2022を用いている場合、該当する位置に赤い波線が表示され、マウスを載せると日本語で説明が出る。  例:「CS0103 現在のコンテキストに '●' という名前は存在しません」  ※バージョンやエラーの種別によっては表示されない場合がある ・これを無視してVS2022で保存すると、Unity側に英文でエラーが表示される  ⇒これが、p.63のエラーメッセージ ・エラーメッセージには行番号が含まれているので、長いコードになったら確認に用いると良い ・「CS0103」はエラーコードで、C#リファレンスで詳細を調べることができる  https://learn.microsoft.com/ja-jp/dotnet/csharp/language-reference/compiler-messages/cs0103 ・なお、Unityが提供する静的メソッドの名前を間違った場合は、エラーコードCS0117になる。 p.064 エラーメッセージを読み解こう:型が合っていないとき ・Unity6でVS2022を用いている場合、下記のように表示される 「CS0266 型 'double' を 'int' に暗黙的に変換できません。明示的な変換が存在します (cast が不足していないかどうかを確認してください)」 ・「明示的な変換が存在します (cast が不足していないかどうかを確認してください)」とある通り、キャストを勧めるメッセージになっているが、キャストによってデータの一部が失われるので、この通りにせねばならないとは限らない。 ・例: double d = 3.56; int a = b; //キャストを勧められる  ⇒ double d = 3.56; int a = (int)b; //キャストすると3になる(切り捨て)  ⇒ double d = 3.56; int a = (int)(b + 0.5); //小数点以下四捨五入で4にする p.065 diffツール ・Webサービス「https://www.diffchecker.com/」は、デスクトップ用の有料版の広告が表示されるが、これを閉じれば利用可能 ・なお、Windowsにもコマンドラインでファイルを比較するfcコマンドが含まれており「fc ファイル名① ファイル名②」で違いを表示してくれる Chapter 2 条件によって分かれる文 p.068 条件分岐 ・プログラムは順次構造と分岐が構造の基本になっており、分岐を上向きにすることで繰り返し構造を表現できる ・Chapter 1 のプログラムは全て順次構造のみで記述されている ・分岐の構造は必ず合流することがポイントで、終了させるような分岐も、内部的はプログラム終了の直前に合流し、実行後の後始末が行われる。 ・フローチャートはアルゴリズムを図示する手法の国際標準で、言語などに依存せずに手順を表現・記録するための仕掛け。 ・フローチャートの記述には「https://www.drawio.com/」が便利 ・なお、p.068のフローチャートには開始と終了が省略されており、正しいフローチャートでは長円形で先頭と末尾に示すと良い ・また、条件を示す菱形からは→で飛び先を示し、その上にYes/True、No/Falseなどを記入する p.069 TrueとFalse ・p.056のbool型で説明した通り、C#では真理値である真をtrue、偽をfalseとして表すことができる ・分岐の構造の条件判断も基本的に二択であり「あてはまる」をtrue「あてはまらない」をfalseで表す ・よって条件「age < 20(変数ageの値が20未満)」はageの値が18ならtrueになり、25ならfalseになる ・この「<」は演算子の一つで、比較演算子に含まれる(p.072で後述) ・なお、bool型を返すメソッドもあり、条件として用いることが可能  例:Mathf.IsPowerOfTwo(値) //値が2のべき乗ならtrueを、でなければfalseを返す ・ちなみに、p.068のフローチャートではfalseの場合はなにもせずに合流することを表している 提出:ミニ演習 mini061.cs・改造 次回予告:p.070「Chapter 2のためのゲームオブジェクトの追加」から