본문 바로가기
개발/Unity

Unity)Script Template + ScriptableObject (Custom Keyword)

by 테샤르 2022. 7. 10.

Script Template + ScriptableObject (Custom Keyword)

ScriptableObject와 Script Template를 사용하면 좀더 커스텀한 포맷으로 스크립트를 작성할수있다.

생성된 날짜, 작성자 등등 생성시점에 자동으로 만들수 있다.

 

반응형

AssetModificationProcessor를 통해서 에셋이 변경되는 시점에서 특정 Key를 기준으로 Value로 변경한다.

<ScriptTemplateReplace>

 

/**
* ScriptTemplate.cs
*/
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEditor;

/// <summary>
/// Custom Script Template 의 예약된 항목을 변경해주기위한 AssetModificationPorcessor
/// </summary>
public class ScriptTemplateReplace : UnityEditor.AssetModificationProcessor
{
    static string environmentPath = "Assets/ScriptTemplates/ScriptableObject/ScriptTemplateEnv.asset";
    public static void OnWillCreateAsset(string path)
    {
        path = path.Replace(".meta", "");
        int index = path.LastIndexOf(".");
        string file = path.Substring(index);

        if (file != ".cs" && file != ".js" && file != ".boo") 
            return;

        index = Application.dataPath.LastIndexOf("Assets");
        path = Application.dataPath.Substring(0, index) + path;
        file = System.IO.File.ReadAllText(path);

        var replaceList = AssetDatabase.LoadAssetAtPath<ScriptTemplateEnv>(environmentPath);
        if (null == replaceList)
            return;

        foreach (var replace in replaceList.Values)
            file = file.Replace(replace.Getkey(), $"{ replace.GetValue() } ");

        //CREATE_DATE 따로 추가
        file = file.Replace("#CREATE_DATE#", System.DateTime.Now.ToString("yyyy년 MM월 dd일 tt h시 mm분"));

        System.IO.File.WriteAllText(path, file);
        AssetDatabase.Refresh();
    }
}

 

 

<ScriptTemplateEnv>

/// <summary>
/// ScriptTemplateReplace에서 Replace를 하기위한 ScripatebleObject
/// </summary>
[CreateAssetMenu(fileName = "ScriptTemplateEnv", menuName = "C# Custom Script/Environment", order = 1)]
public class ScriptTemplateEnv : ScriptableObject
{
    [Header("#CREATE_DATE# 값은 시간으로 예약처리됩니다.")]
    [Header("ScriptTemplateReplace Recplace (Key Value) Value", HeaderAttribute.HeaderAlign.Center)]
    [SerializeField]
    public List<ScriptTemplateEnvInfo> Values;
}

[System.Serializable]
public class ScriptTemplateEnvInfo
{
    [SerializeField]
    private string key;

    [SerializeField]
    private string value;


    public string Getkey()
    {
        return key;
    }

    public string GetValue()
    {
        return value;
    }
}

스크립트의 설명같은걸 규격화시키면 조금더 수월하게 작업할수 있다.

 

★☆☆☆☆

 

반응형

댓글