EditorWindow 응용

ㅋㅋ·2022년 9월 7일
0
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로 프로퍼티가 변경된 것을 적용한다.

0개의 댓글