・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() {
}
}