에디터 스크립트에서 직접 스크립트를 생성하는 방법

유니티 & C#|2021. 3. 10. 16:41
// 코드를 받아 스크립트를 생성하거나 업데이트 하는 함수
private void CreateScript(string path, string code)
{
    File.WriteAllText("Assets/" + path, code);
    AssetDatabase.Refresh();
}

Path와 코드 내용을 입력받아 해당 Path에 스크립트를 생성할 수 있다.

 

다음은 팝업 접근에 용이하도록 MyPopups.cs를 생성하는 에디터 코드이다.

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using UnityEditor;
using UnityEngine;

namespace Waker.Popups.Editors
{
    [CustomEditor(typeof(PopupController))]
    public class PopupControllerEditor : Editor
    {
        public override void OnInspectorGUI()
        {
            base.OnInspectorGUI();

            if (GUILayout.Button("Generate MyPopups.cs"))
            {
                PopupController instance = target as PopupController;

                var popups = instance.GetComponentsInChildren<PopupBase>();
                string code = CreateCode(popups);
                CreateScript(code);
            }
        }

        private string CreateCode(IEnumerable<PopupBase> popups)
        {
            StringBuilder sb = new StringBuilder();

            sb.AppendLine("using Waker.Popups;");
            sb.AppendLine("// PopupController.cs에 의해 자동으로 생성된 스크립트입니다. 네임스페이스를 추가하거나 에러를 수정하는 등 자유롭게 수정 가능합니다.");
            sb.AppendLine("public static class MyPopups");
            sb.AppendLine("{");

            foreach (var popup in popups)
            {
                string typeName = popup.GetType().Name;
                string popupName = popup.PopupName;
                string propertyName = String.Concat(popupName.Where(c => !Char.IsWhiteSpace(c)));
                sb.AppendLine($"\tpublic static {typeName} {propertyName} => PopupController.Instance.Get<{typeName}>(\"{popupName}\");");
            }

            sb.AppendLine("}");

            return sb.ToString();
        }

		// 코드를 받아 스크립트를 생성하거나 업데이트 하는 함수
        private void CreateScript(string code)
        {
            File.WriteAllText("Assets/MyPopups.cs", code);
            AssetDatabase.Refresh();
        }
    }
    
}

댓글()