講義メモ

・p.130 ゲームオブジェクト、コンポーネント、クラス

p.130 ゲームオブジェクトとスクリプト

・論理構造(理論的な階層構造):シーン>ゲームオブジェクト>コンポーネント>スクリプト
 例: SampleScene > GameObject > Transform > Chap2_3_1
・物理構造(実際のファイルの配置):プロジェクト > アセット > スクリプトとシーン
 例: hirano1029プロジェクトフォルダ > Assetsフォルダ > Chap2_3_1.csファイルとScenesフォルダ

p.131 2つのメソッドの役割

・スクリプトを構成するのはクラス(例:Chap2_3_1)とメソッド(例:Start、Update)
・メソッドは処理内容を記述するブロックで、基本書式は
「戻り値型 メソッド名(引数リスト){内容}」となっている
・メソッドは0個以上の情報を受け取って何かを行い0または1個の情報を返す仕掛け。
・0個の情報を返す=何も返さないメソッドは戻り値型にvoid(無)を指定する
・0個の情報を受け取る=何も受け取らないメソッドは引数リストを空にする(カッコのみにする)
・よって、Unityが決めているStartメソッドの書式は「void Start(){…}」となっている
・StartメソッドはUnity用の特別なメソッドで、Unityシステムが呼び出してくれる。
・呼び出しは「void Start()」で行うので戻り値型や引数リストは変更できない
・呼び出しタイミングはアプリ開始時で「ゲームオブジェクトがシーンに出現したとき」
・なお、出現後に一定時間ごとに繰返して呼び出されるのが「void Update()」

p.132 クラスの作り方

・C#などのオブジェクト指向言語は、クラスを構成単位としてプログラムを作成する
・クラスは設計図のイメージで、全体の設計図となるクラスもあれば、部品や構造の設計図となるクラスも作成できる
・ただし、Unityの上で実行を担うクラスにはルールがあり、これに従うクラスを作成し、Unityから呼び出されるメソッドを記述すれば動作させてもらえる
・Unityの上で実行を担うクラスにはルール:
 ① MonoBehaviourを基本クラスとして継承すること
 ② 外部から見えるように「public」を指定すること
・定義書式: public クラス名 : MonoBehaviour {…}
・継承により(見えないが)多くのメソッドが自動的に引き継がれて内部的に動作している

補足:クラスと継承について

・クラスは単独にも自由に定義できる(C言語の構造体と同様)
・例:
class Slime { //スライムクラスの定義
  public int hp; //HP
  public string name; //名前
  public void show() { //名前とHPを出力するメソッド
    Debug.Log("名前:" + name + ",HP:" + hp);
  }
}

ミニ演習 mini133

・上記のクラスを「public class mini133 {」の上に挿入する
・Startメソッドの中で、下記を行い、動作を確認しよう
  Slime Rimuru = new Slime(); //スライムクラスからオブジェクトを生成
  Rimuru.hp = 100; //HPをセット
  Rimuru.name = "リムル"; //名前をセット
  Rimuru.show(); //名前とHPを出力

作成例

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
class Slime { //スライムクラスの定義(mini133クラスが利用する部品クラス)
    public int hp; //HP
    public string name; //名前
    public void show() { //名前とHPを出力するメソッド
        Debug.Log("名前:" + name + ",HP:" + hp);
    }
}
public class mini133 : MonoBehaviour { //Unityでの実行用クラス
    void Start() { //Unityシステムから開始時に呼び出されるメソッド
        Slime Rimuru = new Slime(); //スライムクラスからオブジェクトを生成
        Rimuru.hp = 100; //HPをセット
        Rimuru.name = "リムル"; //名前をセット
        Rimuru.show(); //名前とHPを出力するメソッドを呼ぶ
    }
    void Update() {

    }
}

補足:クラスと継承について(続き)

・単独に自由に定義したクラスも継承できる
・例:
class Slime { //スライムクラスの定義
  public int hp; //HP
  public string name; //名前
  public void show() { //名前とHPを出力するメソッド
    Debug.Log("名前:" + name + ",HP:" + hp);
  }
}
class HoimiSlime : Slime { //ホイミスライムクラスの定義(スライムを継承)
  // public int hp; //HPが継承される
  // public string name; //名前が継承される
  // public void show() { //名前とHPを出力するメソッドが継承される
  //  Debug.Log("名前:" + name + ",HP:" + hp);
  // }
  public int mp; //MPを追加
  new public void show() { //名前とHPとMPを出力するメソッドにして上書き
    Debug.Log("名前:" + name + ",HP:" + hp + ",MP:" + mp);
  }
}

ミニ演習 mini133・改造

・上記のホイミスライムクラスを「public class mini133 {」の上に挿入する
・Startメソッドの内容に、下記に書き加えて、動作を確認しよう
  HoimiSlime Hoimin = new HoimiSlime(); //ホイミスライムクラスからオブジェクトを生成
  Hoimin.hp = 10; //HPをセット
  Hoimin.mp = 500; //HPをセット
  Hoimin.name = "ホイミン"; //名前をセット
  Hoimin.show(); //名前とHPとMPを出力

作成例

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
class Slime { //スライムクラスの定義(mini133クラスが利用する部品クラス)
    public int hp; //HP
    public string name; //名前
    public void show() { //名前とHPを出力するメソッド
        Debug.Log("名前:" + name + ",HP:" + hp);
    }
}
class HoimiSlime : Slime { //ホイミスライムクラスの定義(スライムを継承)
    // public int hp; //HPが継承される
    // public string name; //名前が継承される
    // public void show() { //名前とHPを出力するメソッドが継承される
    //  Debug.Log("名前:" + name + ",HP:" + hp);
    // }
    public int mp; //MPを追加
    new public void show() { //名前とHPとMPを出力するメソッドにして上書き
        Debug.Log("名前:" + name + ",HP:" + hp + ",MP:" + mp);
    }
}
public class mini133 : MonoBehaviour { //Unityでの実行用クラス
    void Start() { //Unityシステムから開始時に呼び出されるメソッド
        Slime Rimuru = new Slime(); //スライムクラスからオブジェクトを生成
        Rimuru.hp = 100; //HPをセット
        Rimuru.name = "リムル"; //名前をセット
        Rimuru.show(); //名前とHPを出力するメソッドを呼ぶ

        HoimiSlime Hoimin = new HoimiSlime(); //ホイミスライムクラスからオブジェクトを生成
        Hoimin.hp = 10; //HPをセット
        Hoimin.mp = 500; //HPをセット
        Hoimin.name = "ホイミン"; //名前をセット
        Hoimin.show(); //名前とHPとMPを出力するメソッドを呼ぶ
    }
    void Update() {

    }
}

補足:クラスと継承について(続き)

・「ホイミスライムはスライムである」ことでわかるように、継承したクラスで生成したオブジェクトは、基本クラスのオブジェクトとしても扱える
・よって、Slime型の配列にリムルもホイミンも格納できる
 例: Slime[] slimes = { Rimuru, Hoimin }; //スライムの配列に格納する
・そして、スライムクラスのメソッドを実行できる
 例: slimes[0].show(); //Rimuruの名前とHPを表示
 例: slimes[1].show(); //Hoiminの名前とHPを表示

ミニ演習 mini133・改造2

・上記の3行をStart()に追記して動作を確認しよう

作成例

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
class Slime { //スライムクラスの定義(mini133クラスが利用する部品クラス)
    public int hp; //HP
    public string name; //名前
    public void show() { //名前とHPを出力するメソッド
        Debug.Log("名前:" + name + ",HP:" + hp);
    }
}
class HoimiSlime : Slime { //ホイミスライムクラスの定義(スライムを継承)
    // public int hp; //HPが継承される
    // public string name; //名前が継承される
    // public void show() { //名前とHPを出力するメソッドが継承される
    //  Debug.Log("名前:" + name + ",HP:" + hp);
    // }
    public int mp; //MPを追加
    new public void show() { //名前とHPとMPを出力するメソッドにして上書き
        Debug.Log("名前:" + name + ",HP:" + hp + ",MP:" + mp);
    }
}
public class mini133 : MonoBehaviour { //Unityでの実行用クラス
    void Start() { //Unityシステムから開始時に呼び出されるメソッド
        Slime Rimuru = new Slime(); //スライムクラスからオブジェクトを生成
        Rimuru.hp = 100; //HPをセット
        Rimuru.name = "リムル"; //名前をセット
        Rimuru.show(); //名前とHPを出力するメソッドを呼ぶ

        HoimiSlime Hoimin = new HoimiSlime(); //ホイミスライムクラスからオブジェクトを生成
        Hoimin.hp = 10; //HPをセット
        Hoimin.mp = 500; //HPをセット
        Hoimin.name = "ホイミン"; //名前をセット
        Hoimin.show(); //名前とHPとMPを出力するメソッドを呼ぶ

        Slime[] slimes = { Rimuru, Hoimin }; //スライムの配列に格納する
        slimes[0].show(); //[0]であるRimuruの名前とHPを表示
        slimes[1].show(); //[1]であるHoiminの名前とHPを表示
    }
    void Update() {

    }
}

補足:クラスと継承について(続き)

・スライム型の配列に格納したHoiminオブジェクトはもともとはホイミスライムなので、
 showメソッドを実行すると、HoimiSlimeクラスで定義した方が実行されてほしい
・この考え方を多態性(ポリモフィズム)という
・これを実現するのがオーバーライドで、メソッドの上書きで「new」の代わりに
 「override」をpublicの後ろに入れるとOK
・また、オーバーライドされる側のSlimeクラスのメソッドには
 「virtual」をpublicの後ろに入れてオーバーライドを許可すること
・基本的にはnewよりもオーバーライドを用いる方が一般的。

ミニ演習 mini133・改造3

・HoimiSlimeクラスのshow()メソッドをオーバーライドに変更して動作を確認しよう

作成例

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
class Slime { //スライムクラスの定義(mini133クラスが利用する部品クラス)
    public int hp; //HP
    public string name; //名前
    public virtual void show() { //名前とHPを出力するメソッド(オーバーライド可)
        Debug.Log("名前:" + name + ",HP:" + hp);
    }
}
class HoimiSlime : Slime { //ホイミスライムクラスの定義(スライムを継承)
    // public int hp; //HPが継承される
    // public string name; //名前が継承される
    // public void show() { //名前とHPを出力するメソッドが継承される
    //  Debug.Log("名前:" + name + ",HP:" + hp);
    // }
    public int mp; //MPを追加
    public override void show() { //名前とHPとMPを出力するメソッドにしてオーバーライド
        Debug.Log("名前:" + name + ",HP:" + hp + ",MP:" + mp);
    }
}
public class mini133 : MonoBehaviour { //Unityでの実行用クラス
    void Start() { //Unityシステムから開始時に呼び出されるメソッド
        Slime Rimuru = new Slime(); //スライムクラスからオブジェクトを生成
        Rimuru.hp = 100; //HPをセット
        Rimuru.name = "リムル"; //名前をセット
        Rimuru.show(); //名前とHPを出力するメソッドを呼ぶ

        HoimiSlime Hoimin = new HoimiSlime(); //ホイミスライムクラスからオブジェクトを生成
        Hoimin.hp = 10; //HPをセット
        Hoimin.mp = 500; //HPをセット
        Hoimin.name = "ホイミン"; //名前をセット
        Hoimin.show(); //名前とHPとMPを出力するメソッドを呼ぶ

        Slime[] slimes = { Rimuru, Hoimin }; //スライムの配列に格納する
        slimes[0].show(); //[0]であるRimuruの名前とHPを表示
        slimes[1].show(); //[1]であるHoiminの名前とHPを表示
    }
    void Update() {

    }
}

コメントを残す

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