Version: 2022.1
言語: 日本語
重要なクラス
重要なクラス - MonoBehaviour

重要なクラス - GameObject

Unity’s GameObject class represents anything which can exist in a Scene.

このページは、Unity の GameObject クラスを使う スクリプト に関するものです。Unity エディターのシーンや Hierarchy でのゲームオブジェクトの使い方については、ユーザーマニュアルの ゲームオブジェクト を参照してください。GameObject クラスのすべてのメンバーを参照するには、GameObject のスクリプトリファレンス を参照してください。

ゲームオブジェクトは、Unity のシーンを構成するブロックであり、ゲームオブジェクトの見た目や機能を決定する機能コンポーネントのコンテナとして機能します。

In scripting, the GameObject class provides a collection of methods which allow you to work with them in your code, including finding, making connections and sending messages between GameObjects, and adding or removing components attached to the GameObject, and setting values relating to their status within the scene.

シーン状態のプロパティ

You can use scripts to modify many properties related to a GameObject’s status in the scene. These typically correspond to the controls visible near the top of the inspector when you have a GameObject selected in the Editor.

これらは特定のコンポーネントに関連するものではなく、ゲームオブジェクトの Inspector では、コンポーネントのリストの上に表示されています。

Inspector で表示される典型的なゲームオブジェクトです。ここでは、ディレクショナルライトを使用しています。シーンの状態を示すプロパティが赤で表示されています。
Inspector で表示される典型的なゲームオブジェクトです。ここでは、ディレクショナルライトを使用しています。シーンの状態を示すプロパティが赤で表示されています。

すべてのゲームオブジェクトには、Inspector の上部にシーン内でのゲームオブジェクトの状態を示すコントロールがあり、これらはゲームオブジェクトのスクリプティング API で制御できます。

GameObject クラスで利用できるすべての API の一覧は、GameObject のスクリプトリファレンスを参照してください。

アクティブ状態

アクティブ状態
アクティブ状態

ゲームオブジェクトはデフォルトではアクティブですが非アクティブにすることもでき、非アクティブの場合はゲームオブジェクトに接続されているすべてのコンポーネントがオフになります。これは一般的に不可視状態になり、通常のコールバックや、UpdateFixedUpdate などのイベントを受け取らなくなることを意味します。

ゲームオブジェクトが アクティブ であるかは、ゲームオブジェクトの名前の左にあるチェックボックスで示されます。これは GameObject.SetActive で制御できます。

You can also use GameObject.activeSelf to read the current active state of a GameObject. Use GameObject.activeInHierarchy to read whether the GameObject is actually active in the scene. GameObject.activeInHierarchy is necessary because whether a GameObject is actually active is determined by its own active state and the active state of all of its parents. If any of its parents aren’t active, then it’s not active despite its own active setting.

静的状態

ゲームオブジェクトの静的状態
ゲームオブジェクトの静的状態

グローバルイルミネーション、オクルージョン、バッチング、ナビゲーション、リフレクションプローブなど、Unity のシステムの中には、ゲームオブジェクトの静的な状態に依存するものがあります。 GameObjectUtility.SetStaticEditorFlags を使うことによって、Unity のどのシステムがゲームオブジェクトを 静的 とみなすかを制御できます。詳しい情報は、静的ゲームオブジェクト を参照してください。

Tag と Layer

The Tag and Layer fields of a GameObject
The Tag and Layer fields of a GameObject

Tag (タグ) は、シーン内のゲームオブジェクトの種類をマークして識別する方法です。Layer (レイヤー) は似ていますが、レンダリング物理的衝突 などの特定のビルトインアクションから、ゲームオブジェクトのグループを加えたり、除外したりするための別の方法です。

エディターでのタグやレイヤーの使用方法については、TagLayer のユーザーマニュアルを参照してください。

You can modify tag and layer values via script using the GameObject.tag and GameObject.layer properties. You can also check a GameObject’s tag efficiently by using the CompareTag method, which includes validation of whether the tag exists, and doesn’t cause any memory allocation.

コンポーネントの追加と削除

ランタイムにコンポーネントを追加したり削除したりすることができます。これは、ゲームオブジェクトをプロシージャルに作成したり、ゲームオブジェクトの動作を変更したりするのに便利です。ノート: スクリプトコンポーネントやいくつかのタイプのビルトインコンポーネントを、破棄せずにスクリプトを使って enable または disable (有効、または無効) にできます。

ランタイムにコンポーネントを追加する最善の方法は、AddComponent <Type> を使用して、コンポーネントのタイプを < > で囲って指定します。コンポーネントを削除するには、コンポーネント自体に Object.Destroy メソッドを使用する必要があります。

コンポーネントへのアクセス

最も単純なケースは、ゲームオブジェクト上のスクリプトが同じゲームオブジェクトにアタッチされた別のコンポーネントにアクセスする必要がある場合です (ゲームオブジェクトにアタッチされた他のスクリプトもまた、コンポーネントであることに注意してください)。 これを行うための最初のステップは、操作したいコンポーネントインスタンスへの参照を取得することです。これは、GetComponent メソッドを使用して行えます。 通常、コンポーネントオブジェクトを変数に割り当てる必要があります。これは、以下のコードを使用して行います。 この例では、スクリプトは同じゲームオブジェクト上の Rigidbody コンポーネントへの参照を取得します。

void Start ()
{
    Rigidbody rb = GetComponent<Rigidbody>();
}

コンポーネントインスタンスへの参照が取得できた後は、インスペクター上で行うのと同様にプロパティーの値を設定できます。

void Start ()
{
    Rigidbody rb = GetComponent<Rigidbody>();

    // オブジェクトの Rigidbody の質量を変更
    rb.mass = 10f;
}

また、例えばコンポーネントリファレンスのメソッドを呼び出すこともできます。

void Start ()
{
    Rigidbody rb = GetComponent<Rigidbody>();

    // Rigidbody に力を加える
    rb.AddForce(Vector3.up * 10f);
}

ノート: 同じゲームオブジェクトに複数のカスタムスクリプトをアタッチすることができます。あるスクリプトに別のスクリプトからアクセスする必要がある場合は、通常通り GetComponent を使用し、スクリプトクラスの名前 (またはファイル名) を使って、必要なコンポーネントタイプを指定するだけです。

もしゲームオブジェクトに加えられていないコンポーネントタイプを取得しようとすると、GetComponent は null を返します。ランタイムに null オブジェクトの値を変更しようとすると、null 参照エラーとなります。

他のゲームオブジェクトのコンポーネントにアクセスする

Although they sometimes operate in isolation, it’s common for scripts to keep track of other GameObjects, or more commonly, components on other GameObjects. For example, in a cooking game, a chef might need to know the position of the stove. Unity provides a number of different ways to retrieve other objects, each appropriate to certain situations.

Inspector の変数を使ってゲームオブジェクトにリンクする

関連するゲームオブジェクトを見つけるもっとも簡単な方法は public であるゲームオブジェクト変数をスクリプトに加えることです。

public class Chef : MonoBehaviour
{
    public GameObject stove;

    // 他の変数と関数...
}

この変数は、Inspector で、 GameObject フィールド として表示されます。

この変数に、シーンや Hierarchy ウィンドウからオブジェクトをドラッグして割り当てることができます。

プレハブを Project ウィンドウから Inspector ウィンドウの Game Object フィールドにドラッグする
プレハブを Project ウィンドウから Inspector ウィンドウの Game Object フィールドにドラッグする

このオブジェクトは他と同様に GetComponent 関数およびコンポーネントにアクセスできる変数を利用できます。そのため、以下のようなコードを使用できます。

public class Chef : MonoBehaviour {

    public GameObject stove;

    void Start() {
        //コンロの前のシェフ 2 units を開始
        transform.position = stove.transform.position + Vector3.forward * 2f;
    }
}

さらに、もしスクリプトの中でコンポーネント型の public である変数を宣言すると、コンポーネントがアタッチされている任意のゲームオブジェクトをその上にドラッグできます。これはゲームオブジェクト自身ではなくコンポーネントに直接アクセスします。

public Transform playerTransform;

Linking objects together with variables is most useful when you are dealing with individual objects that have permanent connections. You can use an array variable to link several objects of the same type, but the connections must still be made in the Unity editor rather than at runtime. It’s often convenient to locate objects at runtime and Unity provides two basic ways to do this, as described below.

子ゲームオブジェクトの検索

Sometimes, a game Scene makes use of a number of GameObjects of the same type, such as collectibles, waypoints and obstacles. These might need to be tracked by a particular script that supervises or reacts to them (for example, all waypoints might need to be available to a pathfinding script). Using variables to link these GameObjects is a possibility but it makes the design process tedious if each new waypoint has to be dragged to a variable on a script. Likewise, if a waypoint is deleted, then it’s a nuisance to have to remove the variable reference to the missing GameObject. In cases like this, it is often better to manage a set of GameObjects by making them all children of one parent GameObject. The child GameObjects can be retrieved using the parent’s Transform component (because all GameObjects implicitly have a Transform):

using UnityEngine;

public class WaypointManager : MonoBehaviour {
    public Transform[] waypoints;

    void Start()
    {
        waypoints = new Transform[transform.childCount];
        int i = 0;

        foreach (Transform t in transform)
        {
            waypoints[i++] = t;
        }
    }
}

名前を指定して特定の子オブジェクトを見つけるには Transform.Find メソッドを使用します。 transform.Find("Frying Pan");

これは、ゲーム中に追加や削除が可能な子ゲームオブジェクトを持つゲームオブジェクトの場合に便利です。ゲーム中に手に取ったり置いたりできる道具などは、この良い例です。

メッセージの送信

While editing your project you can set up references between GameObjects in the Inspector. However, sometimes it’s impossible to set up these in advance (for example, finding the nearest item to a character in your game, or making references to GameObjects that were instantiated after the Scene loaded). In these cases, you can find references and send messages between GameObjects at runtime.

BroadcastMessage は、そのメソッドが実装されるべき場所を特定せずに、呼び出しを名前の付いたメソッドに送信できます。BroadcastMessage は、特定のゲームオブジェクトやその子のすべての MonoBehaviour の名前付きのメソッドを呼び出すことができます。任意で、少なくとも 1 つのレシーバーが必要であることを選択できます (エラーが発生する場合もあります)。

SendMessage はもう少し具体的で、ゲームオブジェクトの名前付きメソッドのみへの呼び出しを送信し、その子へは送信しません。

SendMessageUpwards も似ていますが、ゲームオブジェクトとその全ての親の名前付きメソッドに呼び出しを送ります。

名前やタグでゲームオブジェクトを探す

It’s always possible to locate GameObjects anywhere in the Scene hierarchy as long as you have some information to identify them. Individual objects can be retrieved by name using the GameObject.Find function:

GameObject player;

void Start()
{
    player = GameObject.Find("MainHeroCharacter");
}

オブジェクトまたはその集合をタグを使用して見つけるには GameObject.FindWithTagGameObject.FindGameObjectsWithTag 関数を使用します。

例えば、1 人のシェフキャラクターがいる料理ゲームで、キッチンには複数のコンロがある場合 (それぞれ “Stove” (コンロ) というタグがついています)。

GameObject chef;
GameObject[] stoves;

void Start()
{
    chef = GameObject.FindWithTag("Chef");
    stoves = GameObject.FindGameObjectsWithTag("Stove");
}

ゲームオブジェクトの作成および削除

プロジェクトの実行中に、ゲームオブジェクトを作成したり破棄したりすることができます。Unity では、既存のオブジェクトの新しいコピーを作成する Instantiate メソッドを使ってゲームオブジェクトを作成します。

ゲームオブジェクトをインスタンス化する方法の詳細と例については、ランタイムのプレハブのインスタンス化 を参照してください。

The Destroy method destroys an object after the frame update has finished or optionally after a short time delay:

void OnCollisionEnter(Collision otherObj) {
    if (otherObj.gameObject.tag == "Garbage can") {
        Destroy(gameObject, 0.5f);
    }
}

Note that the Destroy function can destroy individual components and not affect the GameObject itself. A common mistake is to write this and assume it destroys the GameObject the script is attached to:

 Destroy(this);

this represents the script, and not the GameObject. It will actually just destroy the script component that calls it and leave the GameObject intact but with the script component removed.

プリミティブ

GameObject クラスは、Unity の GameObject メニューで利用可能なオプションの代わりに、スクリプトベースで プリミティブなオブジェクト を作成することができます。

Unity のビルトインプリミティブのインスタンスを作成するには、GameObject.CreatePrimitive を使用します。これは、指定したタイプのプリミティブをインスタンス化します。利用可能なプリミティブのタイプは、SphereCapsuleCylinderCube、Plane](../ScriptReference/PrimitiveType.Plane.html)、Quad です。

Unity の GameObject メニューで利用できるプリミティブ形状
Unity の GameObject メニューで利用できるプリミティブ形状
重要なクラス
重要なクラス - MonoBehaviour