自动创建脚本插件

前言

Unity中有的时候,我们会有自动创建脚本的需求,例如像使用mvc之类的框架的时候,它的view,mediator,service,command,model基本都是成套创建的,这个时候有一个脚本创建的插件就会舒服很多,我这里写的是一个生成脚本的帮助类,可以帮你快速生成一个自定义的脚本内容

基础接口

提供一些基础的添加操作,例如添加命名空间,添加引用,添加方法等等接口,这样使用的时候只需关注你要添加的东西就好,不用管内部逻辑

    public class ScriptBuildHelp
    {
        private StringBuilder _stringBuilder;//脚本内容保存
        private string _lineBrake = "\r\n";//换行符
        private int currentIndex = 0;//当前插入内容在字符串中的下标
        public int IndentTimes { get; set; }//缩进次数

        public ScriptBuildHelp()
        {
            _stringBuilder = new StringBuilder();
        }
        
		//写入内容方法
        private void Write(string context, bool needIndent = false)
        {
            if (needIndent)
            {
                context = GetIndent() + context;
            }

            if (currentIndex == _stringBuilder.Length)
            {
                _stringBuilder.Append(context);
            }
            else
            {
                _stringBuilder.Insert(currentIndex, context);
            }

            currentIndex += context.Length;
        }
        
		//写入行方法
        private void WriteLine(string context, bool needIndent = false)
        {
            Write(context + _lineBrake, needIndent);
        }
        
		//获取缩进的空格字符串
        private string GetIndent()
        {
            string indent = "";
            for (int i = 0; i < IndentTimes; i++)
            {
                indent += "    ";
            }
            return indent;
        }
        
		//写入一对大括号
        private int WriteCurlyBrackets()
        {
            var start = _lineBrake+GetIndent() + "{" + _lineBrake;
            var end = GetIndent() + "}" + _lineBrake;
            Write(start + end, true);
            return end.Length;
        }
        
		//写入引用
        public void WriteUsing(string nameSpaceName)
        {
            WriteLine("using "+ nameSpaceName + ";");
        }
        
		//写入空行
        public void WriteEmptyLine()
        {
            WriteLine("");
        }
        
		//写入命名空间
        public void WriteNamespace(string name)
        {
            Write("namespace "+ name);
            int length = WriteCurlyBrackets();
            currentIndex -= length;
        }
        
		//写入类
        public void WriteClass(string name)
        {
            Write("public class "+ name+" : MonoBehaviour ",true);
            int length = WriteCurlyBrackets();
            currentIndex -= length;
        }
        
		//写入方法
		//参数params string[] paraName是写入参数名称,需要带类型一起写入
		//例如:要生成一个Start(int index)方法
		// WriteFun(“Start”,“int index”);这样调用就可以
        public void WriteFun(string name,params string[] paraName)
        {
            StringBuilder temp = new StringBuilder();
            temp.Append("public void " + name + "()");
            if (paraName.Length > 0)
            {
                foreach (string s in paraName)
                {
                    temp.Insert(temp.Length - 1, s + ",");
                }
                temp.Remove(temp.Length - 2, 1);
            }
            Write(temp.ToString(), true);
            WriteCurlyBrackets();
        }
        
        //写入属性 第一个参数是特性名称,第二个参数是属性的类型,第三个参数是属性名称
        public void WriteProperty(string attributeName,string typeName, string name)
        {
            WriteEmptyLine();
            WriteLine(GetIndent()+"[" + attributeName + "]");
            WriteLine(GetIndent()+"public " + typeName +" "+ name+ " { get; set; }");
            WriteEmptyLine();
        }
        
		//输出脚本内容
        public override string ToString()
        {
            return _stringBuilder.ToString();
        }
    }

使用范例:

        private static string GetNewScriptContext(string className)
        {
            var script = new ScriptBuildHelp();//创建帮助类对象
            script.WriteUsing("UnityEngine");//添加UnityEngine的引用
            script.WriteEmptyLine();//添加空行
            script.WriteNamespace("UIFrame");//添加名称为UIFrame命名空间

            script.IndentTimes++;//添加缩进
            script.WriteClass(className);//添加类

            script.IndentTimes++;//添加缩进
            script.WriteFun("Start");//添加Start方法
            return script.ToString();//因为脚本内容实际是保存在string对象中,这里把内容返回
        }

获取类名

这里的类名有两种方式

  1. 写一个Editor窗口,在里面输入类名,自动生成脚本
    这种方式,适合开始时说的,给框架生成一套脚本,因为他们的前置名称都是一样的
    例如:我们写Player功能,需要生成PlayerView,PlayerModel,PlayerService等等,就可以输入Player,自动生成这一系列脚本
  2. 根据新创建的脚本自动获取类名,修改创建的脚本内容
    这种方式适合给新建脚本自动添加命名空间
    范例:自动添加命名空间

工具收录于我自己写的工具集,内部还有我写的几个小插件,我会慢慢更新,欢迎关注
工具集地址:https://github.com/BlueMonk1107/BlueToolkit

我会在我的公众号上推送新的博文,也可以帮大家解答问题
微信公众号 Andy and Unity 搜索名称或扫描二维码
在这里插入图片描述
希望我们能共同成长,共同进步

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值