
Unity 小知识 大智慧
-
🎬 博客主页:https://xiaoy.blog.csdn.net
-
🎥 本文由 呆呆敲代码的小Y 原创,首发于 CSDN🙉
-
🎄 学习专栏推荐:Unity系统学习专栏
-
🌲 游戏制作专栏推荐:游戏制作
-
🌲Unity实战100例专栏推荐:Unity 实战100例 教程
-
🏅 欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正!
-
📆 未来很长,值得我们全力奔赴更美好的生活✨
-
——————❤️分割线❤️————————-

Unity 实用技巧学习
Unity中 自动导出UI组件代码
在日常工作中,经常会用到UI组件,并且编写绑定组件的代码。这种情况就可以使用工具进行快速生成,下面看下具体实现方法。
搭建一个测试使用的预制体testView,如下所示: 
通过Tools -> UI工具 -> 导出UI组件代码使用,然后复制生成的代码即可。 
生成的代码如下: 
可根据需求自行定制和修改,提高开发效率。
ExportBindUIComp.cs,完整代码如下:
using System.Collections.Generic;
using UnityEditor;
using UnityEngine;
public static class ExportBindUIComp
{
private static string exportString = "";
private static Dictionary<string, string> uiTypeDic = new Dictionary<string, string>()
{
// 只读取以下标签的节点,不是以下标签的节点忽略自己但是会读取子节点,以_开头的忽略自己和子节点
{"btn","Button"}, // btn_按钮名
{"img","Image"}, // img_图片名
{"txt","Text"}, // txt_文本名
{"obj","GameObject"}, // obj_对象名
{"toggle","Toggle"}, // toggle_输入框名
{"input","InputField"}, // input_输入框名
{"slider","Slider"}, // slider_滑动条名
{"scroll","ScrollRect"}, // scroll_滚动条名
{"tmpText","TMP_Text"},
{"tmpInput","TMP_InputField"},
{"view","View"}, // view_脚本名。该类型为脚本
};
[MenuItem("Tools/UI工具/导出UI组件代码 #&%C")]
private static void exportUIComp()
{
var prefabStage = UnityEditor.SceneManagement.PrefabStageUtility.GetCurrentPrefabStage();
if (prefabStage == null)
{
Debug.LogError("需要进入预制体编辑状态进行后续操作!");
return;
}
exportString = "";
GameObject basePrebabModal = AssetDatabase.LoadAssetAtPath(prefabStage.assetPath, typeof(GameObject)) as GameObject;
exportString += "\\n#region ui component\\n";
exportUICompList(basePrebabModal.transform, "");
exportString += "\\nprivate void Awake()\\n{\\n";
exportResetFunc(basePrebabModal.transform, "");
exportString += "}\\n";
exportString += "\\n#endregion\\n";
GUIUtility.systemCopyBuffer = exportString;
Debug.Log("已保存到剪贴板:" + exportString);
}
/// <summary>
/// 导出ui组件列表文本,ui命名规范为 "{uiTypeDic中的前缀}_{任意名字}"
/// </summary>
private static void exportUICompList(Transform transform, string path = "")
{
var len = transform.childCount;
for (var i = 0; i < len; i++)
{
var childTrans = transform.GetChild(i);
var name = childTrans.name;
var uiTypeArr = name.Split('_');
string uiType = uiTypeArr[0];
bool forChild = true; // 是否递归子节点
bool ignore = false; // 是否忽略当前节点
string typeName = "";
if (!uiTypeDic.TryGetValue(uiType, out typeName))
{
ignore = true;
//Debug.LogWarning("ui类型命名有误:" + uiType);
}
// 需要特殊处理的类型
switch (uiType)
{
case "view":
typeName = uiTypeArr[1];//如果是ui则切换下一层继续查找。
forChild = false;
break;
case "scroll":
forChild = false;
break;
case "": // _name 以_开头的不做查找处理。
ignore = true;
forChild = false;
break;
}
if (!ignore)
{
string targetStr = $"[SerializeField] private {typeName} {name};\\n";
if (exportString.IndexOf(targetStr) == –1)
{
exportString += targetStr;
}
else
{
Debug.LogError($"重复的属性名={name} path={path}");
}
}
if (forChild)
{
exportUICompList(childTrans, path + "/" + name);
}
}
}
private static void exportResetFunc(Transform a_trans, string a_path)
{
var len = a_trans.childCount;
for (var i = 0; i < len; i++)
{
var childTrans = a_trans.GetChild(i);
var name = childTrans.name;
var uiTypeArr = name.Split('_');
string uiType = uiTypeArr[0];
bool forChild = true;
bool ignore = false;
string typeName = "";
if (!uiTypeDic.TryGetValue(uiType, out typeName))
{
ignore = true;
//Debug.LogWarning("ui类型命名有误:" + uiType);
}
switch (uiType)
{
case "view":
typeName = uiTypeArr[1];
forChild = false;
break;
case "scroll":
forChild = false;
break;
case "": // 跳过
ignore = true;
forChild = false;
break;
}
if (!ignore)
{
string targetStr;
if (a_path == "")
{
if (uiType == "obj")
{
targetStr = $"{name} = transform.Find(\\"{name}\\").gameObject;\\n";
}
else
{
targetStr = $"{name} = transform.Find(\\"{name}\\").GetComponent<{typeName}>();\\n";
}
}
else
{
if (uiType == "obj")
{
targetStr = $"{name} = transform.Find(\\"{a_path}/{name}\\").gameObject;\\n";
}
else
{
targetStr = $"{name} = transform.Find(\\"{a_path}/{name}\\").GetComponent<{typeName}>();\\n";
}
}
if (exportString.IndexOf(targetStr) == –1)
{
exportString += targetStr;
}
else
{
Debug.LogError($"重复的属性名={name} path={a_path}");
}
}
if (forChild)
{
if (a_path == "")
{
exportResetFunc(childTrans, name);
}
else
{
exportResetFunc(childTrans, a_path + "/" + name);
}
}
}
}
}
资料白嫖,技术互助
| 🧡 Unity系统学习专栏 | 入门级 | 本专栏从Unity入门开始学习,快速达到Unity的入门水平 |
| 💛 Unity实战类项目 | 进阶级 | 计划制作Unity的 100个实战案例!助你进入Unity世界,争取做最全的Unity原创博客大全。 |
| ❤️ 游戏制作专栏 | 难度偏高 | 分享学习一些Unity成品的游戏Demo和其他语言的小游戏! |
| 💚 游戏爱好者万人社区 | 互助/吹水 | 数万人游戏爱好者社区,聊天互助,白嫖奖品 |
| 💙 Unity100个实用技能 | Unity查漏补缺 | 针对一些Unity中经常用到的一些小知识和技能进行学习介绍,核心目的就是让我们能够快速学习Unity的知识以达到查漏补缺 |

