Home Unity自动生成脚本
Post
Cancel

Unity自动生成脚本

功能实现思路

在开发过程当中可能会遇到繁复的修改脚本的操作,有时我们希望可以通过自动化修改脚本内容来避免犯一些人为可能会犯的错误。

因此我们希望将增添删除代码的具体内容抽象成一个工具,然后交给非程序的人员也可以进行编写。

在确认完需求之后一般我们会将这个工具定位成三步。

  1. 读取需要修改的脚本文件,以字符串的方式
  2. 正则表达式定位字符串需要修改的位置,通过字符串操作对文本进行拆分,并将要修改的内容进行重组
  3. 保存重组修改后的内容

类似样例代码实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
private void LoadCSharpFileAndReplaceString(string filePath, string methodName) {
            var cSharpFile = new FileStream(filePath, FileMode.Open);
            StreamReader read = new StreamReader(cSharpFile);
            var fileStr = read.ReadToEnd();
            read.Close();
            File.Delete(filePath);

            var regexStr = @"(?<=" + methodName + @"\(\) {" + _lineBreak + @")((\s.+)?)";
            var regex = new Regex(regexStr);
            var keepStr1 = fileStr.Substring(0, regex.Match(fileStr).Index);
            var keepStr2 = fileStr.Substring(regex.Match(fileStr).Index 
                                             + fileStr.Substring(regex.Match(fileStr).Index).IndexOf("}", 
                                                 StringComparison.Ordinal));
            string replaceStr = filePath == PatchVersionFilePath ?
                $"            return \"{CurrentPatchVersion}\"; //{PatchMessage}{_lineBreak}        "
                : $"        return {CurrentNetVersion}; //{NetMessage}{_lineBreak}    ";

            StringBuilder stringBuilder = new StringBuilder();
            stringBuilder.Append(keepStr1);
            stringBuilder.Append(replaceStr);
            stringBuilder.Append(keepStr2);
            fileStr = stringBuilder.ToString();
            
            FileStream file = new FileStream(filePath, FileMode.CreateNew);
            StreamWriter streamWriter = new StreamWriter(file);
            streamWriter.Write(fileStr);
            streamWriter.Flush();
            streamWriter.Close();
            file.Close();
            
            AssetDatabase.SaveAssets();
            AssetDatabase.Refresh();
        }

代码分为三小段应该能够很好的理解内容。

这里踩过的一个坑是字符串的一些特殊符号一般根据平台有两种读取形式,CRLF和LF,具体的区别会在下文进行解释。

Different between CRLF,LF and CR line break types

内容参考Stackoverflow一篇回答

CR 和 LF 都是控制字符(control characters),编码分辨是0x0D(十三进制)和0x0A(十进制)

他们用来标识在文本当中的换行符,Windows通常使用两个字符CRLF序列,Unix使用LF以及MacOS使用CR

  • CR:Carriage Return,对应ASCII中转义字符\r,表示回车
  • LF:Linefeed,对应ASCII中转义字符\n,表示换行
  • CRLF:Carriage Return & Linefeed,\r\n,表示回车并换行

据野史记载,在很久以前的机械打字机时代,CR和LF分别具有不同的作用:LF会将打印纸张上移一行位置,但是保持当前打字的水平位置不变;CR则会将“Carriage”(打字机上的滚动托架)滚回到打印纸张的最左侧,但是保持当前打字的垂直位置不变,即还是在同一行。

当CR和LF组合使用时,则会将打印纸张上移一行,且下一个打字位置将回到该行的最左侧,也就是我们今天所理解的换行操作。

随着时间的推移,机械打字机渐渐地退出了历史舞台,当初的纸张变成了今天的显示器,打字机的按键也演变为了如今的键盘。在操作系统出现的年代,受限于内存和软盘空间的不足,一些操作系统的设计者决定采用单个字符来表示换行符,如Unix的LF、MacIntosh的CR。他们的意图都是为了进行换行操作,只是当初并没有一个国际标准(或者其他原因,鬼知道),所以才有这样字符上的不同。

This post is licensed under CC BY 4.0 by the author.