学習記事一覧 · C#写経から学ぶ構造の考え方

【学習】Unityで同じことが起きる理由:置き場所という考え方

← 第5回 | 第6回 | 第7回 →


はじめに

C# の写経で学んだ「構造から作る」という考え方は、Unity でもそのまま当てはまります。

しかし Unity には C# にはない独自の概念があります。それが**「置き場所」**です。

この記事では「なぜ Unity でも同じことが起きるのか」と「Unity の構造の考え方」を解説します。


Unityでよくある失敗

Unity を始めたとき、多くの人がこういう状況に陥ります。

using UnityEngine;
public class Player : MonoBehaviour
{
    void Update()
    {
        transform.Translate(Vector3.forward * Time.deltaTime);
    }
}

このスクリプトを書いて保存したが、何も動かない

エラーも出ない。コードも間違っていない。なのに動かない。

これは C# の「構造が未完成のエラー」と同じ問題です。しかし Unity では形が少し違います。


なぜ動かないのか

理由は一つです。

スクリプトが GameObject にアタッチされていない

Unity でスクリプトが実行されるには、次の条件が必要です。

  1. シーンに GameObject が存在する
  2. スクリプトが GameObject にアタッチされている

スクリプトファイルを作っただけでは、どのゲームオブジェクトにも紐付いていません。


Unity の構造

C# と Unity の構造を対応させると、こうなります。

C# Unity
namespace プロジェクト(Assets全体)
class GameObject(ゲームの物体)
method Component(GameObjectの機能)
処理・プロパティ Inspectorの設定値やコードの中身

「家の例」で考えると:

例え C# Unity
土地 namespace シーン
class GameObject
部屋 method スクリプト(Component)
家具 処理・プロパティ Inspector の設定値

家具を置きたければ家が必要。これが Unity における「置き場所」の概念です。


Unityの正しい手順

ステップ①:シーンにGameObjectを置く

Hierarchy ウィンドウで右クリック → Create Empty(または3D Object など)

シーン
  └── Player(GameObject)

ステップ②:スクリプトを作成する

Project ウィンドウで右クリック → Create → C# Script

Player.cs(スクリプトファイル)

ステップ③:GameObjectにアタッチする

スクリプトを Hierarchy の GameObject にドラッグ&ドロップ、または Inspector から Add Component

シーン
  └── Player(GameObject)
        └── Player.cs(アタッチされたスクリプト)

ステップ④:処理を書く

アタッチが完了してから、スクリプトの中身を実装します。

using UnityEngine;
public class Player : MonoBehaviour
{
    void Update()
    {
        transform.Translate(Vector3.forward * Time.deltaTime);
    }
}

この状態でゲームを実行すると、Player が前に動きます。


C#との比較

項目 C# Unity
構造を作る namespace { class { method { } } } シーンにGOを置いてアタッチ
エラーの原因 波括弧が閉じていない アタッチされていない
動作確認 コンソールに出力 Gameビューで動作
「先に作るもの」 クラスの枠 GameObjectの枠

共通しているのは「処理を書く前に置き場所を作る」という考え方です。


Unityのプロパティも後回しでいい

C# と同じく、Unity でもプロパティ(Inspectorに表示される変数)は後から追加で構いません。

// 動くことを確認してから追加する
public float speed = 5f;

まず動く状態を作り、調整が必要になってから speed を追加するのが正しい順番です。


よくある間違い:複数のGameObjectで止まる

C# で「複数クラスが出てくると止まる」のと同じように、Unity でも「複数の GameObject が出てくると止まる」ことがあります。

// Player スクリプトの中で Enemy を参照したい
Enemy enemy = FindObjectOfType<Enemy>();

このコードが動かない理由は、シーンに Enemy GameObject が存在しないか、Enemy スクリプトがアタッチされていないからです。

対処は同じです。シーンに Enemy GameObject を置き、Enemy スクリプトをアタッチする。


まとめ

  • Unity でもスクリプトを「置き場所なし」で書いても動かない
  • 動かすには「シーン → GameObject → スクリプトのアタッチ → 処理」の順
  • C# の「構造から作る」と同じ考え方
  • プロパティ(public 変数)は動いてから追加する
  • 複数 GameObject でも「先に置いてからアタッチ」が基本

次の記事

このシリーズのまとめです。「構造で考える」という思考の転換が、C# でも Unity でも何を変えるのかを整理します。

第7回:プログラミングは構造で考える:写経を超えた先にあるもの


シリーズ一覧

タイトル
ハブ C#の写経がつらい理由と、正しい学習手順【完全版】
第1回 なぜC#の写経はつらいのか:赤い波線の正体
第2回 正しいC#の書き方:namespace→class→methodの順番
第3回 プロパティはいつ書くべきか:最後でOKな理由
第4回 エラーが出たらどうするか:その場で潰す技術
第5回 複数クラスで止まる理由:依存関係を理解する
第6回(この記事) Unityで同じことが起きる理由:置き場所という考え方
第7回 プログラミングは構造で考える:写経を超えた先にあるもの