U
タブ 01基礎11 レッスン — タップで開く
03 / 11 · 5 分
基礎

class = コンポーネント

ここまでのプロジェクト

まだ読む段階です。ここの Player.cs の形は、レッスン 06 以降に書くすべてのスクリプトの形です。

まずは一言だけ。GameObject ——ゲームの中に存在するもの(床も、カメラも、キャラクターも、弾も)はすべて GameObject です。

GameObject それだけでは、からっぽの人形です。名前と立っている位置はありますが、それだけ——見ることも触れることもできず、何も起きません。

そこに部品をはめ込むと、初めて使える存在になります。部品は一つひとつ component と呼ばれます。これから書く C# の class も、はめ込む部品のうちの一つにすぎません。

アニメーション図

四つの部品が一つずつはめ込まれていくのを見てください。最後のはめ込みが終わって初めて、キャラクターは本当に動き出します。

四つの部品を、やさしい言葉で

  • Transform — どこに立っていて、どの方向を向いていて、どれくらいの大きさか。GameObject は必ずこれを備えており、外すことはできません。

  • Mesh Renderer — 実際に画面へ描き出す部品です。これを取り外すと、キャラクターはそこに残ったまま見えなくなります。

  • Collider — 見えない体です。これがないと、キャラクターは壁も床も突き抜けて歩いてしまいます。

  • Player.cs — 自分が書く部品です。ここで決めます:プレイヤーが W を押したら前へ進む、と。

四つ目の部品を自分で書く

三つまでの部品は Unity が書き終えてくれています。四つ目——頭脳にあたるもの——は C# のファイルです。Unity のスクリプトはどれも同じ形で、あなたが変えるのは波括弧の中身だけです。

Player.cs — the file name must match the class name
using UnityEngine;                          // gives you Vector3, Debug, ...

public class Player : MonoBehaviour         // ": MonoBehaviour" = attachable component
{
    public float speed = 5f;                // shows in the Inspector
    [SerializeField] private int hp = 100;
    private bool isDead;                    // pure code, no Inspector

    void Start()
    {
        Debug.Log(name + " ready, hp = " + hp);
    }
}

カギは ": MonoBehaviour" という一行だけ。これがあるおかげで、普通の C# class が GameObject にはめ込める部品になります。書き忘れると、スクリプトはどこにも付けられなくなります。

  • ファイル名は必ず Player.cs にしてください——Unity はファイル名と class 名を突き合わせていて、ズレていると component を取り付けられません。

  • public = 他のスクリプトから読める、そして Inspector にも表示される。

  • [SerializeField] private = 一番使いやすい既定の形:Inspector からは見えるのに、他のスクリプトからは触れません。

アニメーション図

フィールドはコードの中で一度宣言すれば十分。あとはゲームを動かしながら、Inspector で数値を調整していきます。

スクリプトを作って取り付ける

  1. 1

    Project ウィンドウで Right click▸Create▸MonoBehaviour Script を選びます(古い Unity では C# Script)。

  2. 2

    その場で名前まで入力してください——後からファイル名だけ変えても、中の class 名は変わりません。

  3. 3

    Hierarchy で GameObject を選び、そのスクリプトを Inspector までドラッグします。

  4. 4

    Play を押すと、Debug.Log で出したものはすべて Console ウィンドウに現れます。

他の component にアクセスする

C# スクリプト
private Rigidbody rb;

void Awake()
{
    rb = GetComponent<Rigidbody>();   // on this same object
}