Unity3D创建C#自定义模板快速实现基类接口

根据模板类,我们可以快速的创建一些我们想要的脚本内容,比如我们有接口要在子类上实现,就可以写一个对应的模板,每次创建脚本就会帮我自动实现接口,特别是在UI脚本上经常需要用到这个需求。

c#模板类

// **********************************************************************
// Copyright (C) XM
// Author: 吴肖牧
// Date: 2018-02-23
// Desc: 
// **********************************************************************
using UnityEngine;
using System.IO;
using System.Text;
using System.Text.RegularExpressions;
using UnityEditor;
using UnityEditor.ProjectWindowCallback;

public class CreateScriptUtil:Editor {

    //EditorApplication.applicationContentsPath  Unity模版路径

    //该注释的方法无法处理模版内容,故不予以采用

    //public static void CreateScriptUtil(string path, string templete)
    //{
    //    MethodInfo method = typeof(ProjectWindowUtil).GetMethod("CreateScriptAsset",BindingFlags.Static | BindingFlags.NonPublic);
    //    if (method != null)
    //    {
    //        method.Invoke(null, new object[] { templete, path });
    //    }
    //}

    //[MenuItem("Assets/XM/UILua.lua", false, 1)]
    //static void CreateMyLua()
    //{
    //    CreateScriptUtil(@"UILua.lua", Application.dataPath + "/Scripts/CreateScriptUtil/ScriptTemplates/XM_Lua_UI.lua.txt");
    //}

    //[MenuItem("Assets/XM/XMCSharp.cs", false, 51)]
    //static void CreateMyCShap()
    //{
    //    CreateScriptUtil(@"XMCSharp.cs", Application.dataPath + "/Scripts/CreateScriptUtil/ScriptTemplates/XMCSharp.cs.txt");
    //}


    [MenuItem("Assets/Create/XM/Lua Script", false, 80)]
    public static void CreatNewLua()
    {
        ProjectWindowUtil.StartNameEditingIfProjectWindowExists(0,
        ScriptableObject.CreateInstance<MyDoCreateScriptAsset>(),
        GetSelectedPathOrFallback() + "/NewLuaScript.lua",
        null,
       Application.dataPath + "/Scripts/ScriptTemplates/XM_Lua_UI.lua.txt");
    }

    [MenuItem("Assets/Create/XM/C# Script", false, 81)]
    public static void CreatNewCSharp()
    {
        ProjectWindowUtil.StartNameEditingIfProjectWindowExists(0,
        ScriptableObject.CreateInstance<MyDoCreateScriptAsset>(),
        GetSelectedPathOrFallback() + "/NewBehaviourScript.cs",
        null,
       Application.dataPath + "/Scripts/ScriptTemplates/XMCSharp.cs.txt");
    }



    public static string GetSelectedPathOrFallback()
    {
        string path = "Assets";
        foreach (UnityEngine.Object obj in Selection.GetFiltered(typeof(UnityEngine.Object), SelectionMode.Assets))
        {
            path = AssetDatabase.GetAssetPath(obj);
            if (!string.IsNullOrEmpty(path) && File.Exists(path))
            {
                path = Path.GetDirectoryName(path);
                break;
            }
        }
        return path;
    }
}


class MyDoCreateScriptAsset : EndNameEditAction
{
    public override void Action(int instanceId, string pathName, string resourceFile)
    {
        UnityEngine.Object o = CreateScriptAssetFromTemplate(pathName, resourceFile);
        ProjectWindowUtil.ShowCreatedAsset(o);
    }

    internal static UnityEngine.Object CreateScriptAssetFromTemplate(string pathName, string resourceFile)
    {
        string fullPath = Path.GetFullPath(pathName);
        StreamReader streamReader = new StreamReader(resourceFile);
        string text = streamReader.ReadToEnd();
        streamReader.Close();

        //TODO:脚本内容处理
        string fileNameWithoutExtension = Path.GetFileNameWithoutExtension(pathName);
        text = Regex.Replace(text, "#SCRIPTNAME#", fileNameWithoutExtension);
        text = Regex.Replace(text, "#DATE#", System.DateTime.Now.ToString("yyyy-MM-dd"));

        bool encoderShouldEmitUTF8Identifier = true;
        bool throwOnInvalidBytes = false;
        UTF8Encoding encoding = new UTF8Encoding(encoderShouldEmitUTF8Identifier, throwOnInvalidBytes);
        bool append = false;
        StreamWriter streamWriter = new StreamWriter(fullPath, append, encoding);
        streamWriter.Write(text);
        streamWriter.Close();
        AssetDatabase.ImportAsset(pathName);
        return AssetDatabase.LoadAssetAtPath(pathName, typeof(UnityEngine.Object));
    }
}

c#模板

// **********************************************************************
// Copyright (C) XM
// Author: 吴肖牧
// Date: #DATE#
// Desc: 
// **********************************************************************
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class #SCRIPTNAME# : MonoBehaviour {

	void Start () {

	}
	
	void Update () {

	}
}

我们可以根据项目需求自行拓展模板。

猜你喜欢

转载自blog.csdn.net/yye4520/article/details/80393830