このサイトは残しておきますが、いつか消えます。
ご了承ください。
なお、UnityやC#のリファレンスへのリンクはご自分のPCのブックマークに入れておくと便利です。
では、4月からの全日制講座で、また、お会いしましょう。
for trainees of Hirano's class only
このサイトは残しておきますが、いつか消えます。
ご了承ください。
なお、UnityやC#のリファレンスへのリンクはご自分のPCのブックマークに入れておくと便利です。
では、4月からの全日制講座で、また、お会いしましょう。
資料「Unityゲーム開発演習 3迷路シューティング」をご覧ください。
ダウンロード:shooting3dmaze202302.zip
※ ドキュメントフォルダなどに展開して、手順書の通りにUnityからインポートしてください。
※ shooting3dmaze202302.unitypackageファイルはダブルクリックしないでください。
資料「Unityゲーム開発演習 3迷路シューティング」(穴埋め済バージョン):Unity迷路シューティング演習
・ゲーム関連で聞きなじみのある単語でも、プログラム側のことだと全然違ったりしたので面白いなと感じました
面白いですよね♪
・3Dを触るのがとても楽しみです
・3D 関連の事とのことなので、次回が楽しみです。
何よりです。
・次回もよろしくお願いします
・次回もよろしくお願いします
最終回。こちらこそ宜しくお願い致します。
次回予告:Unityで3Dゲームの開発体験、(時間があれば)インターフェイスの利用事例など
講義メモ:memo20240310.zip
文法編:ジェネリックコレクションクラス、インターフェイスなど
コレクションクラス
・コレクションとはデータ構造を表す仕組み。 ・例:配列は同じ型のデータをまとめて番号(添字)で扱う仕組み 構成:配列名[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!
・完成が見えてきたので残りも頑張りたいです
応援します。
・いよいよ大詰めになってきて次回がより楽しみです
ですね。お楽しみに。
・次回もよろしくお願いします
・次回もよろしくお願いします
こちらこそ、宜しくお願い致します。
ゲーム開発編次回予告:p.192「壁のプレハブを作成する」から完成まで
※ 最終回は3Dゲーム開発サンプルを用いた演習の予定
文法編次回予告:ジェネリックコレクションクラス、インターフェイスなど
講義メモ:memo20240303.log