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 の上部にシーン内でのゲームオブジェクトの状態を示すコントロールがあり、これらはゲームオブジェクトのスクリプティング API で制御できます。
GameObject クラスで利用できるすべての API の一覧は、GameObject のスクリプトリファレンスを参照してください。
ゲームオブジェクトはデフォルトではアクティブですが非アクティブにすることもでき、非アクティブの場合はゲームオブジェクトに接続されているすべてのコンポーネントがオフになります。これは一般的に不可視状態になり、通常のコールバックや、Update
や FixedUpdate
などのイベントを受け取らなくなることを意味します。
ゲームオブジェクトが アクティブ であるかは、ゲームオブジェクトの名前の左にあるチェックボックスで示されます。これは 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 (レイヤー) は似ていますが、レンダリング や 物理的衝突 などの特定のビルトインアクションから、ゲームオブジェクトのグループを加えたり、除外したりするための別の方法です。
エディターでのタグやレイヤーの使用方法については、Tag と Layer のユーザーマニュアルを参照してください。
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.
関連するゲームオブジェクトを見つけるもっとも簡単な方法は public であるゲームオブジェクト変数をスクリプトに加えることです。
public class Chef : MonoBehaviour
{
public GameObject stove;
// 他の変数と関数...
}
この変数は、Inspector で、 GameObject フィールド として表示されます。
この変数に、シーンや Hierarchy ウィンドウからオブジェクトをドラッグして割り当てることができます。
このオブジェクトは他と同様に 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.FindWithTag、GameObject.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 を使用します。これは、指定したタイプのプリミティブをインスタンス化します。利用可能なプリミティブのタイプは、Sphere、Capsule、Cylinder、Cube、Plane](../ScriptReference/PrimitiveType.Plane.html)、Quad です。