UnityUnityメモ

【Unity】他のスクリプトのBoolを取得する3つの方法!初心者向け解説

Unity

はじめに

Unityでゲームを作っていると、「あるオブジェクトの状態を、別のオブジェクトのスクリプトから取得したい!」という場面がよくあります。例えば、**「プレイヤーが特定のオブジェクトに触れたら、別のオブジェクトが消える」**という処理を作りたいとき、オブジェクト同士が情報をやり取りする必要があります。

しかし、**「他のスクリプトの変数って、どうやって取得すればいいの?」**と悩むことも多いですよね。特に、bool(真偽値)を別のスクリプトから取得して、特定の条件を満たしたときに処理を実行するのは、初心者がつまずきやすいポイントの一つです。

この記事では、Unityで**「他のスクリプトのboolを取得する方法」**を3つ紹介します!

  • instance(シングルトン)を使う方法
  • GameObject.Findを使う方法
  • フィールドに直接オブジェクトを設定する方法

今回のサンプルでは、以下の動作を実装します。

Sphere(球体)とCube(立方体)を用意
SphereCubeにぶつかると、Cube側のbooltrueになる
Sphereboolの値を取得し、trueなら自分自身を削除する

このような処理を作れるようになれば、ゲームの中でオブジェクト同士を連携させるスクリプトが書けるようになります!
Unity初心者の方も、わかりやすいコードと実践的な解説で学べるので、ぜひ最後まで読んでみてください!

ちなみに、「コードを書くのはちょっと苦手…」「もっと簡単に条件やフラグの管理をしたい!」という方には、
ビジュアルスクリプティングで人気の【PlayMaker】というアセットもおすすめです!

👇詳しくはこちら
PlayMaker(Unity Asset Store)




1. 準備するオブジェクト

まず、Unity上で以下の2つのオブジェクトを作成します。

Sphere(球) … 移動できるオブジェクト。Cubeにぶつかったら削除される。
Cube(立方体) … Sphereと衝突するとboolの値を変更する。

この2つのオブジェクトを使って、「SphereがCubeにぶつかったらCube側のbooltrueにし、その値をSphere側で取得して削除する」という処理を作っていきます。


① UnityでSphereとCubeを作成する

Unityエディターを開いて、以下の手順でオブジェクトを作成します。

  1. ヒエラルキー(Hierarchy)ウィンドウ右クリック
  2. 「3D Object」 → 「Sphere」 を選択(球を作成)
  3. 同じように「3D Object」 → 「Cube」 を選択(立方体を作成)

作成したオブジェクトの名前をそれぞれ変更しておくと分かりやすくなります。

  • Sphere「Sphere」
  • Cube「Cube」

② SphereにRigidbodyを追加

Sphereが動けるようにするため、Rigidbody(リジッドボディ)を追加します。

  1. Sphereを選択
  2. インスペクター(Inspector)ウィンドウで「Add Component」ボタンをクリック
  3. 「Rigidbody」を検索して追加
  4. Use Gravity のチェックを外す(重力を無効化)

これで、Sphereが物理演算を使って動けるようになりました。


③ スクリプトを作成してオブジェクトに追加

オブジェクト間の情報をやり取りするため、以下のスクリプトを作成し、それぞれのオブジェクトにアタッチ(適用)します。

  1. ヒエラルキーの何もない部分を右クリック
  2. 「Create」 → 「C# Script」 を選択
  3. 以下のスクリプトを作成
    • CubeAccept.cs(Cubeにアタッチ)
    • SphereMove.cs(Sphereにアタッチ)

このスクリプトの中で、SphereがCubeにぶつかったら、Cubeのスクリプトのbooltrueにし、それをSphere側で参照する処理を書いていきます。

オブジェクトの準備が完了したので、次は**「他のスクリプトのBoolを取得する方法」**を3つのやり方で実装していきます!




① instanceを使う方法(シングルトン)

まず最初に紹介するのは、シングルトン(Singleton)パターンを使って、他のスクリプトのbool値を取得する方法です。
これは、どこからでも特定のスクリプトにアクセスできるようにする仕組みで、ゲーム全体で共通のデータを参照したいときに便利です。

シングルトンを使ったboolの取得方法

今回の例では、CubeSphereに衝突したときにisTouchedtrueにし、
その値をSphere側で取得して、Sphereを削除する処理を行います。


Cube側のスクリプト(CubeAccept.cs)

まずは、Cubeにアタッチするスクリプトを作成します。

手順

  1. プロジェクトウィンドウを右クリック
  2. 「Create」→「C# Script」を選択
  3. 新しいスクリプトを作成し、「CubeAccept」と名前を付けます
  4. 以下のコードを入力してください。

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にアタッチするスクリプトを作成します。

手順

  1. プロジェクトウィンドウを右クリック
  2. 「Create」→「C# Script」を選択
  3. 新しいスクリプトを作成し、「SphereMove」と名前を付けます
  4. 以下のコードを入力してください。

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を使う必要がなく、オブジェクトを取得する処理が不要!

ゲーム全体で共通のデータ管理がしやすい
→ 例えば、スコア管理やゲームの進行状況などにも応用可能!


実際に動かしてみよう!

手順

  1. Unityエディタでシーンを作成
    • ヒエラルキー(Hierarchy)ウィンドウで右クリック → 「3D Object」→「Sphere」を作成
    • もう一度右クリック → 「3D Object」→「Cube」を作成
  2. Sphereにリジッドボディ(Rigidbody)を追加
    • Sphereを選択
    • インスペクター(Inspector)ウィンドウの「Add Component」をクリック
    • 「Rigidbody」を検索して追加
    • Use Gravityのチェックを外す
  3. スクリプトをオブジェクトにアタッチ
    • CubeAccept.csCubeにドラッグ&ドロップ
    • SphereMove.csSphereにドラッグ&ドロップ
  4. 再生ボタンを押してプレイ!
    • 矢印キーで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と衝突したときにisTouchedtrueに変更します。

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に設定。
  • OnCollisionEnterSphereと衝突したときにisTouched = trueに変更。
  • other.gameObject.name == "Sphere" で衝突相手の名前を判定。



3. Sphere(Boolを参照する側)のスクリプト

次に、Sphereに追加するSphereMove.csを作成します。
このスクリプトでは、CubeAcceptisTouchedtrueになったら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>().isTouchedCubeAccept.csisTouched にアクセス。
  • isTouchedtrueになったら、Destroy(gameObject)Sphereを削除。
  • cube != null をチェックして、オブジェクトが存在するかを確認する。

4. Unityでのセットアップ

  1. オブジェクトを作成
    • ヒエラルキーウィンドウで右クリック → 3D ObjectCube を作成。
    • ヒエラルキーウィンドウで右クリック → 3D ObjectSphere を作成。
    • Sphereリジッドボディ(Rigidbody) を追加。(Use Gravityはオフ)
  2. スクリプトを追加
    • CubeAccept.csCubeに追加。
    • SphereMove.csSphereに追加。
  3. ゲームプレイ
    • Sphereを移動させてCubeにぶつける。
    • CubeisTouchedtrueになり、Sphereが削除されることを確認!

5. まとめ

メリットデメリット
コードがシンプルでわかりやすいオブジェクト名が変わると動かなくなる
他のスクリプトの変数を簡単に取得できるFindは処理負荷がかかる(大量に使うと非推奨)

🔹 GameObject.Find は簡単に使えるが、オブジェクト名の変更に弱いので注意!
🔹 より柔軟に使いたい場合は instance や 直接フィールドに入れる方法も検討しよう!




③ フィールドに直接オブジェクトを入れる方法

最後に、Inspector(インスペクター)で直接参照を設定する方法を紹介します。
この方法は、コードの記述量が少なく、手軽にオブジェクト間の情報を共有できるため、初心者にもおすすめです。


💡 どんなときに使う?

  • 参照するオブジェクトが シーン内に固定 されている
  • 変更するオブジェクトが 動的に増えたり減ったりしない
  • Find()を使いたくない、もしくは instance を使いたくない

例えば、CubeSphere にぶつかったら isTouchedtrue にし、
その値を 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 のスクリプトを 直接フィールド(変数)として用意
  • CubeAcceptisTouched をチェックして、true なら Sphere を削除。
  • Sphere は矢印キー (Horizontal, Vertical) で移動できるようにする。

🛠 Unityエディターでの設定

この方法では、コードの中で Find() を使わず、Inspector で直接オブジェクトを設定 します。

  1. Sphere を選択
  2. SphereMove スクリプトの 「Cube Accept」フィールド を探す
  3. Cubeドラッグ & ドロップ してセットする

✅ これで、SphereMove.cscubeAcceptCubeAccept がセットされました!


🎮 実際に動かしてみよう

  1. 再生ボタンを押してゲームを開始
  2. Sphere を矢印キーで動かし、Cube にぶつける
  3. CubeAcceptisTouchedtrue になり、Sphere が削除される!

🧐 メリット・デメリット

方法メリットデメリット
フィールドに直接設定シンプルで分かりやすい手動で設定が必要
Find() で取得コードだけで完結できるオブジェクト名が変わるとエラー
instance を使うどこからでも参照できる設計ミスするとバグが発生しやすい

まとめ

  • Inspector で直接オブジェクトを設定する方法は、簡単で確実
  • CubeAcceptisTouchedSphereMove 側で そのまま取得 できる。
  • シーン内の固定オブジェクト なら この方法がベスト
    → ただし、動的に生成されるオブジェクトには向かない ので注意。

この方法を使えば、他のスクリプトの変数を簡単に取得できます!
ぜひ試してみてください! 🚀




よくある質問(FAQ)

Q
instancenullになるのはなぜ?
A

instancenullになってしまう原因はいくつか考えられます。

解決策:

  1. CubeAcceptクラスのAwake()メソッドでinstanceが適切に設定されているか確認する。
  2. CubeAcceptスクリプトがシーン内のオブジェクトにアタッチされているかをチェックする。
  3. instancestaticな変数なので、シーンの再読み込み時に初期化されていない可能性もある。その場合はDontDestroyOnLoad(this.gameObject);を使って、オブジェクトが削除されないようにするのも手。
Q
GameObject.Findでオブジェクトが見つからない!
A

GameObject.Find("Cube") を使ってオブジェクトを取得しようとしているのに、nullになってしまうことがあります。

解決策:

  1. オブジェクトの名前が間違っていないか確認する(大文字小文字も区別される)。
  2. Findでオブジェクトを探す前に、オブジェクトがシーン内に存在しているか確認する。
  3. 非アクティブのオブジェクトはFindでは取得できないので、cube.SetActive(true); でアクティブにしてみる。
  4. Findパフォーマンス的に負担が大きいため、Start()ではなく、可能ならAwake()で取得しておくのがベスト。
Q
GetComponentでスクリプトが取得できない!
A

例えば、cube.GetComponent<CubeAccept>().isTouched の部分でエラーが出る場合、考えられる原因は次の通りです。

解決策:

  1. CubeAcceptスクリプトがCubeオブジェクトに正しくアタッチされているか確認する。
  2. Findで取得したオブジェクトがnullになっていないか調べる。 csharpコピーする編集するif (cube == null) { Debug.LogError("Cubeオブジェクトが見つかりません!"); }
  3. CubeAcceptクラスがpublicになっているかチェックする(internalprivateだと他のスクリプトから取得できない)。
タイトルとURLをコピーしました