获取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。例三 个人代码解析…...
数据分析师GitHub作品集构建指南:从项目架构到技术实现
1. 项目概述:一个数据分析师的作品集仓库意味着什么? 在数据驱动的时代,简历上的“精通Python/SQL”已经不够看了。面试官,尤其是那些懂行的技术面试官,更想看到的是你如何用这些工具解决真实世界的问题。这就是为什么…...
开源机械臂技能化控制:从硬件驱动到应用集成的实践指南
1. 项目概述:从开源机械臂到技能控制台最近在机器人控制领域,一个名为esmatcm/openclaw-control-console-skill的项目引起了我的注意。乍一看,这像是一个围绕开源机械臂OpenClaw的控制台技能项目。作为一名长期混迹于硬件开源社区和机器人应用…...
AI对话记忆管理实战:memory-organizer库解决长上下文难题
1. 项目概述:一个为AI记忆体“瘦身”与“归档”的利器最近在折腾一些本地大语言模型(LLM)的应用,比如搭建个人知识库助手或者长期对话机器人,一个绕不开的痛点就是“记忆”的管理。模型本身没有持久记忆,每…...
【BK3633】从规格书到实战:解锁蓝牙5.2双模芯片的十大核心应用场景
1. BK3633芯片核心特性解析 第一次拿到BK3633规格书时,我被它的参数惊艳到了——这简直是为物联网设备量身定制的瑞士军刀。作为博通集成推出的蓝牙5.2双模芯片,它完美兼顾了高性能与低功耗这对"冤家"。实测下来,全速运行电流仅5mA…...
面试官问‘0.1+0.2≠0.3’,你能从CPU层面讲清楚吗?浮点数运算避坑指南
为什么0.10.2不等于0.3?从晶体管到代码的浮点数运算解密 当你在Python或JavaScript中输入0.1 0.2时,得到的不是预期的0.3,而是一个近似值0.30000000000000004。这个看似简单的数学问题背后,隐藏着计算机处理数字的复杂机制。理解…...
087、机器人运动学:雅可比矩阵
087、机器人运动学:雅可比矩阵 一、一个让我熬夜三天的调试故事 去年做六轴协作机器人末端力控的时候,遇到一个诡异的问题:机器人末端在某个位姿下,明明关节速度指令给得很平滑,末端速度却突然跳变,导致力控震荡。当时我盯着示波器上的速度曲线,百思不得其解——运动学…...
TPS65131模块实战:单电源生成正负双电压的工程指南
1. 项目概述与核心需求解析在模拟电路、音频设备乃至一些复古的数字逻辑电路里,正负双电源轨是一个绕不开的话题。无论是给运算放大器供电,为LCD屏幕提供偏置电压,还是驱动某些老式合成器模块,你常常需要同时拥有一个正电压和一个…...
QT6.5项目实战:用HidApi库搞定USB HID设备读写(附完整配置流程)
QT6.5实战:HidApi库深度集成与USB HID设备高效通信指南 USB HID设备作为人机交互的基础协议,在工业控制、医疗设备、游戏外设等领域广泛应用。当开发者需要在QT6.5环境中实现与这类设备的稳定通信时,HidApi库因其轻量级和跨平台特性成为理想选…...
从需求到建表:我是如何用一张ER图搞定客户复杂业务逻辑的
从需求到建表:我是如何用一张ER图搞定客户复杂业务逻辑的 接手电商系统重构项目的第一天,客户甩过来二十多页需求文档和五张不同版本的Excel表。"这些数据都要关联起来",产品经理指着密密麻麻的字段说,"但具体怎么…...
终极B站缓存视频转换指南:快速将m4s无损转换为MP4
终极B站缓存视频转换指南:快速将m4s无损转换为MP4 【免费下载链接】m4s-converter 一个跨平台小工具,将bilibili缓存的m4s格式音视频文件合并成mp4 项目地址: https://gitcode.com/gh_mirrors/m4/m4s-converter 你是否曾经因为B站视频突然下架而感…...
