IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 游戏开发 -> Unity代码自动生成 -> 正文阅读

[游戏开发]Unity代码自动生成

这里举两个简单的例子(非原创,不选原创发布不了)

第一个例子是知乎上的例子:

https://zhuanlan.zhihu.com/p/30716595

自动给UI组件绑定

第二个例子是自己的需求,需要根据字符串数组自动生成对应枚举脚本

我只能说例子虽然简单,但是如果再往上拓展,会极大的减少重复性的代码开发操作


给Panel添加组件绑定脚本

1.对应素材

在这里插入图片描述

2.使用结果(生成脚本)

在这里插入图片描述

3.脚本

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");


       GameObject[] selectobjs = Selection.gameObjects;

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

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

           List<Transform> childList = new List<Transform>(_transforms);

           //UI需要查询的物体
           var mainNode = from trans in childList where trans.name.Contains('_') && dicUIType.Keys.Contains(trans.name.Split('_')[0]) 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[itemtran.name.Split('_')[0]];

               memberstring += "public " + 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";
               string unchangeStr = Regex.Split(classStr, splitStr, RegexOptions.IgnoreCase)[0];
               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();
       }
   }

}

给定对应字符串数组生成对应枚举

1.使用结果(生成脚本)

在这里插入图片描述

2.脚本

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


public class AutoEnumBuildTemplate
{
   public static string UIClass =
@"using UnityEngine;
using UnityEngine.UI;
using UnityEngine.EventSystems;
using System;
//以下代码都是通过脚本自动生成的
public class #类名# 
{
   
   #成员#
   
}
";
}

public class AutoEnumBuild
{

    public enum EnumTask
    {
        棉花,
        桃子
        
    }
    
    
   [MenuItem("生成/根据字符串生成枚举类型")]
   public static void BuildUIScript()
   {
       string enumSettingName = "AutoCreateEnum";
       //
       List<string> strFarmName = new List<string>();
       strFarmName.Add("苹果");
       strFarmName.Add("桃子");
       strFarmName.Add("樱桃");
       strFarmName.Add("甘蓝");
       strFarmName.Add("葡萄");
       //
       string scriptPath = Application.dataPath + "/Scripts/" + enumSettingName + ".cs";

       string stringEnumName = "public enum EnumPlant{ ";

       foreach (var value in strFarmName)
       {
           stringEnumName += value + ",";
       }
       
       stringEnumName = stringEnumName.Substring(0, stringEnumName.Length - 1);
       stringEnumName += "}";
       
       
       //
       string classInfo = AutoEnumBuildTemplate.UIClass;
       classInfo = classInfo.Replace("#类名#", enumSettingName);
       classInfo = classInfo.Replace("#成员#", stringEnumName);
       //
       
       FileStream file = new FileStream(scriptPath, FileMode.CreateNew);
       StreamWriter fileW = new StreamWriter(file, System.Text.Encoding.UTF8);
       fileW.Write(classInfo);
       fileW.Flush();
       fileW.Close();
       file.Close();
       //
       Debug.Log("创建脚本 " + Application.dataPath + "/Scripts/" + enumSettingName+ ".cs 成功!");
       AssetDatabase.SaveAssets();
       AssetDatabase.Refresh();
   }
   
}

  游戏开发 最新文章
6、英飞凌-AURIX-TC3XX: PWM实验之使用 GT
泛型自动装箱
CubeMax添加Rtthread操作系统 组件STM32F10
python多线程编程:如何优雅地关闭线程
数据类型隐式转换导致的阻塞
WebAPi实现多文件上传,并附带参数
from origin ‘null‘ has been blocked by
UE4 蓝图调用C++函数(附带项目工程)
Unity学习笔记(一)结构体的简单理解与应用
【Memory As a Programming Concept in C a
上一篇文章      下一篇文章      查看所有文章
加:2021-10-20 12:48:49  更:2021-10-20 12:49:59 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/28 0:47:40-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码