講義メモ

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

    }
}

今週の話題

販売本数ランキング 今回トップは「龍が如く8(PS5)」GO!
『アトリエ』シリーズ好調でコーエーテクモが2割増収―“月商20億円のスマートフォンゲーム”を生み出すことに成功【ゲーム企業の決算を読む】GO!
業績好調でも脱・中古ゲーム販売を進めるゲオが向かう先【ゲーム企業の決算を読む】GO!
『原神』が40カ月で売上50億ドルを達成―『クラッシュ・オブ・クラン』を抜き、モバイルゲーム最速記録 GO!
CESA、「CEDEC2024」開催を発表ーセッション講演者の公募を開始 GO!
マイクロソフトが2024年第2四半期決算を発表―アクティビジョン買収でゲーム部門が躍進 GO!
『いけにえと雪のセツナ』『鬼ノ哭ク邦』のTokyo RPG Factoryがスクエニに吸収合併、解散へ―権利義務一切はスクエニ側に引き継ぎ GO!
【決算】カプコンの3Q連結業績は4割超増益で着地―『スト6』などデジタル販売強化が奏功 GO!
【決算】コーエーテクモHDの3Q決算、経常利益100%増の大幅増益 GO!

AppleがEU圏でアプリのサイドローディングを許可するも大手アプリは反発―Xboxサラ・ボンド氏「間違った方向に進んでいる」GO!

前回のコメント

・とうとう基本的なことが終わったので、次回からが楽しみです

 ですね。いよいよこれからです。お楽しみに。

・配列関連は個人的に難しく感じ苦手に思ったので、読み込んでおきたいです

 是非。

・次回もよろしくお願いします
・次回もよろしくお願いします

 こちらこそ、宜しくお願い致します。

講義メモ 続き

補足:2次元配列

・C#の2次元配列はC/C++とは異なり、2つの添字を「配列名[添字①, 添字②]」の形式で指定する
 ※ 後述するが、C/C++と同様に「配列名[添字①][添字②]」の形式で指定する別形式もある
・宣言の書式: 型[,] 配列名;
・生成の書式: 配列名 = new 型[要素数①, 要素数②];
・同時にして、 型[,] 配列名 = new 型[要素数①, 要素数②]; としても良い
例: 縦3列横4列のダンジョンのモンスター配置数 int[,] monsters = new int[3,4];
・2次元配列も添字は0からなので、要素は[0. 0]から[要素数①-1, 要素数②-1]まで。
・2次元配列の全要素を扱うには、forの2重ループを用いると良い
 for (int i = 0; i < 3; i++) {
  for (int j = 0; j < 4; j++) {
   Debug.Log(monsters[i][j]);
  }
 }
・2次元配列も初期化が可能で、{}を2重に用いる
・例: int[,] monsters = {{1,2,3,4},{5,6,7,8},{9,10,11,12}};

ミニ演習 mini128

・上記の例を試そう
・2次元配列monstersを初期化し、全データを表示し、配置数の合計も表示しよう

作成例

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class mini128 : MonoBehaviour {
    void Start() {
        //2次元配列の初期化
        int[,] monsters = { { 1, 2, 3, 4 }, { 5, 6, 7, 8 }, { 9, 10, 11, 12 } };
        int sum = 0; //合計用
        for (int i = 0; i < 3; i++) { //変数iを用いて繰返す
            for (int j = 0; j < 4; j++) { //変数jを用いて繰返す
                Debug.Log("monsters[" + i + "," + j + "] = " + monsters[i, j]);
                sum += monsters[i, j]; //合計に足し込む
            }
        }
        Debug.Log("配置数合計=" + sum);
    }
    void Update() {

    }
}

ミニ演習 mini128a

・2次元配列monstersの[0,0]から[0,3]までを0階、[1,0]から[1,3]までを1階、[2,0]から[2,3]までを2階とみなし、
 階ごとの配置数と合計を表示しよう
実行結果
0階配置数=10
1階配置数=26
2階配置数=42
合計=78

作成例

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class mini128a : MonoBehaviour {
    void Start() {
        //2次元配列の初期化
        int[,] monsters = { { 1, 2, 3, 4 }, { 5, 6, 7, 8 }, { 9, 10, 11, 12 } };
        int all = 0, sum = 0; //合計用(全、階ごと)
        for (int i = 0; i < 3; i++) { //変数iを用いて繰返す
            for (int j = 0; j < 4; j++) { //変数jを用いて繰返す
                sum += monsters[i, j]; //階ごと合計に足し込む
            }
            Debug.Log(i + "階配置数=" + sum);
            all += sum; //全合計に足し込む
            sum = 0; //階ごと合計をクリア
        }
        Debug.Log("合計=" + all);
    }
    void Update() {

    }
}

補足:ジャグ配列

・C/C++と同様に「配列名[添字①][添字②]」の形式で指定する別形式の多次元配列
・処理効率は下がるが、要素数がそろっていない場合にも対応できる
例: a[0][0]←1, a[0][1]←2, a[1][0]←3, a[2][0]←4, a[2][1]←5, a[2][2]←6
・内部構造は「配列の配列」であり、上の例は内部的にはa[0]{1,2}、a[1]{3}、a[2]{4,5,6}とみなされる
・配列数は配列名.Lengthで、内側の配列の要素数は配列名[添字].Lengthで得られる
・宣言の書式: 型[][] 配列名;
・生成の書式: 配列名 = new 型[要素数①][]; 配列名[添字] = new 型[要素数②];…
・例: int[][] monsters = new int[3][]; 
    monsters[0] = new int[2]; monsters[1] = new int[1]; monsters[2] = new int[3];
・初期化は通常の配列と同様
 例: int[][] monsters = new int[3][]; 
    monsters[0] = new int[]{1, 2}; monsters[1] = new int[]{3}; monsters[2] = new int[]{4, 5, 6};

ミニ演習 mini128b

・上記の例を試そう
・2次元のジャグ配列monstersを初期化し、全データを表示し、配置数の合計も表示しよう

作成例

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class mini128b : MonoBehaviour {
    void Start() {
        //2次元ジャグ配列の初期化
        int[][] monsters = new int[3][];
        monsters[0] = new int[]{1, 2}; monsters[1] = new int[]{3}; monsters[2] = new int[]{4, 5, 6};
        int sum = 0; //合計用
        for (int i = 0; i < monsters.Length; i++) { //変数iを用いて内側の全配列分繰返す
            for (int j = 0; j < monsters[i].Length; j++) { //変数jを用いて内側の全要素分繰返す
                Debug.Log("monsters[" + i + "," + j + "] = " + monsters[i][j]);
                sum += monsters[i][j]; //合計に足し込む
            }
        }
        Debug.Log("配置数合計=" + sum);
    }
    void Update() {

    }
}

ミニ演習 mini128c

・2次元ジャグ配列monstersの[0]を0階、[1]を1階、[2]を2階とみなし、階ごとの配置数と合計を表示しよう
実行結果
0階配置数=3
1階配置数=3
2階配置数=15
合計=21

作成例

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class mini128c : MonoBehaviour {
    void Start() {
        //2次元ジャグ配列の初期化
        int[][] monsters = new int[3][];
        monsters[0] = new int[] { 1, 2 }; monsters[1] = new int[] { 3 }; monsters[2] = new int[] { 4, 5, 6 };
        int all = 0, sum = 0; //合計用(全、階ごと)
        for (int i = 0; i < monsters.Length; i++) { //変数iを用いて内側の全配列分繰返す
            for (int j = 0; j < monsters[i].Length; j++) { //変数jを用いて内側の全要素分繰返す
                sum += monsters[i][j]; //合計に足し込む
            }
            Debug.Log(i + "階配置数=" + sum);
            all += sum; //全合計に足し込む
            sum = 0; //階ごと合計をクリア
        }
        Debug.Log("合計=" + all);
    }
    void Update() {

    }
}

補足:パブリック配列

・Unity環境では、パブリック変数と同様に、配列をpublic指定で定義できる
・すると、要素数の分だけ、入力領域が用意される
 例: public int[] monsters = new int[3];
・定義と生成までを行うこと

ミニ演習 mini128d

・3要素のint型パブリック配列monstersを宣言・生成する
・Unity側で適当な値を入力すると、平均値を実数で表示しよう

提出:ミニ演習 mini128d

講義メモ

・p.120 chap3_8_1(配列とforeachによる2重ループ)から

提出フォロー:ミニ演習:フィボナッチ数列 mini117 続き

・数列の要素数を10にして、要素[2]以降の値のセットをfor文による繰返しで行うようにしよう
・ヒント: for(int i = 2; i < fib.Length; i++) { fib[i] = fib[i - 2] + fib[i - 1]; } 
・実行結果: 1,1,2,3,5,8,13,21,34,55
・合計は、そのままforeachで得ると良い

作成例

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class mini117 : MonoBehaviour {
    void Start() {
        int[] fib = new int[10]; //要素数10のフィボナッチ数列を生成
        fib[0] = fib[1] = 1; //配列fibの要素[0]と要素[1]に1を代入
        for (int i = 2; i < fib.Length; i++) { //要素[2]以降の全要素について繰返す
            fib[i] = fib[i - 2] + fib[i - 1]; //前2要素の和を代入
        }
        Debug.Log(string.Join(",", fib)); //配列fibの全要素を連結表示(カンマ区切り)
        int sum = 0; //合計用
        foreach(var work in fib) { //数列の全要素について作業変数を用いて繰返す
            sum += work; //合計に足し込む
        }
        Debug.Log("計=" + sum); //合計を表示
    }
    void Update() {

    }
}

p.120 chap3_8_1(配列とforeachによる2重ループ)から

・foreachによる多重ループが記述できる
・この場合、作業変数は別の名前にすること
・p.120 chap3_8_1では同じ配列を用いているが、同じでなくても良い

p.120 chap3_8_1

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class chap3_8_1 : MonoBehaviour {
    void Start() {
        string[] team = { "A", "B", "C", "D" };
        foreach (string t1 in team) { //全要素の分、作業変数t1を用いて繰返す(x4)
            foreach (string t2 in team) { //全要素の分、作業変数t2を用いて繰返す(x4)
                Debug.Log(t1 + "vs" + t2); //2重ループの中なので作業変数t1とt2が使える(x16)
            }
        }
    }
    void Update() {

    }
}

p.122 chap3_8_2:chap3_8_1をそのまま修正し同一チームの対戦を取り除く

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class chap3_8_1 : MonoBehaviour {
    void Start() {
        string[] team = { "A", "B", "C", "D" };
        foreach (string t1 in team) { //全要素の分、作業変数t1を用いて繰返す(x4)
            foreach (string t2 in team) { //全要素の分、作業変数t2を用いて繰返す(x4)
                if (t1 != t2) { //同一チームでなければ
                    Debug.Log(t1 + "vs" + t2); //2重ループの中なので作業変数t1とt2が使える(x12)
                }
            }
        }
    }
    void Update() {

    }
}

p.123 chap3_8_3:chap3_8_1をそのまま修正し同一組み合わせも取り除く

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class chap3_8_1 : MonoBehaviour {
    void Start() {
        string[] team = { "A", "B", "C", "D" };
        int start = 1; //開始添字
        foreach (string t1 in team) { //全要素の分、作業変数t1を用いて繰返す(x4)
            for (int cnt = start; cnt < 4; cnt++) { //開始添字以降の要素で、変数cntを用いて繰返す
                Debug.Log(t1 + "vs" + team[cnt]); //2重ループの中なので作業変数t1とt2が使える(x12)
            }
            start++; //開始添字を先に進める
        }
    }
    void Update() {

    }
}

ミニ演習:chap3_8_1~3 改造 mini123

・forの2重ループにして変数startを用いないように改良しよう

作成例

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class mini123 : MonoBehaviour {
    void Start() {
        string[] team = { "A", "B", "C", "D" };
        for (int start = 0; start < 4; start++) { //全要素の分、作業変数startを用いて繰返す(x4)
            for (int cnt = start + 1; cnt < 4; cnt++) { //次の要素以降で、変数cntを用いて繰返す
                Debug.Log(team[start] + "vs" + team[cnt]); //2重ループの中(x6)
            }
        }
    }
    void Update() {

    }
}

p.124 無限ループを止める

・コンポーネントの削除によって対処する場合は、Inspectorのスクリプト名の右端の「…」をクリックして「Remove Conponent」
※ Unityのバージョンアップで歯車アイコンから「…」の縦字に変更

p.125 配列の上限を超える場合

・配列の添字が要素数以上または負の数になった場合、実行時エラー「IndexOutOfRangeException(添字範囲外例外)」が発生する
・実行時エラーは文法エラーではないので、Visual Studioのエディタでは発生がわからない
 ※ 実行時エラーが起こることが明らかな場合はエラーや警告が表示されることもある
・実行時エラーの発生場所はUnity側に表示されるメッセージで確認できる
・書式:
 [発生時刻]発生したエラーを示す例外クラス名:メッセージ
 実行クラス名.メソッド名(…)(at Assets/ソースファイル名:行番号)
・例:
 [12:50:02]IndexOutOfRangeException: Index was outside the bounds of the array.
 chap3_6_1.Start () (at Assets/chap3_6_1.cs:9)

p.126 復習ドリル 問題1 chap3_10_1

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class chap3_10_1 : MonoBehaviour {
    void Start() {
        string[] grade = { "松", "竹", "梅" };
        foreach (var g in grade) { //配列gradeの全要素について作業変数gを用いて繰返す
            Debug.Log(g);
        }
    }
    void Update() {

    }
}

p.126 復習ドリル 問題1 chap3_10_2

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class chap3_10_2 : MonoBehaviour {
    void Start() {
        string[] dirs = { "東", "西", "南", "北"};
        for (int cnt = dirs.Length - 1; cnt >= 0 ; cnt--) { //変数cntを用いて逆順で繰返す
            Debug.Log(dirs[cnt] + "方向");
        }
    }
    void Update() {

    }
}

今週の話題

販売本数ランキング 今回トップは「Marvel’s Spider-Man 2(PS5)」GO!
業績回復鮮明のシリコンスタジオ、ゲームエンジンの需要高まる自動車業界でも存在感を発揮【ゲーム企業の決算を読む】GO!
Apple、「GeForce NOW」などゲームストリーミングサービスの制限緩和―単一アプリでフル機能が提供可能に GO!
ブロックチェーンゲーム『キャプテン翼 -RIVALS-』、スマホアプリ版のサービス開始 事前登録は10万人突破 GO!
『FF16』が日本PS5部門でトップに!2023年のPS Store年間ダウンロードランキング公開 GO!
3DS/Wii Uのオンラインプレイサービスが2024年4月9日に終了へ GO!

『パルワールド』の“ポケモン”Modがコミュニティで波紋呼ぶ―動画等は任天堂により権利者削除、モデルの出処も怪しい GO!
ポケモン社が類似の他社ゲームに対して「いかなる利用も許諾しておりません」とコメントを発表。『パルワールド』を示唆か。知的財産権の侵害については「調査を行った上で、適切な対応を取っていく所存」GO!
マイクロソフト約1,900人解雇―アクティビジョン買収でゲーム部門全体の約8%にあたる人員整理 GO!
開発期間は6年以上…Blizzardレイオフで開発中止の未発表サバイバルゲームは社内で好評だった模様 GO!
リリースからたった4ヶ月での終了告知…ネクソンの無料大規模対戦アクション『Warhaven』4月にサービス終了へ GO!

前回のコメント

・最後のアレンジ演習で躓いてしまったので次回までに整理してきたいと思います

 是非。

・作ってる感の湧くものを学べている感じがして楽しく感じています。

 何よりです。

・次回もよろしくお願いします

 こちらこそ宜しくお願い致します。

講義メモ 後半

p.119 for文を使ってインデックスを指定する

・foreachでは表現できない処理を行いたい場合や、繰返しの中で配列の要素値を変更したい場合などは、for文を用いると良い
・for文のカウンタ用の変数を添字として用いると、可読性が高くなる
・利用書式例: for(int i = 0; i < 要素数; i++) { 配列[i]の処理 }
・よって、foreachで表現できる処理はすべて上記の書式に置き換えることが可能
・また、繰返しの中で添字を用いたい場合も、for文で記述すると良い

p.119 chap3_7_2

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class chap3_7_2 : MonoBehaviour {
    void Start() {
        string[] dirs = { "東", "西", "南", "北" };
        for (int cnt = 0; cnt < 4; cnt++) { //要素数の分、変数cntを用いて繰返す
            Debug.Log(dirs[cnt] + "方向");
        }
    }
    void Update() {

    }
}

アレンジ演習:chap3_7_2

・添え字を付けて「0=東方向」「1=西方向」「2=南方向」「3=北方向」と表示しよう
・これはforeachでは難しいが、forでは簡単

作成例

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class chap3_7_2 : MonoBehaviour {
    void Start() {
        string[] dirs = { "東", "西", "南", "北" };
        for (int cnt = 0; cnt < 4; cnt++) { //要素数の分、変数cntを用いて繰返す
            Debug.Log(cnt + "=" + dirs[cnt] + "方向"); //【変更】
        }
    }
    void Update() {

    }
}

補足:配列の要素数

・配列の要素数は、配列名.Lengthで得られる。よって、for文で扱うときには
 for(int i = 0; i < 配列名.Length; i++) { 配列[i]の処理 }
 としておけば、配列の要素数が変わっても、書き換える必要がなくなるので便利
※ 配列の要素数は、必ず配列名.Lengthで得ることというルールにしている場合もある

アレンジ演習:chap3_7_2

・配列の要素数を配列名.Lengthで得るようにしよう
・すると、配列の末尾に要素"中央"を加えても、処理の変更は不要になることを確認しよう

作成例

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class chap3_7_2 : MonoBehaviour {
    void Start() {
        string[] dirs = { "東", "西", "南", "北", "中央" };
        for (int cnt = 0; cnt < dirs.Length; cnt++) { //要素数の分、変数cntを用いて繰返す
            Debug.Log(cnt + "=" + dirs[cnt] + "方向");
        }
    }
    void Update() {

    }
}

ミニ演習:フィボナッチ数列 mini117 続き

・数列の要素数を10にして、要素[2]以降の値のセットをfor文による繰返しで行うようにしよう
・ヒント: for(int i = 2; i < fib.Length; i++) { fib[i] = fib[i - 2] + fib[i - 1]; } 
・実行結果: 1,1,2,3,5,8,13,21,34,55
・合計は、そのままforeachで得ると良い

提出:ミニ演習:フィボナッチ数列 mini117 続き