Day33 ウォームアップ(10分)【Unity 橋渡し①:コンポーネントっぽいクラス】

広告

第2部:Unity 橋渡し(Day33〜Day35)

※10分の使い方は、「進め方(10分の使い方)」を参照
※生成AIは使いません
※全部できなくてOK
※今日のゴール目安:提出A(問題1が動く)で合格、提出B(1・2)で標準到達、提出C+発展で上位到達


今日の準備(ウォームアップの前に)

  1. Day33.cs を追加する(ソリューションエクスプローラーで、ソリューションの下にある プロジェクト「MiniPractice」を右クリック → 追加 → クラス → 名前を Day33.cs
  2. Program.cs を開き、Main 内の Day32.Run() を Day33.Run() に書き換える

最初に:今日のクラスの形を確認

今日から Unity の MonoBehaviour に近い文脈の練習に入ります。まだ Unity プロジェクトは使いません(いつもの コンソールの MiniPractice のままです)。

ゲームに出てくる敵をイメージした Enemy クラスを、Day33 の中に nested で定義します。

internal class Day33
{
    class Enemy
    {
        public string Name { get; set; }
        public int Hp { get; set; }

        public void TakeDamage(int amount)
        {
            Hp -= amount;
            if (Hp < 0)
            {
                Hp = 0;
            }
        }

        public bool IsAlive()
        {
            return Hp > 0;
        }
    }

    public static void Run()
    {
        // ここに書く
    }
}
  • Hp … Unity では HP と書くことが多いですが、C# のプロパティ名は Hp(先頭だけ大文字)にそろえます
  • TakeDamage … ダメージを受けて Hp が減ります。0 未満にならないよう、0 で止める処理が入っています
  • IsAlive … Hp が 1 以上なら true(倒れていなければ true

Unity とのつながり(イメージ)
Unity では「敵の体力」「ダメージを受ける」などを コンポーネント(クラス) に書きます。今日は コンソール上で同じ考え方(フィールド+メソッド)を体に覚えさせます。


🔹 出力について(教材共通)

教材では 簡潔な出力例(個数だけ・該当語のみ・数値のみなど)を載せています。条件・数え方・集約が正しければConsole.WriteLine に「HP:」などのラベルや、$"…: {値}" のような説明付きで出しても構いません。


🔹 Day30 の振り返り(1分)

  • LINQ … Where / Count / Sum で、条件付きの列を短く書けました
  • 今日のポイントループや LINQ より前に、「1体の敵が TakeDamage すると Hp がどう変わるか」を newとメソッド呼び出しで確かめます

🔹 今日のポイント

やりたいこと
敵を1体作るEnemy e = new Enemy { Name = "スライム", Hp = 40 };
ダメージを与えるe.TakeDamage(30);
まだ生きているかif (e.IsAlive()) { ... }
配列を回すforeach (Enemy e in enemies) { ... }

進め方(10分の使い方)

  • 最初の5分:教科書・ノート・これまで自分が書いたコードも見ずに、自分の力だけで書いてみましょう。止まっても構いません。思い出そうとする時間が大事です。
  • 後半5分:教科書・ノート・これまで自分が書いたコードを見てOKです。「どこを見ればよいか」「どう直せばよいか」を考えながら、完成に近づけましょう。

1限の過ごし方(目安)

細かい指示は Slack・スライド・口頭 に従ってください(教室のホワイトボードなどに書かれた内容があれば、それも含みます)。

時間(目安)内容
0〜15分ウォームアップ(準備・今日の課題・提出・動作確認)。課題の進め方は下の**「進め方(10分の使い方)」**のとおりです。
15〜45分学習時間これまでの Day 課題(提出コードの見直し・未完成の続き)、教科書の自習・予習など。Slack・スライド・口頭の指示を最優先)
45〜50分振り返りなど(指示に従う)
  • 提出が終わったら(ウォームアップの途中でも可)… Commit/Push と Slack「Day33 完了」は提出ルールに従い、採点を待たず次の学習に進みます。

提出ルール(重要)

  • 提出A(最低ライン):問題1だけ動けばOK
  • 提出B(標準):問題1・2まで
  • 提出C(到達):問題1・2・3(余裕があれば発展)
  • 提出方法:GitHub Desktop で Commit → Push してください。1問ごとでも、まとめて1回でもOKです。
  • Slack:「Day33 完了しました」と一言送ってください。

■ 問題1(基礎)

次の Enemy を1体Run() の中で作ってください。

  • Name は "スライム"
  • Hp は 40

つづけて TakeDamage(30) を1回呼び出し、つぎの 2行 を表示してください。

  1. Name(文字列そのもの)
  2. Hp の値(数値そのもの。教材の例では 10 になります)

■ 問題2(条件)

次の enemies 配列を Run() の中に用意してください。

Enemy[] enemies =
{
    new Enemy { Name = "スライム",  Hp = 40 },
    new Enemy { Name = "ゴブリン", Hp = 0 },
    new Enemy { Name = "オーク",   Hp = 25 },
};

IsAlive() が true になる Enemy だけについて、Name を1行ずつ表示してください。

  • 教材のデータでは スライム と オーク の 2行 になります(ゴブリン は Hp が 0 なので IsAlive() は false

■ 問題3(集計)

同じ enemies 配列について、IsAlive() が true になる Enemy が 何体いるかを数え、個数だけを1行で表示してください。

  • 教材のデータでは 2 です

■ 発展A(余裕がある人)

次の enemies2 配列を用意し、各 Enemy に対して TakeDamage(10) を1回ずつ呼び出してください(foreach で構いません)。

Enemy[] enemies2 =
{
    new Enemy { Name = "スライム", Hp = 40 },
    new Enemy { Name = "ゴブリン", Hp = 5 },
    new Enemy { Name = "オーク",   Hp = 80 },
    new Enemy { Name = "ボス",     Hp = 100 },
};

そのあと、IsAlive() が true になる Enemy だけを List<Enemy> に追加し、つぎの 順序どおりに表示してください。

  1. 追加した各 Enemy の Name を 1行ずつforeach で回す)
  2. 追加した Enemy の Hp の合計を 1行
  3. 続けて、Hp の平均を 1行整数割り算でよいです → 合計 / list.Count
  4. 続けて、Hp の最大を 1行
  5. 続けて、Hp の最小を 1行

数値の目安TakeDamage(10) 後):生き残りは スライム(30)オーク(70)ボス(90) の 3体。合計 190、平均 63、最大 90、最小 30


■ 発展B(発展Aが動いたらチャレンジ)

Enemy クラスに IsElite() メソッドを追加しましょう。

  • メソッド名:IsElite
  • 戻り値:bool
  • 中身:Hp が 80 以上のとき true を返す(ちょうど 80 も true

Run 内で IsElite() が true かつ IsAlive() が true になる Enemy の Name を1行ずつ表示してください。

  • 教材の enemies2 で TakeDamage(10) 後なら、オーク は Hp が 70 になり IsElite() は false80 未満のため)なので、ボスだけの 1行 になります
// 呼び出しのイメージ
foreach (Enemy e in list)
{
    if (e.IsElite() && e.IsAlive())
    {
        Console.WriteLine(e.Name);
    }
}

⚠️ つまずきやすい点

  • TakeDamage を呼んだあとに Hp を読む … 問題1では TakeDamage(30) のあとに Console.WriteLine します
  • IsAlive() と Hp > 0 … 今日は IsAlive() を使う練習です(中身は同じ考え方です)
  • 発展Aの平均 … 分母は list.Countenemies2.Length ではない
  • 発展Bの IsElite() … TakeDamage(10) のあとの Hp で判定します(オーク は 70 になりエリート条件を満たしません

🎯 今日の目的

  • **Enemy のような「状態(Hp)+振る舞い(TakeDamage)」**を 1つのクラスにまとめる感覚をつかむ
  • Unity に入ったあと MonoBehaviour のフィールドとメソッドを見たとき、今日の Enemy とつながるようにしておく

次へ

Day34 では、**回復(Heal)**と メソッドを呼ぶ順序をテーマにします。講師・Slack の指示に従って進めてください。

訪問数 19 回, 今日の訪問数 19回

広告

C#,Unity

Posted by hidepon