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が持つ変数の値を出力
}
}