Day35 ウォームアップ(10分)【Unity 橋渡し③:Player が Enemy を攻撃】

広告

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

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


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

  1. Day35.cs を追加するプロジェクト「MiniPractice」に Day35.cs を追加)
  2. Program.cs を Day34.Run() から Day35.Run() に書き換える

最初に:コードの形を確認

Player が Enemy を引数に取る Attack でダメージを与える形にします(別インスタンス同士のメソッド呼び出し)。Unity では「プレイヤーの入力 → 敵に当たった → 敵の TakeDamage」のような流れがよく出てきます。

internal class Day35
{
    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;
        }
    }

    class Player
    {
        public string Name { get; set; }
        public int AttackPower { get; set; }

        public void Attack(Enemy target)
        {
            target.TakeDamage(AttackPower);
        }
    }

    public static void Run()
    {
        // ここに書く
    }
}
  • Attack(Enemy target) … 呼び出すと target 側の TakeDamage が動きます(this ではなく target
  • Player と Enemy は別々に new します

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

教材では 簡潔な出力例を載せています。ロジックが正しければ、ラベル付き出力も可です。


🔹 Day34 の振り返り(1分)

  • Heal と TakeDamage の順で結果が変わる
  • 今日のポイント:**攻撃する側(Player)**が **攻撃される側(Enemy)**を 引数で受け取る

進め方(10分の使い方)

  • 最初の5分 … 自力。後半5分 … 過去コード閲覧OK。

1限の過ごし方(目安)

時間(目安)内容
0〜15分ウォームアップ
15〜45分学習時間
45〜50分振り返りなど

提出ルール(重要)

  • 提出A … 問題1のみ / 提出B … 問題1・2 / 提出C … 問題1〜3(+発展)
  • Slack:「Day35 完了しました」

■ 問題1(基礎)

次の Player と Enemy を1体ずつ作り、Attack を2回呼び出してください。

Player p = new Player { Name = "勇者", AttackPower = 18 };
Enemy e = new Enemy { Name = "スライム", Hp = 50 };
  • p.Attack(e); を2回(同じ e に対して)
  • つぎの 2行 を表示する
    1. e.Name
    2. e.Hp(教材の例では 50 − 18 − 18 = 14 なので 14

■ 問題2(条件)

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

Player p = new Player { Name = "勇者", AttackPower = 20 };
Enemy[] enemies =
{
    new Enemy { Name = "スライム",  Hp = 40 },
    new Enemy { Name = "ゴブリン", Hp = 25 },
    new Enemy { Name = "オーク",   Hp = 60 },
};

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

  • 教材のデータでは 3体とも生存スライムゴブリンオーク の 3行

■ 問題3(集計)

同じ enemies(問題2と同じ処理のあと)について、IsAlive() が true の 体数を 1行で表示してください。

  • 教材のデータでは 3

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

次の enemies2 について、**同じ Player(AttackPower は 22)**で 各 Enemy に Attack を1回ずつ呼び出してください。

Player p2 = new Player { Name = "勇者", AttackPower = 22 };
Enemy[] enemies2 =
{
    new Enemy { Name = "スライム",  Hp = 55 },
    new Enemy { Name = "ゴブリン", Hp = 12 },
    new Enemy { Name = "オーク",   Hp = 90 },
    new Enemy { Name = "ドラゴン", Hp = 35 },
};

IsAlive() が true だけを List<Enemy> に入れ、つぎの 順序どおりに表示してください。

  1. 各 Name(1行ずつ)
  2. Hp の合計(1行)
  3. Hp の平均(整数割り算、1行)
  4. Hp の最大(1行)
  5. Hp の最小(1行)

数値の目安(攻撃後、Hp は 33, 0, 68, 13。生存は 3体)… 合計 114、平均 38、最大 68、最小 13


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

Enemy に IsEmergency() メソッドを追加してください。

  • 戻り値:bool
  • IsAlive() が true かつ Hp が 15 以下のとき true

enemies2 の攻撃IsEmergency() が true になる Enemy の Name を1行ずつ表示してください。

  • 教材の目安:ドラゴン の 1行Hp が 13 のため)

⚠️ つまずきやすい点

  • p.Attack(e) … 引数 e の Hp が減ります(p.Hp はありません
  • Attack を複数回 … 同じ Enemy に続けて呼ぶと その分だけ TakeDamage が重ねられる、と説明できるとよいです

🎯 今日の目的

  • 参照型として Enemy を Player に渡す感覚(Unity では Collider や Raycast で「相手」を取得して TakeDamage などにつながる)

次へ

このウォームアップ本線は Day35 で完結です。

Day36 以降は 講師・スライド・Slack の指示に従ってください(複数体の整理小まとめなど、教室で案内される内容に進みます)。

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

広告

C#

Posted by hidepon