unity自动化生成脚本工具

游戏开发中有很多要重复写的代码,尤其是UI面板。所以我们可以写一个编辑器扩展自动生成脚本提高开发效率。逻辑不难代码也不算长,根据注释捋一下逻辑就可以轻松使用啦。

使用方法:
选中Project面板下的UI预制体即可。要注意只会获取dicUIType字典中符合命名规则目标的路径。在这里插入图片描述

UIClass是我们创建类的模板,可以根据我们的需求灵活修改。
注意要放在Editor文件夹下。

参考地址

代码部分:

using UnityEngine;
using UnityEditor;
using System.Linq;
using System.Collections.Generic;
using System.IO;
using System.Text.RegularExpressions;
using System.Text;


public class AutoBuildTemplate
{
    public static string UIClass =
 @"using UnityEngine;
using UnityEngine.UI;
using UnityEngine.EventSystems;
using System;
public class #类名# : MonoBehaviour
{
//auto
    #成员#

   public void Start()
	{
		#查找#
	}
}
";
}


public class AutoBuild
{

    [MenuItem("生成/创建或刷新界面")]
    public static void BuildUIScript()
    {

        var dicUIType = new Dictionary<string, string>();

        dicUIType.Add("Img", "Image");
        dicUIType.Add("Btn", "Button");
        dicUIType.Add("Txt", "Text");
        dicUIType.Add("Tran", "Transform");

        //获取选中的prefab
        GameObject[] selectobjs = Selection.gameObjects;

        foreach (GameObject go in selectobjs)
        {
            //选择的物体
            GameObject selectobj = go.transform.root.gameObject;

            //物体的子物体
            Transform[] _transforms = selectobj.GetComponentsInChildren<Transform>(true);

            //转换为list
            List<Transform> childList = new List<Transform>(_transforms);

            //UI需要查询的物体,根据规则筛选
            var mainNode = from trans in childList where dicUIType.Keys.ToList().Any(_ => trans.name.Contains(_)) select trans;

            //存储每个目标路径
            var nodePathList = new Dictionary<string, string>();

            //循环得到物体路径
            foreach (Transform node in mainNode)
            {
                Transform tempNode = node;
                string nodePath = "/" + tempNode.name;

                //遍历到顶,求得路径
                while (tempNode != tempNode.root)
                {
                    //取得上级
                    tempNode = tempNode.parent;

                    //求出/在哪
                    int index = nodePath.IndexOf('/');

                    //把得到的路径插入
                    nodePath = nodePath.Insert(index, "/" + tempNode.name);
                }

                //将最终路径存入
                nodePathList.Add(node.name, nodePath);
            }

            //成员变量字符串
            string memberstring = "";
            //查询代码字符串
            string loadedcontant = "";

            foreach (Transform itemtran in mainNode)
            {
                //识别变量类型
                string typeStr = dicUIType[dicUIType.Keys.First(_ => itemtran.name.Contains(_))];

                //变量声明
                memberstring += "private " + typeStr + " " + itemtran.name + " = null;\r\n\t";

                //查找语句
                loadedcontant += itemtran.name + " = " + "gameObject.transform.Find(\"" + nodePathList[itemtran.name] + "\").GetComponent<" + typeStr + ">();\r\n\t\t";
            }

            //创建脚本的路径
            string scriptPath = Application.dataPath + "/Scripts/" + selectobj.name + ".cs";


            string classStr = "";

            //如果已经存在了脚本,则只替换//auto下方的字符串
            //方便刷新
            if (File.Exists(scriptPath))
            {
                FileStream classfile = new FileStream(scriptPath, FileMode.Open);
                StreamReader read = new StreamReader(classfile);
                classStr = read.ReadToEnd();
                read.Close();
                classfile.Close();
                File.Delete(scriptPath);

                //分割的位置
                string splitStr = "//auto";
                //auto 上面的部分
                string unchangeStr = Regex.Split(classStr, splitStr, RegexOptions.IgnoreCase)[0];
                //auto 下面的部分
                string changeStr = Regex.Split(AutoBuildTemplate.UIClass, splitStr, RegexOptions.IgnoreCase)[1];

                StringBuilder build = new StringBuilder();
                build.Append(unchangeStr);
                build.Append(splitStr);
                build.Append(changeStr);
                classStr = build.ToString();
            }
            else
            {
                classStr = AutoBuildTemplate.UIClass;
            }

            classStr = classStr.Replace("#类名#", selectobj.name);
            classStr = classStr.Replace("#查找#", loadedcontant);
            classStr = classStr.Replace("#成员#", memberstring);

            FileStream file = new FileStream(scriptPath, FileMode.CreateNew);
            StreamWriter fileW = new StreamWriter(file, System.Text.Encoding.UTF8);
            fileW.Write(classStr);
            fileW.Flush();
            fileW.Close();
            file.Close();

            Debug.Log("创建脚本 " + Application.dataPath + "/Scripts/" + selectobj.name + ".cs 成功!");
            AssetDatabase.SaveAssets();
            AssetDatabase.Refresh();
        }
    }
}

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Unity提供了一些命令行工具来支持自动化构建,例如Unity编辑器的批处理模式和Unity命令行工具。Jenkins是一种流行的自动化构建工具,可以通过编写脚本自动化Unity项目的构建和部署。以下是一个简单的Jenkins脚本示例: ``` stage('Build Unity Project') { steps { sh "unity -batchmode -quit -projectPath /path/to/project -executeMethod BuildScript.PerformBuild -logFile /path/to/logfile.log" } } ``` 在这个脚本中,我们使用Unity批处理模式来构建Unity项目。`-batchmode`参数告诉Unity以批处理模式运行,`-quit`参数告诉Unity在完成操作后关闭编辑器,`-projectPath`参数指定项目路径,`-executeMethod`参数指定要执行的方法,`-logFile`参数指定日志文件路径。 在你的Unity项目中,你需要编写一个自定义的编辑器脚本来实现构建逻辑。这个脚本需要继承自`EditorWindow`或`Editor`类,并实现一个名为`PerformBuild`的静态方法。在这个方法中,你可以使用Unity的API来自定义构建流程,例如导出游戏包或生成可执行文件。 ``` public static void PerformBuild() { BuildPlayerOptions buildPlayerOptions = new BuildPlayerOptions(); buildPlayerOptions.scenes = new[] { "Assets/Scenes/Main.unity" }; buildPlayerOptions.locationPathName = "/path/to/build"; buildPlayerOptions.target = BuildTarget.StandaloneWindows64; buildPlayerOptions.options = BuildOptions.None; BuildPipeline.BuildPlayer(buildPlayerOptions); } ``` 在这个示例中,我们使用BuildPipeline类来构建游戏包。我们指定了要打包的场景、输出路径、目标平台和构建选项。 在Jenkins中,你可以将以上脚本复制到一个新的构建步骤中,并配置好Unity的安装路径、项目路径和日志文件路径。当你运行Jenkins构建时,它将自动构建你的Unity项目,并将日志输出到指定的文件。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我寄人间雪满头丶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值