ここではオブジェクトの状態を外部からクラスによって制御を行います。
・アクティブ = オブジェクトが表示されている状態
・非アクティブ = オブジェクトが非表示の状態
それではソースコードを書いていきましょう。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
/// <summary>
/// オブジェクトのアクティブ状態を外部から操作するクラス
/// Cube以外のオブジェクトにアタッチされるように設計されている
/// </summary>
public class ActivateSwitch : MonoBehaviour
{
//[Header("操作したいオブジェクト")]
//public GameObject cube;
private ColliderTest test; // testクラスの取得用
void Start()
{
// このActivateSwitchクラスがアタッチされているオブジェクト以外のコンポーネントを取得する場合
// まずは外部のオブジェクトの情報を取得し、その後、コンポーネントを取得する
// 探す場合には文字列("")で検索するため、文字が1つでも違うと探せない(大文字・小文字区別する)
GameObject obj = GameObject.Find("Cube"); // ヒエラルキー上にある、"Cube"という名前のゲームオブジェクトを探し、obj変数に代入する。(右辺と左辺の型はGameObject型で一致)
test = obj.gameObject.GetComponent<ColliderTest>(); // objが持っているTestクラス・コンポーネントを取得(右辺と左辺の型はColliderTestで一致)
// 上記の2行の処理を1行で書く場合
//test = GameObject.Find("Cube").GetComponent<ColliderTest>();
Debug.Log(obj); // Consoleにobjに代入されているゲームオブジェクトの名前が表示される。Nullの場合には取得に失敗している
Debug.Log(test); // Consoleにtestに代入されているColliderTestの名前が表示される。Nullの場合には取得に失敗している
}
void Update()
{
// ボタンを押すたびにオブジェクトの状態をアクティブ/非アクティブに切り替える
if (Input.GetKeyDown(KeyCode.B)) {
// activeSelfとはbool型で、指定した変数のオブジェクトが現在アクティブか非アクティブかを返してくれる
if (!test.gameObject.activeSelf) {
// 非アクティブならアクティブにする
test.gameObject.SetActive(true);
} else {
// アクティブなら非アクティブにする
test.gameObject.SetActive(false);
}
// 1行で書ける(test(Testクラス)を使う場合) = GameObject型ではないため、gameObjectの指示が必要
//test.gameObject.SetActive(!test.gameObject.activeSelf);
// cube(GameObject型)を使う場合 = GameObject型であるため、gameObjectの指示が不要
// こちらを使う場合には宣言フィールドでコメントアウトしてある public GameObject cube; の宣言が必要
//cube.SetActive(!cube.activeSelf);
}
}
}
こちらをCubeオブジェクト以外のオブジェクトにアタッチします。
Cubeオブジェクトに対して、別のオブジェクトにあるクラスからアクセスをしてCubeの制御ができるかを確認しましょう。