6
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

[Unity] InActive(非表示)なオブジェクトをエディタスクリプトから操作する

Posted at

今開発中のもので、デバッグ用のカメラとOculus向けのカメラを交互にオン/オフしてデバッグしていました。
が、意外とこれがめんどくさい。なんとかスクリプトでできないかなーと思っていたところ、Editor ScriptのMenuItemを使って達成できそうだということでやってみました。

サンプルコード

なにはともあれコードを。

using UnityEngine;
using UnityEditor;
using System.Collections;
using System.IO;

public static class CameraToglle {

	private static string oculusCameraName = "LeapOVRCameraRig";
	private static string clientCameraName = "debugCamera";

	[MenuItem("Tools/CameraToggle")]
	private static void Menu() {
		GameObject oculusCamera = null;
		GameObject debugCamera  = null;
		
		// シーンファイルの拡張子
		string unityExtension = ".unity";
		
		// リソースからすべてのオブジェクトを取得し、その中から該当オブジェクトを探す
		foreach(GameObject obj in Resources.FindObjectsOfTypeAll(typeof(GameObject))) {
			if (obj.name == oculusCameraName) {
				string path = AssetDatabase.GetAssetOrScenePath(obj);
				string ext  = Path.GetExtension(path);
				if (ext == unityExtension) {
					oculusCamera = obj;
				}
			}
			else if (obj.name == clientCameraName) {
				string path = AssetDatabase.GetAssetOrScenePath(obj);
				string ext  = Path.GetExtension(path);
				if (ext == unityExtension) {
					clientCamera = obj;
				}
			}
		}

		// Activeをトグルする
		bool isOculusActive = oculusCamera.activeSelf;
		oculusCamera.SetActive(!isOculusActive);
		clientCamera.SetActive(isOculusActive);
	}
}

ちょっとトグルするだけなのにだいぶ冗長な感じです。
が、一度inactiveにしてしまうとGameObject.Findメソッドで検知できなくなってしまいます。
なのでこんな周りくどいことをやっているんですね。

なにをやっているか

Resources.FindObjectsOfTypeAll()を使ってUnityが認識しているリソース全体から該当オブジェクトを探しています。
微妙に分岐が入ってるのは、シーン内のオブジェクトに限らずAssetsディレクトリに配置されているファイルも検索対象だからです。

今回の場合は特に、 Prefab化したものもマッチして2回検知されてしまう ためそれを分岐して処理している、というわけです。

AssetDatabase.GetAssetOrScenePathから返る文字列は「Assetsディレクトリのどこにあるか」が返されます。
ただしシーン内に配置されているオブジェクトの場合は****.unityファイル内ということになり、そのパスが返されます。
なので.unityにマッチしているかを確認しているわけです。

余談

ちなみに最初、シンプルな確認用プロジェクトを作って試したところいっこうにpathに値が入らず「???」でした。
が、シーンを保存しておらず、Assetsディレクトリ配下にないために空文字が返されていた、というちょっとマヌケな理由でした。

普通のプロジェクトであればシーンが保存されていないことはまずないと思うのでそういう問題は起きないと思います。

閑話休題。

さて、上記の処理でinacitveな該当オブジェクトを見つけることができるので、あとは普通にスクリプトを書くのと同じように処理を書いてやればOKです。
今回の例ではふたつのオブジェクトのactiveをトグルして入れ替える、というものです。

細かい処理ですが頻繁に切り替えながら開発する場合は意外に重宝します。

6
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?