ゲームオブジェクトを編集不可にする
Unityで作業を進める上で、ゲームオブジェクトが編集されると困る場合がある。例えば既にfixしたオブジェクト配置だったり、剥がされると困るコンポーネントだったり、特に複数人で編集する場合に発生するケースがある。
Unityには特定のコンポーネント・オブジェクトの値をEditorから編集出来なくする機能がある。これを使用すると、図のようにUnityのエディタから編集出来なくなる。また、選択しても座標は動かせなく、activeの変更も出来なくなる。
方法は簡単で、gameObjectやComponentのHideFlagにHideFlags.NotEditableを突っ込むだけ。
HideFlags.NotEditable
戻す場合は、HideFlags.Noneでも突っ込む。
少し分かりにくいので、簡単なエディタ拡張を用意した。このエディタ拡張は、オブジェクト選択時にコンポーネント一覧を表示し、チェックを入れると入力不可になるエディタ拡張だ。
使い方は簡単。
下のコードをプロジェクトの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 ();
}
}
ちなみに編集不可なのはエディタからのアクセスのみなので、スクリプト上から編集された場合は変更可能。