【学習】Unity で C# を学ぶなら「new」から一歩進もう(Player と Enemy で体験するオブジェクトの世界)

広告

Unity の学習初期では、C# の理解を優先して次のようなコードを書くことがあります。

Player myPlayer = new Player();

これは「クラスからインスタンスを生成する」という意味では正しいのですが、Unity の世界観とは少しズレています

今回はこのコードを出発点にして、「Unity らしい書き方」へ一歩進める方法を紹介します。


なぜ「Unity っぽくない」のか?

Unity では、基本的に次のように考えます。

  • すでにシーン上にオブジェクトが存在している
  • それにスクリプトが付いている
  • オブジェクト同士を「つなぐ」

つまり、

自分で new するより、既にあるものを使う

という世界です。


今日のゴール

次の構成を作ります。

  • Player(プレイヤー)
  • Enemy(敵)

そして、

  • Player が攻撃する
  • Enemy がダメージを受ける

という流れを、Unity のオブジェクト同士で実現します。


Player スクリプト

using UnityEngine;

public class Player : MonoBehaviour
{
    private int hp = 100;
    private int power = 50;

    // Inspector で設定する
    public Enemy enemy;

    void Start()
    {
        Attack();
        enemy.Damage(power);
    }

    public void Attack()
    {
        Debug.Log("プレイヤーが攻撃!");
    }

    public void Damage(int damage)
    {
        hp -= damage;
        Debug.Log("プレイヤーは " + damage + " ダメージを受けた");
    }
}

Enemy スクリプト

using UnityEngine;

public class Enemy : MonoBehaviour
{
    private int hp = 80;

    public void Damage(int damage)
    {
        hp -= damage;
        Debug.Log("敵は " + damage + " ダメージを受けた");

        if (hp <= 0)
        {
            Debug.Log("敵を倒した!");
        }
    }
}

Unity 側の設定手順(ここが一番重要)

① オブジェクトを作成

  • Hierarchy で右クリック → Create Empty(名前を Player と Enemy にする)

② スクリプトをアタッチ

  • Player オブジェクト → Player.cs
  • Enemy オブジェクト → Enemy.cs

③ 参照をつなぐ

  • Player を選択
  • Inspector の Enemy 欄に、Enemy オブジェクトをドラッグして代入

プログラムの流れ

Play 開始
    ↓
Start() が実行される
    ↓
Attack() … ログ出力
    ↓
enemy.Damage(power) … Inspector でつないだ Enemy の HP が減る

ここが一番大事な理解ポイント

今回の変更で何が起きているかというと、次の対比です。

考え方内容
Before(C# 中心)Player myPlayer = new Player(); → 自分で作る
After(Unity)すでにあるものを使う → Inspector でつなぐ

よくある誤解(ここは必ず伝えたい)

「Unity では new を使わないの?」

→ 使います。
ただし、まずは次の感覚で十分です。

  • GameObject や MonoBehaviour の“シーン上の役割” … 基本は new しない(シーンと Inspector で用意する)
  • リスト、構造体、データ用のクラス … new してよい

少しだけゲームっぽくする(発展)

スペースキーが押されたときだけ攻撃する例です。

void Update()
{
    if (Input.GetKeyDown(KeyCode.Space))
    {
        Attack();
        enemy.Damage(power);
    }
}

補足: 本シリーズの 入力の取得 では Input System を使います。ここでは「Update でキーを検知する」イメージのため、レガシー入力の例にしています。


この教材の狙い

このサンプルは単なる攻撃処理ではありません。次の理解につながります。

  • クラス … 設計図
  • GameObject … シーン上の実体
  • public 変数(参照) … 他コンポーネントとの接続ポイント

講師視点の補足

この段階で重要なのは、

  • 完璧な理解ではない
  • 「違いを体験すること」

です。

WinForms では 自分で仕組みを作る 側面が強い一方、Unity では すでにある仕組みの上で作る ことが多いです。この違いを、コードの説明だけでなく体験でつかんでもらうのがポイントです。


次のステップ

  • public や SerializeField をさらに使いこなす … 変数と Inspector での編集
  • 実行時にオブジェクトを生成する … プレハブと生成Instantiate との違いはここで整理できます)
  • 参照の取り方のバリエーションFind / GetComponent の使いどころなど)は、別記事や発展課題で扱えます。

まとめ

Unity で C# を学ぶときは、

  • 最初は「new」で理解してよい
  • 次に「つなぐ世界」に移行する

この順番がとても大切です。

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

広告

Unity

Posted by hidepon