講義メモ Chapter 4

p.129 Chapter 4 ゲームオブジェクトを動かそう

p.131 最初からある2つのメソッドの役割

・メソッドの定義の冒頭に記述する「戻り値型」で、戻り値がない場合は「void」を指定
・なお、void指定時はメソッド内で「return ●」は指定不可だがメソッドを脱出して呼び出し元に戻る「return」は可能。
・ちなみに、void以外を指定時は、内部でどう分岐しても、必ず最後に「return ●」する必要がある
・Unityが用意してくれるStart()はC#のメソッドの仕組みをUnityが拡張したもので、C#のメソッドとは文法的に異なるため、
 メッセージというUnity独自の仕組みに分類される(p.133下4行)
・Update()も同様で、テキストでは便宜的にメソッドと呼んでいるので注意。
・また、p.131に「新しいメソッドを作るための書き方」とあるが、Start()とUpdate()の場合、
 Unityが提供してくれる仕組みへの加筆に該当するので、C#における「新しいメソッドを作るための書き方」とは異なる
・この仕組みにより、Start()に記述した内容は起動時に1回だけ、Update()に記述した内容は起動後一定時間おきにUnityにより
 実行される
・よって、Start()に記述するのは「ゲームの初期処理」Update()に記述するのは「ゲームの主処理」となることが多い

p.132 クラスの作り方を見直してみよう

・継承(インヘリタンス)とは、あらかじめあるクラスの構成要素(メンバ)を引き継いでクラスを作ること
・これにより、Unityのようなシステムが用意した仕掛けがあるクラスを継承し、必要なことを書き足すだけで動作する
 プログラム(クラス)を作成できる
・例えば、Unityの場合、MonoBehaviourクラスが提供されていて、これを継承し、Startメソッドの内容を記述するだけで、
 Unity上で動作するプログラムになる
※この考え方を差分プログラミングという
・なお、プログラマが自らクラスを作成し、これを継承することができるので、複数のクラスが継承するクラスを記述することで
 共通化や部品化が可能になる
※継承されるクラスを基本クラス(基底クラス、親クラスなど)、継承するクラスを派生クラス(子クラスなど)という
・基本クラスを書き換えると、派生クラスに継承される内容は自動更新されるので、修正の反映モレを防ぎ、部品化の効率を
 上げられる
・クラスのメンバにはメソッドのみならず、データなども記述できる(例:パブリック変数)

ここからの進め方

・ゲーム開発編と文法編にプロジェクトを分けて進めます
・ゲーム開発編としては、p.134からの手順で「furiCSharpGame(例)」プロジェクトを作成して2Dゲームを段階的に作成
・文法編としては、現在利用しているプロジェクトにゲームオブジェクトGameObject4を作成して文法に関わるプログラムを都度作成

文法編:クラスの継承

・C#ではクラス内にクラス(インナークラス)を作成し、そのクラス内でのみ利用可能にできる
・よって、テストや確認にも便利
・Unityの環境ではMonoBehaviourクラスの派生クラスのみが実行可能なため、自前のクラスを作成する代わりに、
 MonoBehaviourクラスの派生クラスの中にインナークラスを作成しよう

文法編:データのみを持つインナークラス Monster を作る ex0727a.cs

・データとしてint型のhpとmpを持つ
・書式例: public 型 変数名;
・Start()の中で、newによりMonsterクラスのオブジェクトを生成する
・書式例: クラス名 オブジェクト名 = new クラス名();
・すると、オブジェクト名.変数名 が確保されて利用可能になる

作成例

using UnityEngine;
public class ex0727a : MonoBehaviour{
    class Monster { //インナークラスMonsterの定義
        public int hp; //Monsterクラスの持つデータ
        public int mp; //同上
    } 
    void Start()    {
        Monster hachi = new Monster(); //Monsterオブジェクトhachiを生成
        hachi.hp = 100; //hachiが持つ変数hpに代入
        hachi.mp = 200; //hachiが持つ変数mpに代入
        Debug.Log(hachi.hp + ", " + hachi.mp);  //hachiが持つ変数の値を出力
    }
}

文法編:インナークラス Monster にメソッドを作る ex0727a.cs

・UnityのStart()に近い形で、インナークラスの中に処理を行うメソッドを記述できる
・書式例: public void メソッド名() { 処理内容 }
・すると、オブジェクト名.メソッド名()で実行可能になる

作成例

using UnityEngine;
public class ex0727a : MonoBehaviour{
    class Monster { //インナークラスMonsterの定義
        public int hp; //Monsterクラスの持つデータ
        public int mp; //同上
        public void show() { //Monsterクラスの持つメソッド
            Debug.Log(hp + ", " + mp);  //2変数の値を出力
        }
    }
    void Start()    {
        Monster hachi = new Monster(); //Monsterオブジェクトhachiを生成
        hachi.hp = 100; //hachiが持つ変数hpに代入
        hachi.mp = 200; //hachiが持つ変数mpに代入
        hachi.show();  //hachiが持つメソッドの実行
    }
}

文法編:インナークラス Monster を継承する Slimeクラスを作る ex0727a.cs

・「class クラス名 : MonoBehaviour」と同様に、インナークラス SlimeをMonsterを継承して定義できる
・すると、Monsterクラスに定義されているデータやメソッドが自動的に引き継がれる
・そして、Slimeクラス独自のデータやメソッドを書き加えることができる

作成例

using UnityEngine;
public class ex0727a : MonoBehaviour{
    class Monster { //インナークラスMonsterの定義
        public int hp; //Monsterクラスの持つデータ
        public int mp; //同上
        public void show() { //Monsterクラスの持つメソッド
            Debug.Log(hp + ", " + mp);  //2変数の値を出力
        }
    } 
    class Slime : Monster { //Monsterを継承するクラスSlimeの定義
        // ここに public int hp; が継承される
        // ここに public int mp; が継承される
        public string name;
        // ここに public void show() が継承される
    }
    void Start()    {
        Monster hachi = new Monster(); //Monsterオブジェクトhachiを生成
        hachi.hp = 100; //hachiが持つ変数hpに代入
        hachi.mp = 200; //hachiが持つ変数mpに代入
        hachi.show();  //hachiが持つメソッドの実行
        Slime slalin = new Slime(); //Slimeオブジェクトslalinを生成
        slalin.hp = 50; //slalinが持つ継承された変数hpに代入
        slalin.mp = 60; //slalinが持つ継承された変数mpに代入
        slalin.show();  //slalinが持つ継承されたメソッドの実行
        slalin.name = "すらりん"; //slalinが持つSlime独自の変数に代入
        Debug.Log(slalin.hp + ", " + slalin.mp + ", " + slalin.name);  //slalinが持つ変数の値を出力
    }
}

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です