講義メモ

・p.148「RigidBody2Dコンポーネント」から

提出フォロー:ミニ演習:Shooter.cs

※Shooter.csをメモ帳などにコピーしてUSBに保存し、演習の後に戻せるようにしておくこと
・Shooterが右斜め下に動き、壁で反射するようにしよう
・moveをmovexとmoveyにすると良い
・右端、左端に来たらmovexの符号を反転すれば良い(0.05⇔-0.05)
・上端、下端に来たらmoveyの符号を反転すれば良い(0.05⇔-0.05)

アレンジ前

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

public class Shooter : MonoBehaviour {
    float move = 0.05f; //単精度変数を初期化して移動単位とする
    void Update() { //フレーム表示ごとに実行する
        Vector3 pos = transform.position; //位置情報を得る
        pos.x += move; //得たX座標に移動単位を足し込む(右移動)
        if (pos.x < -2.5f) { //左端に達した?
            move = 0.05f; //移動単位を正に(次回は右移動に)
        }
        if (pos.x > 2.5f) { //右端に達した?
            move = -0.05f; //移動単位を負に(次回は左移動に)
        }
        transform.position = pos; //位置情報に書き戻す(実際に移動する)
    }
    void Start() {

    }
}

作成例

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

public class Shooter : MonoBehaviour {
    float movex = 0.05f; //単精度変数を初期化して移動単位とする
    float movey = 0.05f; //単精度変数を初期化して移動単位とする
    void Update() { //フレーム表示ごとに実行する
        Vector3 pos = transform.position; //位置情報を得る
        pos.x += movex; //【変更】得たX座標に移動単位を足し込む(右移動)
        pos.y += movey; //【追加】得たY座標に移動単位を足し込む(下移動)
        if (pos.x < -2.5f) { //左端に達した?
            movex = 0.05f; //【変更】移動単位を正に(次回は右移動に)
        }
        if (pos.x > 2.5f) { //右端に達した?
            movex = -0.05f; //【変更】移動単位を負に(次回は左移動に)
        }
        if (pos.y > 5.0f) { //【追加】上端に達した?
            movey = -0.05f; //【追加】移動単位を負に(次回は下移動に)
        }
        if (pos.y < -5.0f) { //【追加】下端に達した?
            movey = 0.05f;   //【追加】移動単位を負に(次回は上移動に)
        }
        transform.position = pos; //位置情報に書き戻す(実際に移動する)
    }
    void Start() { //起動時のみ実行する
    }
}

p.148 RigidBody2Dコンポーネント

・コンポーネントは主にプログラム部品のことで、Unityの場合、システムが提供するものと、自作するものがある
・参照: https://docs.unity3d.com/ja/2022.2/ScriptReference/Rigidbody2D.html

p.148 野菜のゲームオブジェクトを作成

①「Scene」に切り替える
②「Hierarchy」の「+」
③「2D Object」「Sprites」「Square」
 ※名前の変更は、戻ってしまうことがあり、後でリトライすると良い
④「Sprites」の「Square」の右の◎をクリックし「tomato」をダブルクリック
⑤ 名前を「Square」から「Vegetable」に変更
⑥「Add Compornent」をクリックしテキストボックスを空にすると一覧が表示される
⑦「Physics 2D」「RigidBody 2D」をクリック
⑧「Position」のXを「-1」Yを「1」にする
⑨ プレイボタンで動作を確認

p.150 ゲームの背景色を変更する

・色の表現はRGB(Red,Green,Blue)のそれぞれの配合割合で決められる
・通常、各256段階で0,0,0が黒、255,255,255が白、全16,777,216色から選択できる。
 例:au(KDDI)のロゴ色規定:RGB値 R235 G85 B5
・なお、RGBは光の三原色で、ディスプレイの色指定用。
・プリンタ等では色の三原色(CMY)を用いる。C=シアン(水色)、M=マゼンタ(赤紫)、Y=イエロー(黄)
・実際は全色混ぜても黒にならないので、プリンタではK=ブラックを追加して4色インクが主流。

p.153 プレハブを作成する

・まず「Scene」に切り替えること

p.154 プレハブを継承したプレハブを作る

・p.154下から1行目の「Base」は「Variant Parent」に変わっている
・p.155上から2行目の「Open Prefub」は「Open」に変わっている

p.156 列挙型を利用して野菜の種類を表す型を作ろう

・p.156下から1行目の「Open Prefub」は「Open」に変わっている
・p.157上2行は「Add Component」「New Script」で「Vegtable」と入力し「:」「Edit Script」

p.157 Vegetable.cs

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

public class Vegetable : MonoBehaviour {
    public enum Type { //Type列挙型の定義
        Tomato, Gpepper, Broccoli, Potato //列挙メンバの定義
    }
    public Type type; //Type列挙型のパブリック変数typeの定義
}

補足:列挙型の利用法

・プログラム中で複数の要素を連続して扱いたい場合、要素に番号を振ることが多い
・この番号に名前を付けるのが列挙で、まとめたグループが列挙型名になる
・列挙型名に含まれる要素が列挙メンバ(列挙子)で、自動的に先頭から順に0,1,2,3,…の整数が与えられている
・なお、先頭の列挙メンバに「 = 初期値」を記述することで、開始番号を変更できる
例:先頭のjanを1にする
    public enum Mname { //月名の列挙
        jan = 1, feb, mar, apl, may, jun, jul, org, sep, oct, nov, dec
    }
 こうすると、Debug.Log("Sepは" + (int)Mname.sep + "月"); で「Sepは9月」と出力する
・列挙メンバをintにキャストすることで、それぞれにあてはめられた整数値が得られる
・これを配列の添字として利用することもできる
例:
   string[] season //季節の配列(先頭[0]はダミー)
   = { "", "冬", "冬", "春", "春", "春", "夏", "夏", "夏", "秋", "秋", "秋", "冬" };
   Debug.Log("Sepは" + season[(int)Mname.sep] + "です"); //「Sepは秋です」

作成例(上記をshooter.csに書き加えて試す場合)

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

public class Shooter : MonoBehaviour {
    float move = 0.05f; //単精度変数を初期化して移動単位とする
    void Update() { //フレーム表示ごとに実行する
        Vector3 pos = transform.position; //位置情報を得る
        pos.x += move; //得たX座標に移動単位を足し込む(右移動)
        if (pos.x < -2.5f) { //左端に達した?
            move = 0.05f; //移動単位を正に(次回は右移動に)
        }
        if (pos.x > 2.5f) { //右端に達した?
            move = -0.05f; //移動単位を負に(次回は左移動に)
        }
        transform.position = pos; //位置情報に書き戻す(実際に移動する)
    }
    public enum Mname { //【追加】月名の列挙
        jan = 1, feb, mar, apl, may, jun, jul, org, sep, oct, nov, dec
    }
    void Start() {
        string[] season //【以下追加】季節の配列(先頭[0]はダミー)
        = { "", "冬", "冬", "春", "春", "春", "夏", "夏", "夏", "秋", "秋", "秋", "冬" };
        Debug.Log("Sepは" + (int)Mname.sep + "月"); //「Sepは9月」
        Debug.Log("Sepは" + season[(int)Mname.sep] + "です"); //「Sepは秋です」
    }
}

今週の話題

販売本数ランキング 今回トップは「スーパーマリオブラザーズ ワンダー(Switch)」GO!
PS公式ワイヤレスヘッドセット“PULSE Elite”レビュー。平面磁気ドライバー採用で粒立ちよく“聴きやすい”サウンド GO!
『ヘブンバーンズレッド』効果も長くは続かず…グリーは選択と集中が必要な時期?【ゲーム企業の決算を読む】GO!
学生からインディーゲームクリエイターになった人々は、どのように自らの行く道を決めたのか?『ElecHead』の生高橋氏らが鼎談【IDC2023】GO!
「おす」がテーマ!「第21回UE5ぷちコン」エントリー開始―サイドイベント「ぷちコン ゲームジャム」は東京・大阪・名古屋で開催 GO!
DeNA、エンジニア向け技術カンファレンス「TechCon 2024」をオンライン/オフラインで開催2/29 GO!

ヒューマンアカデミーが運営するCREST GAMING、ゲーミングデバイスブランド「STORIA」とスポンサー契約締結 GO!

販売中止となった『The Day Before』になりすますゲームがSteamに出現―パッチノートも公開し大型アップデートによる再出発装う GO!
バンダイナムコHDの株価が昨年来安値を更新…オンラインゲーム新作不調とタイトル編成の見直しなど第3四半期決算影響か GO!
バンダイナムコ、開発中だった5タイトル以上を開発中止に…オンラインゲームは可能性があるとして今後も取り組みを続ける GO!

参考:【2024年】スマホ向け無料ブラウザゲーム38選!おすすめ・新作Webゲーム紹介 GO!

前回のコメント

・動きが出てきたことによって、よりゲームらしくなってきたので今後が楽しみです。

 やっと本番です(笑)。お楽しみに。

・今回の内容が説明が多く少し理解が甘いところがあると思うので帰ってからも復習してみようと思います。

 是非、いろいろと試してみてください。

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

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

講義メモ 後半

【文法編】p.144 & 168 構造体

・C言語などの構造体は変数をまとめたもので、例えば、座標という構造体の中にX座標とY座標を置ける。
・C#の構造体はこの上位バージョンで軽量クラスになっている
・Unityでは3次元座標を担うVector3構造体(p.144)などが提供されている
・クラスとの最も大きな違いは継承ができないこと、値型(データそのものを持つ形式)なこと。

【文法編】p.144 Vector3構造体

・https://docs.unity3d.com/ja/2021.2/ScriptReference/Vector3.htm
・「struct in UnityEngine」とある通り、構造体で「using UnityEngine;」により利用可能
・Vevtor3構造体を型とする変数posを定義して(Vector3 pos)位置情報を代入している。
・MonoBehaviourクラスにはtransformオブジェクト(コンポーネント)があるので、MonoBehaviourクラスを継承した
 Shooterクラスに引き継がれている
・transformオブジェクトは(Unityにより)Transformクラスから生成されたメンバなので利用可能
・https://docs.unity3d.com/ja/2021.2/ScriptReference/Transform.html
・Transformクラスにはpositionプロパティが含まれているので利用可能であり、現在の座標情報が入手可能になっている
・positionプロパティはVevtor3構造体を型としているので、Vevtor3構造体型のposに代入できる
 (つまり、プロパティのgetによりVevtor3構造体型のオブジェクトが返される)
・なお、Vevtor3の中に、X座標を示す変数xがあり「オブジェクト名.x」で利用できる
・よって、代入後に「pos.x」とすることでx座標が得られる
・変数xはfloat型なので、加算するためのフィールド変数moveもfloat型にすると良い

アレンジ演習:p.142 Shooter.cs

・Startメソッドを復活させて下記を記入し、動作を確認しよう
 ① transformオブジェクトのpositionプロパティで得たVector3オブジェクトを変数posに代入
 ② posをDebug.Logで表示すると(0.00, 4.00, 0.00)となる。
 ※ 内部的に「pos.ToString()」が呼ばれて編集され「(X座標, Y座標, Z座標)」が出力される

作成例

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

public class Shooter : MonoBehaviour {
    float move = 0.05f; //単精度変数を初期化して移動単位とする
    void Update() { //フレーム表示ごとに実行する
        Vector3 pos = transform.position; //位置情報を得る
        pos.x += move; //得たX座標に移動単位を足し込む(右移動)
        transform.position = pos; //位置情報に書き戻す(実際に移動する)
    }
    void Start() { //【以下追加】起動時のみ実行する
        Vector3 work = transform.position; //位置情報を得る
        Debug.Log(work);
    }
}

ミニ演習:Shooter.cs

※Shooter.csをメモ帳などにコピーしてUSBに保存し、演習の後に戻せるようにしておくこと
・Shooterが右斜め下に動き、壁で反射するようにしよう
・moveをmovexとmoveyにすると良い
・右端、左端に来たらmovexの符号を反転すれば良い(0.05⇔-0.05)
・上端、下端に来たらmoveyの符号を反転すれば良い(0.05⇔-0.05)

提出:ミニ演習:Shooter.cs

講義メモ

・【ゲーム編】p.136「ゲームで使用する画像を用意する」から
・【文法編】float、フィールド変数、構造体 など

p.136 Assetsフォルダに画像用のフォルダを作成する

・①[Create]⇒「+」

p.137 画像ファイルを取り込む

・①の画像ファイルは「gameimage」フォルダから

p.139 プレイヤーキャラクターを出現させる

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

p.141 スクリプトを使ってShooterを動かす

・①の前にInspctorの名前が「Shooter」になっていることを確認または入力
・①で「Shooter」と入力し「…」で「Edit Script」

p.142 Shooter.cs

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

public class Shooter : MonoBehaviour {
    float move = 0.05f; //単精度変数を初期化して移動単位とする
    void Update() { //フレーム表示ごとに実行する
        Vector3 pos = transform.position; //位置情報を得る
        pos.x += move; //得たX座標に移動単位を足し込む(右移動)
        transform.position = pos; //位置情報に書き戻す(実際に移動する)
    }
}

【文法編】p.142 float

・p.056のとおり、代表的な組み込み型の一つで、単精度実数(小数点のある値)用のデータ型
・通常のプログラムでは、実数用の型として実行効率が高くて誤差が少ないdouble型を持ちいる
・しかし、float型はメモリ消費量が半分で、大量の実数を扱うUnity向き。
・また、表示における座標は整数が基本なので、精度の高さはそれほど必要としない。
・プログラム中にデータを記述したものをリテラルといい、小数点を持つ数字列は実数リテラル
・実数リテラルの例: -3.14、1234567989.0
・実数リテラルの型はdouble型扱いなので、float型の変数に代入したり、初期値とすると精度が下がるためエラーになる
・これを避けるために、実数リテラルをfloat型扱いにすることを示す「f」または「F」を接尾語として指定すること

【文法編】p.142 フィールド変数

・クラス内でメソッドの外側に定義した変数などをフィールド変数(データメンバ)という
・なお、パブリック変数(p.052)もフィールド変数の一種
・通常のメソッド内で定義している変数はローカル変数といい、メソッドの中でのみ有効で、メソッドが終わると破棄されてしまう
・フィールド変数はプログラム終了まで有効だが、メモリを確保し続けてしまうので、その必要がなければメモリの無駄になるので注意。
・今回の場合、Updateメソッドが何度もUnityから呼び出され、その中で用いる変数なので、フィールド変数にした方が効率が良い

今週の話題

販売本数ランキング 今回トップは「ペルソナ3 リロード(PS5)」GO!
ドット絵によるアニメーション制作の味方『Aseprite』がSteamなどで50%オフの1025円に(2/14まで)。入門~本格的なゲーム制作まで幅広く活用可能 GO!
『GTA5』累計販売本数が1億9,500万本を突破―『GTA6』トレイラーや12月のアップデートでプレイヤーが増加傾向など決算報告で明らかに GO!
ゲームオーディオのグローバルリーダーAudiokinetic主催「Wwise Tour 2023 Tokyo」イベントレポート&『Hi-Fi RUSH』を手掛けたTango Gameworksインタビュー GO!
ネクソン、過去最高売上も業績予想には届かず―『THE FINALS』は“課金額が予想を上回る”好調スタート、日本では『ブルアカ』が成長 GO!
『The Elder Scrolls II: Daggerfall』有志Unity移植版の制作者が独自作品の開発に着手 GO!
KADOKAWA、アクワイアを100%子会社化―フロム・ソフトウェア、スパイク・チュンソフトとの連携を推進 GO!
ニンテンドースイッチの国内販売台数がニンテンドーDSを超える…気になる次世代機については言及避ける GO!
『ファンパレ』『FF7EC』『プロセカ』のエンジニア・クリエイターが登壇―サイバーエージェント主催の技術カンファレンス3/7開催 GO!
【決算】コロプラの第1四半期は2割の減収、4億1400万の営業赤字で着地 GO!
Unity Japan、大前広樹氏が社長を退任し、再びゲーム開発へ―新社長には産業営業本部長 松本靖麿氏 GO!

『原神』チートツール開発者に対し「可能な限り最高規模の」代償を、カナダで5万ドル規模以上の訴訟が進行中か―海外メディア報道 GO!

前回のコメント

・よりやれることが増えていくのが楽しみです

 何よりです。

・家の機体の容量に余裕があったので家でも少しいじってみたいです

 是非。

・クラスの作成と継承を自分は同じのを何個も作りそうだと思ったのでそこは気を付けていきたいと思いました。

 クラス設計は実戦で経験すると「あー、この為だったのか!」と思うことがあります。
 その時が来ましたら、是非、思い出してください。

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

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

講義メモ 後半

補足:クラスとプロパティについて

・クラスにはメソッドと似た仕掛けのプロパティを定義できる
・プロパティは属性という意味だが、C#では変数に見えるメソッドで、代入や利用にルールを盛り込める仕掛け
・例えば、身長に0以下の値が入って欲しくない場合に「public int bl;」とすると防げない
・そこで「public」を外して「int bl;」とすると外部から扱えなくなる
・これに「public int BL { set { bl = value; } }」とプロパティを書き加えてから
・ルールを加えると良い
  public int BL { set { if (value > 0) {bl = value;} } } //プロパティBLの定義
・この書式がプロパティで、valueキーワードが代入値になる
・クラスにこれを加えると、外部からは「BL = 180;」で呼び出せる
・なお、プロパティには外部からの利用を可能にする「get」も記述できる。制限が必要なければ:
 public int BL { get { return bl; } }」で良い
・よって、まとめるとプロパティの一般形は
  public 型 プロパティ名 { set { 条件 { 変数 = value; } } get { return 変数; } }
 例: public int BL { set { if (value > 0) {bl = value;} } get {return bl; } }

ミニ演習 mini133a

・Monsterクラスに身長の整数変数blと、これを扱うプロパティBodyLenを定義しよう
・プロパティBodyLen はsetで正の数のみに制限し、getは無制限とする
・mini133aクラスで、MonsterクラスのオブジェクトVeldraを生成しよう
・プロパティBodyLen を用いて身長に100をセットし、プロパティBodyLen を用いて出力しよう
・それから、プロパティBodyLen を用いて身長に-5をセットし、プロパティBodyLen を用いて出力しよう(変化しない)

ヒント(Monsterクラス)

class Monster {
  int bl; //身長(外部からは利用不可)
  public int BodyLen { //身長を扱うプロパティ(外部からは利用可)
    set { if (value > 0) { bl = value; } } //代入は正の数のみ許可
    get { return bl; } //利用は自由
  }
}

ヒント(mini133aクラスのStartメソッドの内容)

Monster Veldra = new Monster(); //MonsterクラスのオブジェクトVeldraを生成
Veldra.BodyLen = 100; //プロパティ経由で代入(自動的にsetを実行)
Debug.Log(Veldra.BodyLen); //プロパティ経由で利用(自動的にgetを実行)
Veldra.BodyLen = -5; //プロパティ経由で代入(自動的にsetを実行)⇒blには代入されない
Debug.Log(Veldra.BodyLen); //プロパティ経由で利用(自動的にgetを実行)⇒100のまま変わらない

作成例

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
class Monster { //モンスターを表すクラス
    int bl; //身長(外部からは利用不可)
    public int BodyLen { //身長を扱うプロパティ(外部からは利用可)
        set { if (value > 0) { bl = value; } } //代入は正の数のみ許可
        get { return bl; } //利用は自由
    }
}
public class mini133a : MonoBehaviour {
    void Start() {
        Monster Veldra = new Monster(); //MonsterクラスのオブジェクトVeldraを生成
        Veldra.BodyLen = 100; //プロパティ経由で代入(自動的にsetを実行)
        Debug.Log(Veldra.BodyLen); //プロパティ経由で利用(自動的にgetを実行)
        Veldra.BodyLen = -5; //プロパティ経由で代入(自動的にsetを実行)⇒blには代入されない
        Debug.Log(Veldra.BodyLen); //プロパティ経由で利用(自動的にgetを実行)⇒100のまま変わらない
    }
    void Update() {
        
    }
}

p.133(StartメソッドとUpdateメソッド)

・Unityが用意しているMonoBehaviourクラスを継承して、実行用のクラスを定義する仕掛けはC#の基本的な仕組みのまま
・しかし、MonoBehaviourクラスのもつStartメソッドとUpdateメソッドは、Unity独自の仕組みによって提供されており、
 正式にはメソッドではなく、メッセージと呼ばれる仕組みになっている
・そのため、継承してメソッドを上書きするnewやoverrideの記述が不要になっている

p.134 プロジェクトを作成する

・Unityのバージョンアップにより変更されている
① Unity Hubで「新しいプロジェクト」
②「2Dコア」を選び。プロジェクト名を入力しスクロールダウンして保存場所を入力
③「作成」

p.135 スマートフォンの画面サイズに合わせる

・Unityのバージョンアップにより変更されている
・手順⑤の後で、「Scene」をクリックし、Ctrlキーを押しながらマウスホイールを回して中央の領域を適度に大きくする

提出:mini133a