前言
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对象中,这里把内容返回
}
获取类名
这里的类名有两种方式
- 写一个Editor窗口,在里面输入类名,自动生成脚本
这种方式,适合开始时说的,给框架生成一套脚本,因为他们的前置名称都是一样的
例如:我们写Player功能,需要生成PlayerView,PlayerModel,PlayerService等等,就可以输入Player,自动生成这一系列脚本 - 根据新创建的脚本自动获取类名,修改创建的脚本内容
这种方式适合给新建脚本自动添加命名空间
范例:自动添加命名空间