最終回の講義メモ

資料「Unityゲーム開発演習 3迷路シューティング」をご覧ください。
ダウンロード:shooting3dmaze202302.zip
※ ドキュメントフォルダなどに展開して、手順書の通りにUnityからインポートしてください。
※ shooting3dmaze202302.unitypackageファイルはダブルクリックしないでください。
資料「Unityゲーム開発演習 3迷路シューティング」(穴埋め済バージョン):Unity迷路シューティング演習

今週の話題

今回トップは「ユニコーンオーバーロード(Switch)」GO!
【決算】ANYCOLORの3Q、2割の増収増益―コマース・ファンクラブ利用者は約120万人へ GO!
松竹とBrave groupがゲームメタバース事業で協業―『フォートナイト』内にオリジナルワールド制作、リアル連動イベントも GO!
「Snowflake」活用でパフォーマンス向上とコストダウンを同時に達成―『FF7 EC』開発のアプリボットがデータ分析基盤の構築事例を紹介【CAGC2024】GO!

オンラインゲームにおけるハラスメントの放置はビジネス的損失をもたらす―米団体が無料レポート公開 GO!

前回のコメント

・ゲーム関連で聞きなじみのある単語でも、プログラム側のことだと全然違ったりしたので面白いなと感じました

 面白いですよね♪

・3Dを触るのがとても楽しみです
・3D 関連の事とのことなので、次回が楽しみです。

 何よりです。

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

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

講義メモ:文法編

文法編:ジェネリックコレクションクラス、インターフェイスなど

コレクションクラス

・コレクションとはデータ構造を表す仕組み。
・例:配列は同じ型のデータをまとめて番号(添字)で扱う仕組み
 構成:配列名[0]、配列名[1]、配列名[2]、…
・例:レコードは複数の項目から成る1行のイメージの情報で型は異なって良く、項目名が必要
 構成:「項目名①、項目名②、…」が並んでいる
・例:リストは同じ型のデータをまとめて順番で扱う仕組み
 構成:要素①⇒要素②⇒要素③⇒…
・コレクションクラス:コレクションを扱うためのクラスで、C#システムが多種を提供している
・C#などでは、配列は言語仕様に含まれているので、クラスは不要で便利だが、配列の欠点に注意が必要
 例:要素数が変更不可、途中挿入や削除を行うには後続要素全ての移動が必要 など
・そこで、C#mなどでは配列に代わるコレクションクラスとしてArrayListクラスを提供している
 利用方法: using System.Collections; を指定(Unityではデフォルト)
 生成方法: ArrayList 変数名 = new ArrayList(); //要素数は指定不要で自動拡張/縮小
 格納方法: 変数名.Add(要素値) メソッドで
 要素数: 変数名.Count プロパティで得る
 検索方法: 配列と同様に 変数名[添字]

ミニ演習 mini0310a.cs

・Monstersという名のArrayListを生成し、適当な文字列をいくつか格納する
・要素数を得て、格納した全要素をDebug.Logしよう

作成例

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class mini0310a : MonoBehaviour {
    void Start() {
        ArrayList monsters = new ArrayList(); //生成
        monsters.Add("Veldra"); //要素を追加
        monsters.Add("VelGrimnd"); //要素を追加
        monsters.Add("VelZerd"); //要素を追加
        Debug.Log("要素数:" + monsters.Count); //プロパティで得る
        for (int i = 0; i < monsters.Count; i++) { //全要素繰返す
            Debug.Log(i + ":" + monsters[i]);
        }
    }
}

ミニ演習 mini0310a.cs・改

・p.118のforeachを用いてシンプルにしよう
・作業変数の型は匿名型のvarにすると良い
・添え字は用いないので「i」の表示は不要とし、要素の名前のみで良い

作成例

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class mini0310a : MonoBehaviour {
    void Start() {
        ArrayList monsters = new ArrayList(); //生成
        monsters.Add("Veldra"); //要素を追加
        monsters.Add("VelGrimnd"); //要素を追加
        monsters.Add("VelZerd"); //要素を追加
        Debug.Log("要素数:" + monsters.Count); //プロパティで得る
        foreach (var w in monsters) { //全要素繰返す
            Debug.Log(w);
        }
    }
}

ジェネリックコレクションクラス

・コレクションクラスであるArrayListは格納したデータの型を「object」にしてしまうことで、どんな型のデータも格納できる
・しかし、要素を取り出して用いるときに型がわからないので不具合にもなる
・そこで、型を指定できるようにしたのが、ジェネリックコレクションクラスであるList<T>
・List<T>クラスを用いると、配列と同様に型を決めたコレクションを利用できる
・なお、メソッドやプロパティはArrayListクラスとほぼ同様
 利用方法: using System.Collections.Generic; を指定(Unityではデフォルト)
 生成方法: List<型> 変数名 = new List<型>(); //要素数は指定不要で自動拡張/縮小
 格納方法: 変数名.Add(型が一致する要素値) メソッドで
 要素数: 変数名.Count プロパティで得る
 検索方法: 配列と同様に 変数名[添字]

ミニ演習 mini0310b.cs

・Monstersという名のList<string>を生成し、適当な文字列をいくつか格納する
・要素数を得て表示し、foreachで格納した全要素をDebug.Logしよう

作成例

using System.Collections;
using System.Collections.Generic; //List<T> 用
using UnityEngine;
public class mini0310b : MonoBehaviour {
    void Start() {
        List<string> monsters = new List<string>(); //生成
        monsters.Add("Rimuru"); //要素を追加
        monsters.Add("Shuna"); //要素を追加
        monsters.Add("Sion"); //要素を追加
        Debug.Log("要素数:" + monsters.Count); //プロパティで得る
        foreach (var w in monsters) { //全要素繰返す
            Debug.Log(w);
        }
    }
}

インターフェイス

・元の意味は「異なる要素をつなげる仕組み」
・C#などのオブジェクト指向では「無関係なクラスを関連付ける仕組み」でクラスの性格を表すことができる
・例えば、ドラゴンクラスとF14クラスは継承関係にはならないが「飛ぶもの」というインターフェイスを実装することで、
 オブジェクトをまとめて扱える
・インターフェイスは抽象クラスと同様に定義できる。中身は空でも良い
・例: interface FlyAble {} //飛ぶものを示すインターフェイス
・クラスにインターフェイスを結びつけることを実装といい、継承と同じ書式でできる
・例: class Dragon : FlyAble {…} //飛ぶものであるドラゴンクラスの定義
・例: class F14 : FlyAble {…} //飛ぶものであるF14クラスの定義
・同じインターフェイスを実装するクラスのオブジェクトはまとめて扱える
・例えば、インターフェイスを型とする配列に入れられる
例:
 Dragon Veldra = new Dragon();
 F14 Blue = new F14();
 FlyAble[] flyers = {Veldra, Blue}; //飛ぶものの配列に格納できる

提出:ミニ演習 mini0310b.cs

講義メモ

ゲーム開発編次回予告:p.192「壁のプレハブを作成する」から完成まで
 ※ 最終回は3Dゲーム開発サンプルを用いた演習の予定
文法編次回予告:ジェネリックコレクションクラス、インターフェイスなど

p.192 壁のプレハブを作成する

・①[Create]⇒「+」
・②[2D Object][Sprite]⇒[2D Object][Sprites][Square]
・③の名前の変更は、戻ってしまうことがあり、⑤の後でリトライすると良い
・⑤「Add Component」「Physics 2D」「BoxCollider 2D」

p.193 スクリプトを使って壁を配置する

・①[Create]⇒「+」
・③「Add Component」「New Script」「Manager」「Create and add」「:」「Edit Script」
・⑥[Size]を「x:0.7」「y:0.16」にする

p.194-195 Manager.cs

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

public class Manager : MonoBehaviour {
    public GameObject wallpfb; //壁のプレハブのパブリック変数
    void Start() {
        for (int x = 0; x < 5;  x++) {
            for (int y = 0; y < 4; y++) { 
                Vector3 pos = new Vector3(); //方向オブジェクトを生成
                pos.x = x * 1.2f - 2.4f; //X座標を横並びに設定
                pos.y = 2.5f - y; //Y座標を縦並びに設定
                Instantiate(wallpfb, pos, Quaternion.identity); //無回転
            }
        }        
    }
}

p.198 スクリプトを使ってWallを回転させる

・②[Open Prefab]⇒「Open」
・③「Add Component」「New Script」「Wall」「Create and add」「:」「Edit Script」

p.201 Wall.cs

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

public class Wall : MonoBehaviour {
    public bool clockwise = true; //時計回りを示すパブリック変数
    void Update() {
        if (clockwise) { //時計回りならば
            transform.Rotate(new Vector3(0, 0, -5)); //Z方向に回転
        } else { //時計回りでなければ
            transform.Rotate(new Vector3(0, 0, 5)); //Z方向に回転
        }
    }
}

p.202 Manager.cs・改

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

public class Manager : MonoBehaviour {
    public GameObject wallpfb; //壁のプレハブのパブリック変数
    void Start() {
        for (int x = 0; x < 5;  x++) {
            for (int y = 0; y < 4; y++) { 
                Vector3 pos = new Vector3(); //方向オブジェクトを生成
                pos.x = x * 1.2f - 2.4f; //X座標を横並びに設定
                pos.y = 2.5f - y; //Y座標を縦並びに設定
                GameObject obj = Instantiate(wallpfb, pos, Quaternion.identity); //無回転
                Wall wall = obj.GetComponent<Wall>(); //壁のコンポーネントを得る
                if (y % 2 == 0) { //偶数行目(0行目と2行目)?
                    wall.clockwise = true; //時計回りに
                } else { //奇数行目(1行目と3行目)?
                    wall.clockwise = false; //反時計回りに
                }
            }
        }        
    }
}

p.205 ゲーム画面の「底」を作成する

・p.205上①[Create]⇒「+」、[2D Object][Sprite]⇒[2D Object][Sprites][Square]
・p.205上②の名前の変更は、戻ってしまうことがあり、③の後でリトライすると良い
・p.205上③の後で、SpriteRndererのSpriteを「Background」にする(下の方にある)

・p.205下①「Add Component」「Physics 2D」「BoxCollider 2D」
・p.206上①の実行後、画面上でCtrlキーを押しながらマウスのホイールを下回しすることで倍率を下げると横長のオブジェクトを確認できる

・p.206下①「Add Component」「New Script」「Bottom」「Create and add」「:」「Edit Script」

p.206 Bottom.cs

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

public class Bottom : MonoBehaviour {
    void OnTriggerEnter2D(Collider2D other) { //衝突したら
        Destroy(other.gameObject); //相手を消す
    }
}

p.208 Unityスクリプトリファレンスでクラスを調べよう

・Unity2022.3バージョンの場合のアドレスは:
  https://docs.unity3d.com/ja/2022.3/ScriptReference/index.html
・利用開始前に、バージョン番号を合わせること(Unityはバージョンによる差異が多い)

p.211 Microsoft社のC#ドキュメント

・日本語版のアドレスは:
 https://learn.microsoft.com/ja-jp/dotnet/csharp/language-reference/
・検索結果には、C#と共に.NETフレームワークを構成する言語であるVisual Basicの事柄も含まれるので注意

今週の話題

今回トップは「ファイナルファンタジーVII リバース(PS5)」GO!
学生がもっと“eスポーツ”に触れる機会を―ヒューマンアカデミーが学校にゲーミングデバイスを寄贈するプランを展開する狙い GO!
広井王子氏が考えるeスポーツとゲームの未来、そして映画との深い繋がりとは―eスポーツ映画「PLAY! ~勝つとか負けるとかは、どーでもよくて~」公開直前インタビュー! GO!
Unity、有償プランの値上げを日本でのみ実施―円安に伴う為替レート変更 個人向けの無料版であるUnity Personalに影響はありません GO!

セガサミーのゲーム事業は新作軟調、過度な広告費で営業利益が急減【ゲーム企業の決算を読む】GO!
従業員の発言切っ掛けに議論が過熱。ゲームへの多様性導入巡り開発コンサル企業に海外で是非の声 GO!
【決算】gumi、3Qの売上高3割減、営業損失30億円―『アスタタ』不調やブロックチェーンゲーム宣伝費が重く GO!

前回のコメント

・完成が見えてきたので残りも頑張りたいです

 応援します。

・いよいよ大詰めになってきて次回がより楽しみです

 ですね。お楽しみに。

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

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