找回密码
 立即注册
查看: 344|回复: 0

[简易教程] 学习Unity教程心得-----代码模板工具(Unity新人,如果有错误或不足还请各位大佬多多指教)

[复制链接]
发表于 2021-7-6 21:43 | 显示全部楼层 |阅读模式
一、首先嘞,咱们先准备好要创建的代码模板,放在指定目录下,我这里的目录是这个样子的Assets/Scripts/ScriptTemplate.cs.txt。然后我们的代码模板,俺是这样滴
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class #NAME# : MonoBehaviour
{
    void MyFunction()
    {
        
    }
}
<hr/>二、然后,就是咱们的工具(装逼)环节了
开个玩笑,咱们直接看代码,注释都写好了,各位客官请慢用
using System.IO;
using System.Text;
using System.Text.RegularExpressions;
using UnityEditor;
using UnityEditor.ProjectWindowCallback;
using UnityEngine;

public class CreateScriptByTemp
{
    private const string TempPath = "Assets/Scripts/ScriptTemplate.cs.txt";

    [MenuItem("Assets/ScriptTemp/Create", false, -1)]
    static void CreateScriptByTmp()
    {
        //这里,咱们先获取你想创建在哪个文件路径下
        string locationPath = GetSelectedPathOrFallBack();
        //然后。。。这里我也不知道啥意思了。。。。
        //但是!我应该还是能明白一点点的(此处省略我尝试了好多次才知道这是干嘛的过程)
        //这里的作用就是新建一个资源文件,但是嘞,还没有确定是啥类型的,那么!!确定类型的事就跑到了第二个参数里面去了
        ProjectWindowUtil.StartNameEditingIfProjectWindowExists(0,
            ScriptableObject.CreateInstance<MyCreateScriptAsset>(),
            locationPath + "/MyScript.cs", null, TempPath);
    }

    private static string GetSelectedPathOrFallBack()
    {
        string path = "Assets";
        //这个的作用就是获取你鼠标选中的文件夹对象
        // Object[] objs = Selection.GetFiltered(typeof(Object), SelectionMode.Assets);
        foreach (Object obj in Selection.GetFiltered(typeof(Object), SelectionMode.Assets))
        {
            path = AssetDatabase.GetAssetPath(obj);
            if (!string.IsNullOrEmpty(path) && File.Exists(path))
            {
                path = Path.GetDirectoryName(path);
                break;
            }
        }

        return path;
    }

    //这个EndNameEditAction,呃。。。顾名思义,,,,等等,我百度翻译一下。。。结束名称编辑操作???算了,不纠结这个,咱们先看代码--->>>
    class MyCreateScriptAsset : EndNameEditAction
    {
        //这个是要重写滴,不然你就会看到那个美丽的红色的线条
        public override void Action(int instanceId, string pathName, string resourceFile)
        {
            //这里可就厉害了,看到这个方法名没有,Action!!一看就很得劲儿
            //他这里是这个样子,我们右键点击了某个文件夹之后,点击我们拓展的菜单后会创建出一个资源文件让我们命名
            //然后,当我们输入名字后,那这个名字带着它所在的路径跑到pathName里面去,然后resourceFile里面就是咱们的模板路径了
            Object o = CreateScriptByTemp(pathName, resourceFile);
            ProjectWindowUtil.ShowCreatedAsset(o);
            AssetDatabase.Refresh();
        }

        //这里就是咱们处理模板代码的操作啦,一顿稀里哗啦的操作,然后模板就变成了object,
        //然后就用ProjectWindowUtil.ShowCreatedAsset(o)这个东西给他显示出来,、
        //然后保险起见,用这个AssetDatabase.Refresh()刷新一下(咳咳,我不知道这里频繁刷新有木有问题哈)
        private static Object CreateScriptByTemp(string pathName, string resourceFile)
        {
            string fullPath = Path.GetFullPath(pathName);
            StreamReader streamReader = new StreamReader(resourceFile);
            string txt = streamReader.ReadToEnd();
            streamReader.Close();
            string fileNameWithOutExtension = Path.GetFileNameWithoutExtension(pathName);
            txt = Regex.Replace(txt, "#NAME#", fileNameWithOutExtension);
            bool encoderShouldEmitUTF8Identifier = true;
            bool throwOnInvalidBytes = false;
            UTF8Encoding encoding = new UTF8Encoding(encoderShouldEmitUTF8Identifier, throwOnInvalidBytes);
            bool append = false;
            StreamWriter streamWriter = new StreamWriter(fullPath, append, encoding);
            streamWriter.Write(txt);
            streamWriter.Close();
            AssetDatabase.ImportAsset(txt);
            return AssetDatabase.LoadAssetAtPath(pathName, typeof(Object));
        }
    }
}
献丑结束,谢谢大家捧场

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Unity开发者联盟 ( 粤ICP备20003399号 )

GMT+8, 2024-5-20 05:58 , Processed in 0.091486 second(s), 26 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表