欢迎光临
我们一直在努力

【100个 Unity实用技巧】☀️ | 自动导出UI组件代码

请添加图片描述


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的知识以达到查漏补缺

在这里插入图片描述

赞(0)
未经允许不得转载:171主机测评 » 【100个 Unity实用技巧】☀️ | 自动导出UI组件代码
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址