Unity 매뉴얼 가이드: 프리셋 설정
이 문서는 Unity의 에셋 워크플로우에서 프리셋을 설정하는 방법에 대한 가이드입니다. 프리셋을 통해 Unity에서 객체와 컴포넌트의 기본 값을 쉽게 설정할 수 있습니다.
프리셋 소개
프리셋은 UnityEngine의 다양한 클래스에서 사용할 수 있는 기능으로, 코드 작성 시 개별적으로 값을 설정하는 수고를 덜어줍니다. ObjectFactory 클래스를 사용하면 자동으로 프리셋을 적용하여 새로운 게임 오브젝트나 컴포넌트를 생성할 수 있습니다.
기본 조건
- 클래스는 다음 중 하나에서 상속되어야 합니다:
- UnityEngine.Monobehaviour
- UnityEngine.ScriptableObject
- UnityEngine.ScriptedImporter
프리셋 인스펙터는 클래스의 임시 인스턴스를 만들어 사용자에게 값을 수정할 수 있는 기회를 제공합니다. 이때 클래스는 다른 오브젝트에 영향을 주지 않도록 주의해야 합니다.
사용 사례
커스텀 에디터 창의 프리셋 설정
- 설정 복사본 저장: ScriptableObject를 사용하여 에디터 설정의 복사본을 저장합니다.
- UI 표시: 임시 ScriptableObject 인스펙터를 통해 프리셋 설정을 UI에 표시합니다.
- 프리셋 버튼: 사용자가 프리셋을 선택할 수 있도록 PresetSelectorReceiver를 구현합니다.
예제 스크립트
1. MyWindowSettings.cs
이 스크립트는 프리셋 시스템에서 사용되는 임시 ScriptableObject를 정의합니다.
using UnityEngine;
// Temporary ScriptableObject used by the Preset system
public class MyWindowSettings : ScriptableObject
{
[SerializeField]
string m_SomeSettings;
public void Init(MyEditorWindow window)
{
m_SomeSettings = window.someSettings;
}
public void ApplySettings(MyEditorWindow window)
{
window.someSettings = m_SomeSettings;
window.Repaint();
}
}
2. MySettingsReceiver.cs
이 스크립트는 선택된 값을 사용하여 EditorWindow를 업데이트하는 PresetSelectorReceiver를 정의합니다.
using UnityEditor.Presets;
// PresetSelector receiver to update the EditorWindow with the selected values.
public class MySettingsReceiver : PresetSelectorReceiver
{
Preset initialValues;
MyWindowSettings currentSettings;
MyEditorWindow currentWindow;
public void Init(MyWindowSettings settings, MyEditorWindow window)
{
currentWindow = window;
currentSettings = settings;
initialValues = new Preset(currentSettings);
}
public override void OnSelectionChanged(Preset selection)
{
if (selection != null)
{
selection.ApplyTo(currentSettings);
}
else
{
initialValues.ApplyTo(currentSettings);
}
currentSettings.ApplySettings(currentWindow);
}
public override void OnSelectionClosed(Preset selection)
{
OnSelectionChanged(selection);
DestroyImmediate(this);
}
}
3. MyEditorWindow.cs
이 스크립트는 다양한 설정을 표시하고 프리셋 버튼을 포함하는 커스텀 에디터 창을 정의합니다.
using UnityEngine;
using UnityEditor;
using UnityEditor.Presets;
public class MyEditorWindow : EditorWindow
{
private static class Styles
{
public static GUIContent presetIcon = EditorGUIUtility.IconContent("Preset.Context");
public static GUIStyle iconButton = new GUIStyle("IconButton");
}
Editor m_SettingsEditor;
MyWindowSettings m_SerializedSettings;
public string someSettings
{
get { return EditorPrefs.GetString("MyEditorWindow_SomeSettings"); }
set { EditorPrefs.SetString("MyEditorWindow_SomeSettings", value); }
}
[MenuItem("Window/MyEditorWindow")]
static void OpenWindow()
{
GetWindow<MyEditorWindow>();
}
void OnEnable()
{
m_SerializedSettings = ScriptableObject.CreateInstance<MyWindowSettings>();
m_SerializedSettings.Init(this);
m_SettingsEditor = Editor.CreateEditor(m_SerializedSettings);
}
void OnDisable()
{
Object.DestroyImmediate(m_SerializedSettings);
Object.DestroyImmediate(m_SettingsEditor);
}
void OnGUI()
{
EditorGUILayout.BeginHorizontal();
EditorGUILayout.LabelField("My custom settings", EditorStyles.boldLabel);
GUILayout.FlexibleSpace();
var buttonPosition = EditorGUILayout.GetControlRect(false, EditorGUIUtility.singleLineHeight, Styles.iconButton);
if (EditorGUI.DropdownButton(buttonPosition, Styles.presetIcon, FocusType.Passive, Styles.iconButton))
{
var presetReceiver = ScriptableObject.CreateInstance<MySettingsReceiver>();
presetReceiver.Init(m_SerializedSettings, this);
PresetSelector.ShowSelector(m_SerializedSettings, null, true, presetReceiver);
}
EditorGUILayout.EndHorizontal();
EditorGUI.BeginChangeCheck();
m_SettingsEditor.OnInspectorGUI();
if (EditorGUI.EndChangeCheck())
{
m_SerializedSettings.ApplySettings(this);
}
}
}
요약
프리셋 시스템은 유니티에서 게임 오브젝트와 컴포넌트를 효율적으로 관리하는 데 매우 유용합니다. 이 가이드에서는 커스텀 에디터와 프리셋 설정을 통해 어떻게 효율적으로 작업할 수 있는지를 설명했습니다. 위의 예제 코드를 활용하여 자신만의 프리셋 시스템을 구현해 보세요.