【学習】Unityで同じことが起きる理由:置き場所という考え方
はじめに
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 でスクリプトが実行されるには、次の条件が必要です。
- シーンに GameObject が存在する
- スクリプトが 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回 | プログラミングは構造で考える:写経を超えた先にあるもの |