public class MyEditorWindow2 : EditorWindow
{
Dictionary<SerializedObject, List<SerializedProperty>> Targets
= new Dictionary<SerializedObject, List<SerializedProperty>>();
bool isFocused = false;
...
private void OnFocus()
{
isFocused = true;
foreach(var item in Targets)
{
item.Key.Update();
}
}
private void OnLostFocus()
{
isFocused = false;
}
}
Targets 사전에 CustomScript 데이터들을 수집해 둔다.
isFocused 데이터는 EditorWindow가 선택이 되어 있을 경우 true,
다른 윈도우가 선택될 시 false가 되도록 구현
private void Update()
{
if (isFocused == false)
{
foreach (var item in Targets)
{
item.Key.Update();
}
Repaint();
}
}
Update는 매프레임 불리게 되고 Targets를 업데이트하고,
Repaint를 통하여 OnGUI 함수가 불리도록 함
원래라면 포커스가 되지 않은 윈도우는 Repaint를 하지 않음
해당 윈도우를 열어둔 상태로 오브젝트들을 눌러 인스펙터에서 스크립트 데이터를
수정할 시 바로 적용될 수 있도록 함
private void OnGUI()
{
if (GUILayout.Button("Refresh"))
{
Targets.Clear();
var allCustoms = FindObjectsOfType<CustomScript>();
if (allCustoms != null)
{
for (int i = 0; i < allCustoms.Length; i++)
{
var so = new SerializedObject(allCustoms[i]);
var properties = new List<SerializedProperty>()
{
so.FindProperty(nameof(CustomScript.otherObject)),
so.FindProperty(nameof(CustomScript.myName)),
so.FindProperty(nameof(CustomScript.myHP))
};
Targets.Add(so, properties);
}
}
}
foreach(var pair in Targets)
{
EditorGUI.BeginChangeCheck();
{
...
}
if (EditorGUI.EndChangeCheck())
{
pair.Key.ApplyModifiedProperties();
}
}
}
버튼을 누를 시 FindObjectsOfType를 통해 씬에 존재하는 스크립트 컴포넌트들을 찾음
찾아진 스크립트들을 직렬화하여 Targets에 저장
BeginChangeCheck와 EndChangeCheck를 사용하여
데이터가 수정됐을 시 ApplyModifiedProperties로 프로퍼티가 변경된 것을 적용한다.