获取unity中prefab的中文文本内容以及和prefab有关的问题
背景1:经常会在开发中遇到策划需要改某个界面,但是我们不知道那是什么界面,只看到一些关键字比如圣诞活动,那这样我就可以轻易找到这个预设了。另外还可以扩展就是收集项目中的所有中文文本然后归集到多语言表中,然后接入百度翻译api完成自动翻译。
背景2:经常需要批处理预设却发现好多missing脚本的情况导致无法保存预设。
背景3:每次自己构建的text或者image组件总是会带一个rayCasttarget= true的属性,如果不影响事件应该处理为false。我希望在双击进入预设和退出预设的时候对预设自动处理一些属性并保存。
背景1代码如下:我写了2个接口一个是获取\uxxxx的文本内容 一个是获取Text组件上文本内容,大家可以根据需要选用接口。我不打算用unity的api来做主要是想做一个外部工具,用unity的工具有它的局限性。
/// <summary>
/// 获取text组件上的文本
/// </summary>
/// <param name="prefabPath"></param>
/// <returns></returns>
static string GetTextsTextFormPrefab(string prefabPath)
{
string prefabContent = File.ReadAllText(prefabPath);
var listContent = Regex.Matches(prefabContent, @"m_Text:\s*""(\\u([0-9A-Fa-f]{4}))+""");
string chinsesPattern = @"(\\u[0-9a-fA-F]{4})+";
StringBuilder sb = new StringBuilder();
foreach (Match collect in listContent)
{
var subCollect = Regex.Matches(collect.Value, chinsesPattern);
foreach (Match sub in subCollect)
{
string pattern = @"\\u([0-9a-fA-F]{4})";
sb.Append(Regex.Replace(sub.Value, pattern, match =>
{
// 将匹配到的 Unicode 转义序列转换为对应的 Unicode 字符
string unicodeValue = match.Groups[1].Value;
int codePoint = Convert.ToInt32(unicodeValue, 16);
return char.ConvertFromUtf32(codePoint);
}));
}
}
return sb.ToString();
}
/// <summary>
/// 获取预设上的文本内容
/// </summary>
/// <param name="prefabPath"></param>
/// <returns></returns>
static string GetTextFromPrefab(string prefabPath)
{
string prefabContent = File.ReadAllText(prefabPath);
Regex regex = new Regex(@"(\\u([0-9A-Fa-f]{4}))+", RegexOptions.Multiline);
var listContent = regex.Matches(prefabContent);
string chinsesPattern = @"(\\u[0-9a-fA-F]{4})+";
StringBuilder sb = new StringBuilder();
foreach (Match collect in listContent)
{
var subCollect = Regex.Matches(collect.Value, chinsesPattern);
foreach (Match sub in subCollect)
{
string pattern = @"\\u([0-9a-fA-F]{4})";
sb.AppendLine(Regex.Replace(sub.Value, pattern, match =>
{
// 将匹配到的 Unicode 转义序列转换为对应的 Unicode 字符
string unicodeValue = match.Groups[1].Value;
int codePoint = Convert.ToInt32(unicodeValue, 16);
return char.ConvertFromUtf32(codePoint);
}));
}
}
return sb.ToString();
}
背景2代码如下:
[MenuItem("Tools/EasyUseEditorTool/Remove Missing Scripts")]
static void RemoveMissScriptInGame()
{
GameObject[] gos = Resources.FindObjectsOfTypeAll<GameObject>();
foreach (GameObject obj in gos)
{
var components = obj.GetComponents<Component>();
for (int j = 0; j < components.Length; j++)
{
if (components[j] == null)
{
GameObjectUtility.RemoveMonoBehavioursWithMissingScript(obj);
break;
}
}
}
AssetDatabase.SaveAssets();
AssetDatabase.Refresh();
}
如果不移除missing的脚本批处理脚本就太难做了。
背景3代码:这块代码每个项目因人而异,需要特别注意多做测试。比如我们项目中一个image可能没有挂button组件或者toggle组件但是挂了自定义的mono对象,内部做了事件那这种也不能去掉
rayCastTarget属性,所以因项目而异。小项目简单项目可以用
using UnityEditor;
using UnityEditor.SceneManagement;
using UnityEngine;
public class PrefabHelper
{
[InitializeOnLoadMethod]
public static void init()
{
Debug.Log("PrefabHelper.init");
PrefabStage.prefabStageClosing -= OnPrefabStageClosing;
PrefabStage.prefabStageClosing += OnPrefabStageClosing;
}
public static void OnPrefabStageClosing(PrefabStage ps)
{
var root = ps.prefabContentsRoot;
var window = root.transform.Find("Window");
if (window == null)
{
window = root.transform.Find("window");
}
var rawImage = root.transform.Find("pingui");
if(rawImage != null)
{
GameObject.DestroyImmediate(rawImage);
}
window.localScale = Vector3.zero;
SCGTool.RemoveNoUseRayCast(root);
Object prefabObj = PrefabUtility.SaveAsPrefabAsset(root, ps.assetPath,out bool success);
if(success)
{
Debug.Log("apply sucess " + ps.assetPath);
}
AssetDatabase.SaveAssets();
AssetDatabase.Refresh();
}
}
[InitializeOnLoad]
public class SCGTool
{
public static void RemoveNoUseRayCast(GameObject go)
{
var tys = new System.Type[]
{
typeof(Toggle),typeof(Button),
};
// 获取text或者rowImage或者image
var raws = go.GetComponentsInChildren<RawImage>(true);
for (int i = 0; i < raws.Length; i++)
{
bool isAllNUll = true;
foreach(var t in tys)
{
if ( raws[i].GetComponent(t) != null)
{
isAllNUll = false;
}
}
raws[i].raycastTarget = !isAllNUll ;
}
var images = go.GetComponentsInChildren<Image>(true);
for (int i = 0; i < images.Length; i++)
{
if (images[i].GetComponent<Button>() == null && images[i].GetComponent<Toggle>() == null
&& images[i].GetComponent<ScrollRect>() == null && images[i].GetComponent<TouchMove>() == null)
{
images[i].raycastTarget = false;
}
}
var texts = go.GetComponentsInChildren<Text>(true);
for (int i = 0; i < texts.Length; i++)
{
texts[i].raycastTarget = false;
}
//然后遍历所有button对于设定了
var allButtons = go.GetComponentsInChildren<Button>(true);
foreach (var button in allButtons)
{
if(button != null && button.targetGraphic != null)
{
var tmpImage = button.targetGraphic.GetComponent<Image>();
if (tmpImage != null)
{
tmpImage.raycastTarget = true;
continue;
}
var tmpRawImage = button.targetGraphic.GetComponent<RawImage>();
if (tmpRawImage != null)
{
tmpRawImage.raycastTarget = true;
continue;
}
var tmpText = button.targetGraphic.GetComponent<Text>();
if (tmpText != null)
{
tmpText.raycastTarget = true;
continue;
}
}
else if(button !=null)
{
var tmpImage = button.targetGraphic.GetComponent<Image>();
if (tmpImage != null)
{
tmpImage.raycastTarget = true;
continue;
}
var tmpRawImage = button.targetGraphic.GetComponent<RawImage>();
if (tmpRawImage != null)
{
tmpRawImage.raycastTarget = true;
continue;
}
var tmpText = button.targetGraphic.GetComponent<Text>();
if (tmpText != null)
{
tmpText.raycastTarget = true;
continue;
}
}
}
EditorUtility.SetDirty(go);
}
}
相关文章:
获取unity中prefab的中文文本内容以及和prefab有关的问题
背景1:经常会在开发中遇到策划需要改某个界面,但是我们不知道那是什么界面,只看到一些关键字比如圣诞活动,那这样我就可以轻易找到这个预设了。另外还可以扩展就是收集项目中的所有中文文本然后归集到多语言表中,然后接…...
Web自动化中常用XPath定位方式
在进行Web自动化测试时,元素定位是一个至关重要的环节。XPath(XML Path Language)是一种用于在XML文档中定位节点的语言。在Web自动化中,XPath广泛应用于定位HTML元素。本文将详细介绍几种常用的XPath定位方式,包括绝对…...
Unity3D播放GIF图片使用Animation来制作动画
系列文章目录 unity工具 文章目录 系列文章目录👉前言👉一、下载GIF动图,用PS制作导出帧动画图片👉二、使用Animation制作动画👉三、脚本控制动画播放👉壁纸分享👉总结👉前言 unity播放gif图片,本身是不支持的,但是可以使用其他方法来实现, 1.有一种使用System…...
redo log 和 bin log 的两阶段提交
两阶段提交的过程 当事务提交后,有一个两阶段提交策略。 在开启两阶段提交时,会开启一个 XA 事务(宏观上的事务), Prepare 阶段:将 redo log 的状态设置为 prepare,然后将 事务XID 写入 redo…...
Go基础学习07-map注意事项;多协程对map的资源竞争;sync.Mutex避免竟态条件
文章目录 Go中map使用以及注意事项map使用时的并发安全问题 Go中map使用以及注意事项 Go语言中map使用简单示例: func main() {var mp map[string]int// mp : map[string]int{}val, ok : mp["one"]if ok {fmt.Println(val)} else {fmt.Println(val)}mp[…...
远程服务器安装anaconda并创建虚拟环境
1、承接上文新用户zrcs,在服务器的zrcs文件夹下直接下载anaconda(很慢): wget https://repo.anaconda.com/archive/Anaconda3-2024.06-1-Linux-x86_64.sh 或者选择本地下载,清华大学开源软件镜像站:https:/…...
什么是IIC通信协议?
IIC(Inter-Integrated Circuit)通信协议,又称为I2C(Inter-Integrated Circuit 2)协议,是一种广泛使用的串行通信协议。它由飞利浦半导体公司(现NXP Semiconductors)开发,…...
P3131 [USACO16JAN] Subsequences Summing to Sevens S Python题解
[USACO16JAN] Subsequences Summing to Sevens S 题目描述 Farmer John’s N N N cows are standing in a row, as they have a tendency to do from time to time. Each cow is labeled with a distinct integer ID number so FJ can tell them apart. FJ would like to ta…...
鸿蒙NEXT开发-ArkUI(基于最新api12稳定版)
注意:博主有个鸿蒙专栏,里面从上到下有关于鸿蒙next的教学文档,大家感兴趣可以学习下 如果大家觉得博主文章写的好的话,可以点下关注,博主会一直更新鸿蒙next相关知识 专栏地址: https://blog.csdn.net/qq_56760790/…...
Matplotlib 使用 LaTeX 渲染图表中的文本、标题和数学公式
Matplotlib 使用 LaTeX 渲染图表中的文本、标题和数学公式 Matplotlib 是一个功能强大的 Python 库,用于绘制各种高质量的图表和图形。在许多科研和技术文档中,数学公式是不可或缺的一部分,LaTeX 提供了精美的数学公式渲染能力。Matplotlib …...
Android 安卓内存安全漏洞数量大幅下降的原因
谷歌决定使用内存安全的编程语言 Rust 向 Android 代码库中写入新代码,尽管旧代码(用 C/C 编写)没有被重写,但内存安全漏洞却大幅减少。 Android 代码库中每年发现的内存安全漏洞数量(来源:谷歌)…...
c++primier第十二章类和动态内存
本章内容包括: 对类成员使用动态内存分配隐式和显式地复制构造函数隐式和显式地重载赋值操作符在构造函数中使用new所必须完成的工作使用静态类成员 将布局new操作符用于对象使用指向对象的指针实现队列抽象数据类型(ADT) 动态内存和类 复习范例和静态类成员 首…...
Ansible学习之ansible-pull命令
想要知道ansible-pull是用来做什么的,就需要了解Ansible的工作模,Ansible的工作模式有两种: push模式 push推送,这是Ansible的默认模式,在主控机上编排好playbook文件,push到远程主机上来执行。pull模式 p…...
Linux:磁盘管理
一、静态分区管理 静态的分区方法不可以动态的增加或减少分区的容量。 1、磁盘分区-fdisk 该命令是用于查看磁盘分区情况,和分区管理的命令 命令格式:fdisk [选项] 设备文件名常用命令: -h:查看分区信息 fdisk系统常用命令&…...
FP7209: 用于紫外线消毒灯的 升压LED恒流驱动芯片
现在社会对于居家消毒也越发重视起来。而居家消毒除了75%浓度酒精及各类消毒液外,利用紫外线灯给衣物表面、房间消毒也是一种很好的选择。FP7209 定位于低压线性恒流驱动,精度高、外围电路简单、使用方便且可靠性高,更可广泛应用于商业照明系…...
【华为HCIP实战课程二】OSPF基础介绍和OSPF RID NBMA配置详解
一、OSPF多区域 自治系统(Autonomous System) 一个自治系统是指使用同一种路由协议交换路由信息的一组路由器 1、Area0为骨干区域 2、ABR--关乎3类LSA后续详解 ABR用来连接骨干区域Area0和非骨干区域,它与骨干区域之间既可以是物理连接,也可以是逻辑上的连接。 3、AS…...
网络编程(13)——单例模式
十三、day13 今天学习如何单例模式实现逻辑层的设计。内容包括服务器如何能捕获信号使其安全退出、单例模标类 1. 什么是单例模式? 单例模式(Singleton),保证一个类仅有一个实例,并提供一个访问它的全局访问点&…...
基于定制开发与2+1链动模式的商城小程序搭建策略
摘要:本文探讨商城小程序的搭建策略,对比自主组建团队和第三方开发两种方式,强调以第三方开发模式为主的优势。阐述在第三方开发模式下,结合定制开发和21链动模式,如何搭建一款有助于企业商业模式创新与智能商业升级的…...
银河麒麟,apt 安装软件报错640Unknown Status
今天把银行麒麟的机器恢复出厂了,然后apt install 安装极其不稳定,故障现象如下图所示: 错误提示里面有: 640 Unknown Status [IP: 106.116.184.122 80] E: 无法下载 http://archive.kylinos.cn/kylin/KYLIN-ALL/pool/universe/f…...
python UNIT 3 选择与循环(2)
目录 1。循环的优化 经典优化分析: 未优化的代码: 细节分析: 优化后的代码: 优化的细节: 性能对比 优化的关键在于: 经典习题讲解:(紫色的解析请重点关注一下) 1。例三 个人代码解析…...
SIFT算法二十年:为什么它仍是图像匹配的‘老兵’?对比ORB、SURF与深度学习特征
SIFT算法二十年:为什么它仍是图像匹配的‘老兵’? 在计算机视觉领域,特征提取与匹配一直是核心问题之一。从早期的传统算法到如今的深度学习模型,技术迭代层出不穷。然而,在这股浪潮中,SIFT(Sca…...
程序运行机制:编译、链接与装入详解
1. 程序运行的底层机制解析作为一名在嵌入式系统开发领域工作多年的工程师,我经常需要深入理解程序从源代码到最终执行的完整过程。这个看似简单的"程序运行"背后,实际上隐藏着编译、链接、装入这三个关键阶段。今天,我就结合自己的…...
BM42S3021-1热电偶模块嵌入式驱动与I²C集成实战
1. BM42S3021-1热电偶模块底层技术解析与嵌入式集成实践1.1 模块硬件架构与通信协议本质BM42S3021-1是Best Modules公司推出的高精度热电偶信号调理模块,其核心并非简单的IC从设备,而是一个集成了冷端补偿(Cold Junction Compensation, CJC&a…...
Cadence Virtuoso实战:从反相器原理图到GDS版图,手把手搞定你的第一个CMOS Layout
Cadence Virtuoso实战:从反相器原理图到GDS版图全流程解析 在集成电路设计领域,从原理图到物理版图的实现是一个充满挑战又极具成就感的过程。对于初入行的工程师或微电子专业学生来说,掌握Cadence Virtuoso工具链的完整工作流程,…...
避开原子操作坑!Keil AC5移植LwRB 3.0.0的保姆级避坑指南
避开原子操作坑!Keil AC5移植LwRB 3.0.0的保姆级避坑指南 在嵌入式开发中,环形缓冲区(Ring Buffer)是一种常见的数据结构,广泛应用于串口通信、DMA传输等场景。LwRB(Lightweight Ring Buffer)作…...
2021热门电子制作项目解析与实战指南
1. 电子制作项目概述今天想和大家分享几个来自New Top 3 Electronic Projects 2021的趣味电子制作项目。这些项目不仅电路设计巧妙,而且视觉效果惊艳,完美诠释了"电路与艺术结合"的理念。作为一名电子爱好者,我特别喜欢这类既有技术…...
LangChain 与 LangGraph 介绍
一、AI 时代下的编程范式 1. Vibe Coding 氛围编程 1.1 Vibe Coding 的起源 在过去十年间,低代码 / 无代码平台和 AI 代码助手持续冲击着软件开发行业。如今,一种被称为 Vibe Coding 的新兴实践突然走红,甚至颠覆了人们对 "…...
海淀AI,集体开弓:少年极客、中年创客与ICU归来者
田晏林 发自 凹非寺量子位 | 公众号 QbitAI春分之后的北京海淀,暖意至,万物生。人工智能产业的发展更是如火如荼。过去五天里,位于“宇宙中心”五道口的AI原点社区,30多场派对狂欢不停。这是在第三届中关村论坛“人工智能主题日”…...
Linux 内核中的信号处理:从发送到捕获
Linux 内核中的信号处理:从发送到捕获 引言 作为一名深耕操作系统和嵌入式开发的工程师,我深知通知机制的重要性。在系统开发中,及时的通知可以帮助系统快速响应事件。在 Linux 内核中,信号是一种重要的进程间通信机制,…...
高效解决E-Hentai图库下载难题:实用下载工具全攻略
高效解决E-Hentai图库下载难题:实用下载工具全攻略 【免费下载链接】E-Hentai-Downloader Download E-Hentai archive as zip file 项目地址: https://gitcode.com/gh_mirrors/eh/E-Hentai-Downloader 在数字资源管理领域,E-Hentai作为知名的漫画…...
