読者です 読者をやめる 読者になる 読者になる

テラシュールブログ

旧テラシュールウェアブログUnity記事。主にUnityのTipsやAR・VR、ニコニコ動画についてのメモを残します。

ゲームオブジェクトを編集不可にする

Unity エディタ拡張・エディタ機能

スクリーンショット 2014-04-23 0.32.16Unityで作業を進める上で、ゲームオブジェクトが編集されると困る場合がある。例えば既にfixしたオブジェクト配置だったり、剥がされると困るコンポーネントだったり、特に複数人で編集する場合に発生するケースがある。

Unityには特定のコンポーネント・オブジェクトの値をEditorから編集出来なくする機能がある。これを使用すると、図のようにUnityのエディタから編集出来なくなる。また、選択しても座標は動かせなく、activeの変更も出来なくなる。

方法は簡単で、gameObjectやComponentのHideFlagにHideFlags.NotEditableを突っ込むだけ。

HideFlags.NotEditable

戻す場合は、HideFlags.Noneでも突っ込む。

少し分かりにくいので、簡単なエディタ拡張を用意した。このエディタ拡張は、オブジェクト選択時にコンポーネント一覧を表示し、チェックを入れると入力不可になるエディタ拡張だ。

スクリーンショット_2014-04-23_0_48_23


使い方は簡単。
下のコードをプロジェクトのEditorフォルダ以下に配置し、メニュー>Window/LockObjectを開くと上の画像のウィンドウが表示される。その後、適当なゲームオブジェクトを選択するとコンポーネント一覧が表示されるので、チェックを外す。
?はゲームオブジェクト全体のオブジェクトを編集不可にする(名前もコンポーネント追加も出来なくなる)、?は各コンポーネントを編集不可にする。

using UnityEngine;
using System.Collections;
using UnityEditor;

public class LockObject : EditorWindow
{

static LockObject instance;

[MenuItem("Window/LockObject")]
static void OpenLockObject ()
{
if (instance != null) {
instance.Close ();
}

instance = EditorWindow.CreateInstance<LockObject> ();
instance.Show ();
}

void OnInspectorUpdate()
{
Repaint();
}

void OnGUI ()
{
var active = Selection.activeGameObject;

if( active == null)
return;

var components = active.GetComponents<Component> ();

EditorGUILayout.BeginHorizontal ();
EditorGUILayout.LabelField (active.name);

bool isEditable = (active.hideFlags & HideFlags.NotEditable) == HideFlags.NotEditable;

bool isBlock = GUILayout.Button( isEditable ? "unlock" : "lock");
EditorGUILayout.EndHorizontal ();

EditorGUILayout.Space ();

foreach (var component in components) {

DrawLine (() =>
{
EditorGUILayout.LabelField (component.GetType ().Name);
bool isComponentEditable = (component.hideFlags & HideFlags.NotEditable) == HideFlags.NotEditable;

bool isComponentTogleResult = !EditorGUILayout.Toggle (isComponentEditable);
if (isComponentTogleResult) {
component.hideFlags |= HideFlags.NotEditable;
} else {
component.hideFlags &= ~HideFlags.NotEditable;
}
});
}


if (isBlock) {

if( isEditable )
{
active.hideFlags &= ~HideFlags.NotEditable;
}else{
active.hideFlags |= HideFlags.NotEditable;
}

}
}

void DrawLine (System.Action action)
{
EditorGUILayout.BeginHorizontal ();
action ();
EditorGUILayout.EndHorizontal ();
}
}

ちなみに編集不可なのはエディタからのアクセスのみなので、スクリプト上から編集された場合は変更可能。