この内容は古いバージョンです。最新バージョンを表示するには、戻るボタンを押してください。
バージョン:4
ページ更新者:T
更新日時:2026-06-11 07:10:02

タイトル: スクリプトの作成と実行
SEOタイトル: Unity C# スクリプト作成・実行完全ガイド

この記事の要点
  • Unity のスクリプトは C# で書き、Project ウィンドウ → 右クリック → Create → C# Script から作成
  • 新規スクリプトは自動で MonoBehaviour を継承し、Start()Update() が用意される
  • スクリプトを動かすには GameObject にアタッチ(ドラッグ&ドロップ)が必須
  • public 変数は Inspector に表示され、コードを書き換えずにエディタから調整可能
  • Play モードで動作確認、Debug.Log() で Console に出力

Unity スクリプトの基本

Unity のゲームロジックは C# スクリプトとして記述し、ゲームオブジェクト(GameObject)にコンポーネントとして追加することで動作させます。スクリプト 1 つが「振る舞い 1 つ」を表す設計です。

STEP1: 新規スクリプトを作成

Project ウィンドウ(通常は画面下部)で右クリック → Create → C# Script を選択します。

Unity スクリプト作成 - Create メニュー

命名規則のポイント:

  • パスカルケース(先頭大文字)が Unity の慣例。例: PlayerController, EnemyAI, GameManager
  • ファイル名 = クラス名でなければならない。後から変更する場合はクラス名も同時に変える必要がある
  • スペース・日本語・記号を入れない(コンパイルエラーの原因)
  • 用途が明確に分かる名前を付ける(Script1 等は避ける)

STEP2: スクリプトの初期構造

作成直後のスクリプトは以下のような骨組みになっています:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class PlayerController : MonoBehaviour
{
    // Start is called before the first frame update
    void Start()
    {
        Debug.Log("PlayerController スタート");
    }

    // Update is called once per frame
    void Update()
    {
        // 毎フレーム呼ばれる
    }
}
要素意味
MonoBehaviourUnity のスクリプト基底クラス。これを継承するクラスは GameObject にアタッチ可能
Start()シーン読み込み後、Update より前に 1 回だけ呼ばれる
Update()毎フレーム呼ばれる。FPS が 60 なら 1 秒に 60 回
FixedUpdate()物理演算用。固定間隔(既定 0.02 秒)で呼ばれる
Awake()Start よりも前、GameObject 生成時に呼ばれる

STEP3: Visual Studio でコードを編集

スクリプトをダブルクリックすると Visual Studio(Windows)/ Visual Studio for Mac / Rider などが起動します。IntelliSense(自動補完)で快適に編集できます。

Unity スクリプト編集 - Visual Studio

Visual Studio が起動しない場合は、Unity の Edit → Preferences → External Tools → External Script Editor で IDE を指定します。

STEP4: GameObject にアタッチ

スクリプトを実際に動かすには、Hierarchy 内の GameObject にアタッチする必要があります。方法は以下のいずれか:

  1. Project ウィンドウからスクリプトをドラッグして GameObject にドロップ
  2. GameObject を選択 → Inspector の下部にある 「Add Component」 → スクリプト名で検索
  3. メニューバー → Component → Scripts → 該当スクリプト

Unity スクリプト - GameObject にアタッチ

STEP5: public 変数で Inspector 公開

クラスのpublic フィールドは自動的に Inspector に表示され、プログラムを書き換えずにエディタ上で値を調整できます。

using UnityEngine;

public class PlayerController : MonoBehaviour
{
    // Inspector に表示される
    public float moveSpeed = 5.0f;
    public int playerHp = 100;
    public string playerName = "Hero";
    public GameObject bulletPrefab;  // プレハブもドラッグ&ドロップで設定

    // private は表示されない([SerializeField] を付けると表示)
    [SerializeField] private float jumpPower = 7.0f;

    // 完全に非表示にしたい場合
    [HideInInspector] public int secretValue;

    void Update()
    {
        // 水平方向の入力(A/D キー、矢印キー、ゲームパッド)
        float horizontal = Input.GetAxis("Horizontal");

        // Translate で移動(Time.deltaTime でフレームレート非依存)
        transform.Translate(Vector3.right * horizontal * moveSpeed * Time.deltaTime);

        // スペースキーでログ
        if (Input.GetKeyDown(KeyCode.Space))
        {
            Debug.Log("ジャンプ! Power = " + jumpPower);
        }
    }
}

STEP6: Play モードで実行

画面上部中央の▶(Play)ボタンをクリックすると、シーンが実行されます。Game ウィンドウで動作確認しながら、Console ウィンドウで Debug.Log() 出力を確認できます。

Unity スクリプト - Play モードで実行

ボタン動作
▶ Playシーンを実行 / 停止
⏸ Pause実行を一時停止(変数を Inspector で確認できる)
⏭ Step1 フレームだけ進める(バグ調査に便利)

重要: Play モード中に Inspector で変更した値は、Play 停止時にすべて元に戻ります。永続化したい変更は必ず Play 停止後に行いましょう。

Debug.Log の使い方

// 通常ログ
Debug.Log("こんにちは");

// 警告(黄色)
Debug.LogWarning("注意: HP が少ない");

// エラー(赤)
Debug.LogError("敵が出現しなかった");

// 変数を含めて出力
Debug.Log($"HP: {playerHp}, Position: {transform.position}");

// 条件付きログ(リリースビルドで自動的に削除)
[System.Diagnostics.Conditional("UNITY_EDITOR")]
void EditorOnlyLog(string msg) { Debug.Log(msg); }

よくあるトラブル

症状原因対処
スクリプトが動かないGameObject にアタッチしていないドラッグ&ドロップで追加
Can't add scriptファイル名とクラス名が不一致名前を揃える
Inspector に変数が出ないprivate のままpublic か [SerializeField]
動きがフレームレートで変わるTime.deltaTime 未使用移動量に * Time.deltaTime
NullReferenceException未参照のフィールド使用Awake / Start で GetComponent

FAQ

Q: スクリプトの名前を変えたい
A: Project でファイル名を変更したら、ファイル内のクラス名も同じ名前に書き換える必要があります。

Q: 1 つのスクリプトを複数の GameObject にアタッチできる?
A: できます。それぞれが独立したインスタンスとして動作し、Inspector の値も個別に持ちます。

Q: Start と Awake の使い分けは?
A: Awake は GameObject 生成直後、Start はその後の最初のフレームの直前。他オブジェクト参照の初期化は Start が安全です。