はじめに
Unityでゲームを作っていると、「あるオブジェクトの状態を、別のオブジェクトのスクリプトから取得したい!」という場面がよくあります。例えば、**「プレイヤーが特定のオブジェクトに触れたら、別のオブジェクトが消える」**という処理を作りたいとき、オブジェクト同士が情報をやり取りする必要があります。
しかし、**「他のスクリプトの変数って、どうやって取得すればいいの?」**と悩むことも多いですよね。特に、bool
(真偽値)を別のスクリプトから取得して、特定の条件を満たしたときに処理を実行するのは、初心者がつまずきやすいポイントの一つです。
この記事では、Unityで**「他のスクリプトのbool
を取得する方法」**を3つ紹介します!
instance
(シングルトン)を使う方法GameObject.Find
を使う方法- フィールドに直接オブジェクトを設定する方法
今回のサンプルでは、以下の動作を実装します。
✅ Sphere
(球体)とCube
(立方体)を用意
✅ Sphere
がCube
にぶつかると、Cube
側のbool
がtrue
になる
✅ Sphere
がbool
の値を取得し、true
なら自分自身を削除する
このような処理を作れるようになれば、ゲームの中でオブジェクト同士を連携させるスクリプトが書けるようになります!
Unity初心者の方も、わかりやすいコードと実践的な解説で学べるので、ぜひ最後まで読んでみてください!
ちなみに、「コードを書くのはちょっと苦手…」「もっと簡単に条件やフラグの管理をしたい!」という方には、
ビジュアルスクリプティングで人気の【PlayMaker】というアセットもおすすめです!
👇詳しくはこちら
▶ PlayMaker(Unity Asset Store)
1. 準備するオブジェクト
まず、Unity上で以下の2つのオブジェクトを作成します。
✅ Sphere(球) … 移動できるオブジェクト。Cubeにぶつかったら削除される。
✅ Cube(立方体) … Sphereと衝突するとbool
の値を変更する。
この2つのオブジェクトを使って、「SphereがCubeにぶつかったらCube側のbool
をtrue
にし、その値をSphere側で取得して削除する」という処理を作っていきます。
① UnityでSphereとCubeを作成する
Unityエディターを開いて、以下の手順でオブジェクトを作成します。
- ヒエラルキー(Hierarchy)ウィンドウで右クリック
- 「3D Object」 → 「Sphere」 を選択(球を作成)
- 同じように「3D Object」 → 「Cube」 を選択(立方体を作成)
作成したオブジェクトの名前をそれぞれ変更しておくと分かりやすくなります。
Sphere
→ 「Sphere」Cube
→ 「Cube」
② SphereにRigidbodyを追加
Sphere
が動けるようにするため、Rigidbody
(リジッドボディ)を追加します。
- Sphereを選択
- インスペクター(Inspector)ウィンドウで「Add Component」ボタンをクリック
- 「Rigidbody」を検索して追加
Use Gravity
のチェックを外す(重力を無効化)
これで、Sphereが物理演算を使って動けるようになりました。
③ スクリプトを作成してオブジェクトに追加
オブジェクト間の情報をやり取りするため、以下のスクリプトを作成し、それぞれのオブジェクトにアタッチ(適用)します。
- ヒエラルキーの何もない部分を右クリック
- 「Create」 → 「C# Script」 を選択
- 以下のスクリプトを作成
CubeAccept.cs
(Cubeにアタッチ)SphereMove.cs
(Sphereにアタッチ)
このスクリプトの中で、SphereがCubeにぶつかったら、Cubeのスクリプトのbool
をtrue
にし、それをSphere側で参照する処理を書いていきます。

オブジェクトの準備が完了したので、次は**「他のスクリプトのBoolを取得する方法」**を3つのやり方で実装していきます!
① instanceを使う方法(シングルトン)
まず最初に紹介するのは、シングルトン(Singleton)パターンを使って、他のスクリプトのbool
値を取得する方法です。
これは、どこからでも特定のスクリプトにアクセスできるようにする仕組みで、ゲーム全体で共通のデータを参照したいときに便利です。
シングルトンを使ったbool
の取得方法
今回の例では、Cube
がSphere
に衝突したときにisTouched
をtrue
にし、
その値をSphere
側で取得して、Sphere
を削除する処理を行います。
Cube側のスクリプト(CubeAccept.cs)
まずは、Cube
にアタッチするスクリプトを作成します。
手順
- プロジェクトウィンドウを右クリック
- 「Create」→「C# Script」を選択
- 新しいスクリプトを作成し、「CubeAccept」と名前を付けます
- 以下のコードを入力してください。
CubeAccept.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class CubeAccept : MonoBehaviour
{
public static CubeAccept instance; // シングルトンのインスタンス
public bool isTouched; // 衝突判定用のbool
void Awake()
{
// インスタンスが未設定の場合、このオブジェクトをインスタンスとして登録
if(instance == null)
{
instance = this;
}
}
void Start()
{
isTouched = false; // 初期状態はfalse
}
void OnCollisionEnter(Collision other)
{
// Sphereが衝突した場合、isTouchedをtrueにする
if(other.gameObject.name == "Sphere")
{
isTouched = true;
}
}
}
Sphere側のスクリプト(SphereMove.cs)
次に、Sphere
にアタッチするスクリプトを作成します。
手順
- プロジェクトウィンドウを右クリック
- 「Create」→「C# Script」を選択
- 新しいスクリプトを作成し、「SphereMove」と名前を付けます
- 以下のコードを入力してください。
SphereMove.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class SphereMove : MonoBehaviour
{
void Update()
{
// CubeAcceptのisTouchedをチェックし、trueならSphereを削除
if(CubeAccept.instance.isTouched)
{
Destroy(gameObject);
}
// キーボードの矢印キーでSphereを移動
float dx = Input.GetAxis("Horizontal") * 0.1f;
float dz = Input.GetAxis("Vertical") * 0.1f;
transform.position = new Vector3(
transform.position.x + dx, 0, transform.position.z + dz
);
}
}
シングルトン(Singleton)を使うメリット
✅ どこからでもアクセス可能
→ CubeAccept.instance.isTouched
と記述するだけで取得できる!
✅ スクリプトの管理がシンプル
→ Find
を使う必要がなく、オブジェクトを取得する処理が不要!
✅ ゲーム全体で共通のデータ管理がしやすい
→ 例えば、スコア管理やゲームの進行状況などにも応用可能!
実際に動かしてみよう!
手順
- Unityエディタでシーンを作成
- ヒエラルキー(Hierarchy)ウィンドウで右クリック → 「3D Object」→「Sphere」を作成
- もう一度右クリック → 「3D Object」→「Cube」を作成
- Sphereにリジッドボディ(Rigidbody)を追加
Sphere
を選択- インスペクター(Inspector)ウィンドウの「Add Component」をクリック
- 「Rigidbody」を検索して追加
- Use Gravityのチェックを外す
- スクリプトをオブジェクトにアタッチ
CubeAccept.cs
→Cube
にドラッグ&ドロップSphereMove.cs
→Sphere
にドラッグ&ドロップ
- 再生ボタンを押してプレイ!
- 矢印キーで
Sphere
を移動させて、Cube
にぶつけてみよう! Cube
に当たると、Sphere
が消えることを確認!
- 矢印キーで
補足:シングルトンの注意点
シングルトンを使うと便利な反面、注意点もあります。
⚠️ 複数のインスタンスが作られないようにする
→ if(instance == null) { instance = this; }
のチェックを忘れずに!
⚠️ シングルトンが不要な場面では使わない
→ すべてのスクリプトでアクセスできるので、大規模なプロジェクトでは管理が難しくなることも!
→ 小規模なプロジェクトや1つのオブジェクトだけが持つデータ管理に向いている!

シングルトンを使うと、簡単に他のスクリプトの変数を取得できるため、特に小規模なゲームではとても便利です!
ただし、シングルトンを多用するとコードが複雑になりやすいため、適材適所で使いましょう。
次は、GameObject.Find
を使った取得方法を紹介します!
② GameObject.Findで取得する方法
GameObject.Find
を使えば、特定のオブジェクトを名前で検索し、そのオブジェクトのスクリプトにアクセスすることができます。この方法を使って、他のスクリプトのbool
変数を取得してみましょう。
1. 方法の概要
GameObject.Find("オブジェクト名")
を使って対象のオブジェクトを探し、GetComponent<スクリプト名>()
でそのスクリプトの変数にアクセスします。
ただし、この方法にはオブジェクトの名前が変わると参照できなくなるというデメリットがあるため、
オブジェクトの名前は正確に指定するようにしましょう。
2. Cube(Boolフラグを立てる側)のスクリプト
まず、Cube
に追加するCubeAccept.cs
を作成します。
このスクリプトでは、Sphere
と衝突したときにisTouched
をtrue
に変更します。
CubeAccept.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class CubeAccept : MonoBehaviour
{
public bool isTouched;
void Start()
{
isTouched = false; // 初期状態ではfalse
}
void OnCollisionEnter(Collision other)
{
if(other.gameObject.name == "Sphere") // Sphereとぶつかったら
{
isTouched = true; // フラグをtrueにする
}
}
}
💡 ポイント
isTouched
は最初false
に設定。OnCollisionEnter
でSphere
と衝突したときにisTouched = true
に変更。other.gameObject.name == "Sphere"
で衝突相手の名前を判定。
3. Sphere(Boolを参照する側)のスクリプト
次に、Sphere
に追加するSphereMove.cs
を作成します。
このスクリプトでは、CubeAccept
のisTouched
がtrue
になったらSphere
を削除します。
SphereMove.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class SphereMove : MonoBehaviour
{
public GameObject cube; // Cubeオブジェクトの参照を保存
void Start()
{
cube = GameObject.Find("Cube"); // "Cube"という名前のオブジェクトを探す
}
void Update()
{
if (cube != null && cube.GetComponent<CubeAccept>().isTouched)
{
Destroy(gameObject); // isTouchedがtrueならSphereを削除
}
// キー操作でSphereを移動させる
float dx = Input.GetAxis("Horizontal") * 0.1f;
float dz = Input.GetAxis("Vertical") * 0.1f;
transform.position = new Vector3(
transform.position.x + dx, 0, transform.position.z + dz
);
}
}
💡 ポイント
GameObject.Find("Cube")
でCube
オブジェクトを取得。cube.GetComponent<CubeAccept>().isTouched
でCubeAccept.cs
のisTouched
にアクセス。isTouched
がtrue
になったら、Destroy(gameObject)
でSphere
を削除。cube != null
をチェックして、オブジェクトが存在するかを確認する。
4. Unityでのセットアップ
- オブジェクトを作成
- ヒエラルキーウィンドウで右クリック →
3D Object
→Cube
を作成。 - ヒエラルキーウィンドウで右クリック →
3D Object
→Sphere
を作成。 Sphere
にリジッドボディ(Rigidbody) を追加。(Use Gravity
はオフ)
- ヒエラルキーウィンドウで右クリック →
- スクリプトを追加
CubeAccept.cs
をCube
に追加。SphereMove.cs
をSphere
に追加。
- ゲームプレイ
Sphere
を移動させてCube
にぶつける。Cube
のisTouched
がtrue
になり、Sphere
が削除されることを確認!
5. まとめ
メリット | デメリット |
---|---|
コードがシンプルでわかりやすい | オブジェクト名が変わると動かなくなる |
他のスクリプトの変数を簡単に取得できる | Findは処理負荷がかかる(大量に使うと非推奨) |
🔹 GameObject.Find
は簡単に使えるが、オブジェクト名の変更に弱いので注意!
🔹 より柔軟に使いたい場合は instance
や 直接フィールドに入れる方法も検討しよう!
③ フィールドに直接オブジェクトを入れる方法
最後に、Inspector(インスペクター)で直接参照を設定する方法を紹介します。
この方法は、コードの記述量が少なく、手軽にオブジェクト間の情報を共有できるため、初心者にもおすすめです。
💡 どんなときに使う?
- 参照するオブジェクトが シーン内に固定 されている
- 変更するオブジェクトが 動的に増えたり減ったりしない
- Find()を使いたくない、もしくは
instance
を使いたくない
例えば、Cube
が Sphere
にぶつかったら isTouched
を true
にし、
その値を Sphere
側のスクリプトでチェックして、Sphere
を削除する、という処理を実装します。
📌 Cube(Boolフラグを持つ)側のスクリプト
まず、CubeAccept.cs
を作成し、Cube
に追加します。
CubeAccept.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class CubeAccept : MonoBehaviour
{
public bool isTouched;
void Start()
{
isTouched = false;
}
void OnCollisionEnter(Collision other)
{
if(other.gameObject.name == "Sphere")
{
isTouched = true;
}
}
}
📝 このスクリプトのポイント
isTouched
というbool
型の変数を用意。OnCollisionEnter()
でSphere
にぶつかったらisTouched = true
にする。
📌 Sphere(CubeのBoolを参照する)側のスクリプト
次に、SphereMove.cs
を作成し、Sphere
に追加します。
SphereMove.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class SphereMove : MonoBehaviour
{
public CubeAccept cubeAccept; // CubeAccept の参照
void Update()
{
if(cubeAccept.isTouched)
{
Destroy(gameObject);
}
float dx = Input.GetAxis("Horizontal") * 0.1f;
float dz = Input.GetAxis("Vertical") * 0.1f;
transform.position = new Vector3(
transform.position.x + dx, 0, transform.position.z + dz
);
}
}
📝 このスクリプトのポイント
CubeAccept
のスクリプトを 直接フィールド(変数)として用意。CubeAccept
のisTouched
をチェックして、true
ならSphere
を削除。Sphere
は矢印キー (Horizontal
,Vertical
) で移動できるようにする。
🛠 Unityエディターでの設定
この方法では、コードの中で Find()
を使わず、Inspector で直接オブジェクトを設定 します。
Sphere
を選択SphereMove
スクリプトの 「Cube Accept」フィールド を探すCube
を ドラッグ & ドロップ してセットする
✅ これで、SphereMove.cs
の cubeAccept
に CubeAccept
がセットされました!
🎮 実際に動かしてみよう
- 再生ボタンを押してゲームを開始
Sphere
を矢印キーで動かし、Cube
にぶつけるCubeAccept
のisTouched
がtrue
になり、Sphere
が削除される!
🧐 メリット・デメリット
方法 | メリット | デメリット |
---|---|---|
フィールドに直接設定 | シンプルで分かりやすい | 手動で設定が必要 |
Find() で取得 | コードだけで完結できる | オブジェクト名が変わるとエラー |
instance を使う | どこからでも参照できる | 設計ミスするとバグが発生しやすい |
まとめ
- Inspector で直接オブジェクトを設定する方法は、簡単で確実!
CubeAccept
のisTouched
をSphereMove
側で そのまま取得 できる。- シーン内の固定オブジェクト なら この方法がベスト!
→ ただし、動的に生成されるオブジェクトには向かない ので注意。

この方法を使えば、他のスクリプトの変数を簡単に取得できます!
ぜひ試してみてください! 🚀
よくある質問(FAQ)
- Q
instance
がnull
になるのはなぜ? - A
instance
がnull
になってしまう原因はいくつか考えられます。✅ 解決策:
CubeAccept
クラスのAwake()
メソッドでinstance
が適切に設定されているか確認する。CubeAccept
スクリプトがシーン内のオブジェクトにアタッチされているかをチェックする。instance
はstatic
な変数なので、シーンの再読み込み時に初期化されていない可能性もある。その場合はDontDestroyOnLoad(this.gameObject);
を使って、オブジェクトが削除されないようにするのも手。
- Q
GameObject.Find
でオブジェクトが見つからない! - A
GameObject.Find("Cube")
を使ってオブジェクトを取得しようとしているのに、null
になってしまうことがあります。✅ 解決策:
- オブジェクトの名前が間違っていないか確認する(大文字小文字も区別される)。
Find
でオブジェクトを探す前に、オブジェクトがシーン内に存在しているか確認する。- 非アクティブのオブジェクトは
Find
では取得できないので、cube.SetActive(true);
でアクティブにしてみる。 Find
はパフォーマンス的に負担が大きいため、Start()
ではなく、可能ならAwake()
で取得しておくのがベスト。
- Q
GetComponent
でスクリプトが取得できない! - A
例えば、
cube.GetComponent<CubeAccept>().isTouched
の部分でエラーが出る場合、考えられる原因は次の通りです。✅ 解決策:
CubeAccept
スクリプトがCube
オブジェクトに正しくアタッチされているか確認する。Find
で取得したオブジェクトがnull
になっていないか調べる。 csharpコピーする編集するif (cube == null) { Debug.LogError("Cubeオブジェクトが見つかりません!"); }
CubeAccept
クラスがpublic
になっているかチェックする(internal
やprivate
だと他のスクリプトから取得できない)。