当前位置: 首页 > wzjs >正文

做网站大图素材兰州网站seo分析

做网站大图素材,兰州网站seo分析,最近三天的新闻热点,佛山外贸网站设计在 Unity 开发过程中,缺失的 Sprite 引用(特别是在 UI 元素上)可能导致程序运行时出现问题,尤其是在使用 Image 组件时。当你拥有多个 Prefab 和大量的 UI 资源时,手动检查每个 Prefab 是否缺失了 Source Image 变得十…

在 Unity 开发过程中,缺失的 Sprite 引用(特别是在 UI 元素上)可能导致程序运行时出现问题,尤其是在使用 Image 组件时。当你拥有多个 Prefab 和大量的 UI 资源时,手动检查每个 Prefab 是否缺失了 Source Image 变得十分繁琐。

为了提高开发效率,今天我们来编写一个 Unity 编辑器脚本,通过查找 Prefab 中是否存在缺失的 Image 组件的 Sprite,帮助你快速定位缺失的资源。

目标

该脚本的主要目标是:

  • 遍历选中的文件夹中的 Prefab 文件。
  • 查找每个 Prefab 内的 Image 组件。
  • 如果 Image 组件的 Sprite 为空,则标记该节点为缺失,并记录其路径。
  • 在编辑器窗口中显示这些缺失的节点,供开发者定位和修复。

脚本解析 

1. 初始化窗口

我们首先通过 EditorWindow 创建一个自定义的 Unity 编辑器窗口。

public class MissingImageSpriteFinder : EditorWindow
{private Vector2 scrollPos;private List<ResultData> resultList = new List<ResultData>();private class ResultData{public GameObject prefab;public List<string> nodePaths = new List<string>();}
}

 这里,我们创建了一个 ResultData 类来存储每个 Prefab 和包含缺失 Sprite 的节点路径。在 MissingImageSpriteFinder 类中,我们定义了一个 resultList 来存储所有找到的结果。

2. 添加菜单项

我们通过 MenuItem 特性将功能添加到 Unity 编辑器的菜单中,方便开发者直接点击执行。

[MenuItem("Assets/Find Missing SourceImage", false, 49)]
public static void FindMissingImages()
{var window = GetWindow<MissingImageSpriteFinder>("Find Missing SourceImage Result");window.Search();
}

 此方法会在 Unity 编辑器中创建一个新的菜单项 查找 Missing 的 SourceImage,点击该菜单项时,会打开 MissingImageSpriteFinder 窗口并开始搜索缺失的 Sprite

3. 搜索逻辑

Search 方法中,我们首先清空结果列表,然后获取选中的文件夹路径,遍历其中的 Prefab 文件。

private void Search()
{resultList.Clear();string[] selectedGuids = Selection.assetGUIDs;foreach (string guid in selectedGuids){string path = AssetDatabase.GUIDToAssetPath(guid);if (!AssetDatabase.IsValidFolder(path)) continue;string[] prefabPaths = Directory.GetFiles(path, "*.prefab", SearchOption.AllDirectories);foreach (string prefabPath in prefabPaths){GameObject prefab = AssetDatabase.LoadAssetAtPath<GameObject>(prefabPath);if (prefab == null) continue;Transform[] children = prefab.GetComponentsInChildren<Transform>(true);List<string> missingNodes = new List<string>();foreach (Transform t in children){Image img = t.GetComponent<Image>();if (img != null && IsMissingReference(img, "m_Sprite")){string nodePath = GetTransformPath(t, prefab.transform);missingNodes.Add(nodePath);}}if (missingNodes.Count > 0){resultList.Add(new ResultData{prefab = prefab,nodePaths = missingNodes});}}}Repaint();
}

在这个方法中,我们做了以下几件事:

  • 获取当前选中的文件夹路径。
  • 查找该文件夹及其子文件夹中的所有 Prefab 文件。
  • 对每个 Prefab 文件进行处理,查找所有子节点中的 Image 组件。
  • 如果 Image 组件的 Sprite 属性为空,则认为是缺失的,并记录该节点的路径。

4. 界面显示

OnGUI 方法中,我们定义了自定义窗口的显示逻辑。

private void OnGUI()
{GUILayout.Label("查找结果", EditorStyles.boldLabel);if (resultList.Count == 0){EditorGUILayout.HelpBox("未找到缺失的 SourceImage。", MessageType.Info);return;}scrollPos = EditorGUILayout.BeginScrollView(scrollPos);foreach (var result in resultList){EditorGUILayout.BeginVertical("box");EditorGUILayout.ObjectField("Prefab", result.prefab, typeof(GameObject), false);EditorGUILayout.LabelField("包含 Missing Sprite 的节点路径:");foreach (var path in result.nodePaths){EditorGUILayout.LabelField(" - " + path);}if (GUILayout.Button("定位 Prefab", GUILayout.Width(100))){Selection.activeObject = result.prefab;EditorGUIUtility.PingObject(result.prefab);}EditorGUILayout.EndVertical();}EditorGUILayout.EndScrollView();
}
  • 首先显示了一个标题标签。
  • 如果没有找到缺失的 Sprite,会显示一条提示消息。
  • 如果有找到缺失的 Sprite,则在滚动视图中列出每个 Prefab 和其包含缺失 Sprite 的节点路径。
  • 每个 Prefab 后面有一个按钮,点击后会自动选中该 Prefab 并在场景中高亮显示。

5. 辅助方法

IsMissingReferenceGetTransformPath 方法分别用于判断 Image 组件的 Sprite 是否为空,并获取节点相对 Prefab 的路径。

private bool IsMissingReference(Object obj, string propertyName)
{SerializedObject so = new SerializedObject(obj);SerializedProperty sp = so.FindProperty(propertyName);return sp != null && sp.objectReferenceValue == null && sp.objectReferenceInstanceIDValue != 0;
}private string GetTransformPath(Transform current, Transform root)
{List<string> path = new List<string>();while (current != null && current != root){path.Insert(0, current.name);current = current.parent;}return string.Join("/", path);
}
  • IsMissingReference 通过检查 Image 组件的 m_Sprite 属性是否为空,判断是否为缺失的引用。
  • GetTransformPath 通过遍历节点的父节点,构建从根节点到当前节点的路径。

完整代码

using UnityEngine;
using UnityEditor;
using UnityEngine.UI;
using System.Collections.Generic;
using System.IO;public class MissingImageSpriteFinder : EditorWindow
{private Vector2 scrollPos;private List<ResultData> resultList = new List<ResultData>();private class ResultData{public GameObject prefab;public List<string> nodePaths = new List<string>();}[MenuItem("Assets/Find Missing SourceImage", false, 49)]public static void FindMissingImages(){var window = GetWindow<MissingImageSpriteFinder>("Find Missing SourceImage Result");window.Search();}private void Search(){resultList.Clear();string[] selectedGuids = Selection.assetGUIDs;foreach (string guid in selectedGuids){string path = AssetDatabase.GUIDToAssetPath(guid);if (!AssetDatabase.IsValidFolder(path)) continue;string[] prefabPaths = Directory.GetFiles(path, "*.prefab", SearchOption.AllDirectories);foreach (string prefabPath in prefabPaths){GameObject prefab = AssetDatabase.LoadAssetAtPath<GameObject>(prefabPath);if (prefab == null) continue;Transform[] children = prefab.GetComponentsInChildren<Transform>(true);List<string> missingNodes = new List<string>();foreach (Transform t in children){Image img = t.GetComponent<Image>();if (img != null && IsMissingReference(img, "m_Sprite")){string nodePath = GetTransformPath(t, prefab.transform);missingNodes.Add(nodePath);}}if (missingNodes.Count > 0){resultList.Add(new ResultData{prefab = prefab,nodePaths = missingNodes});}}}Repaint();}private void OnGUI(){GUILayout.Label("查找结果", EditorStyles.boldLabel);if (resultList.Count == 0){EditorGUILayout.HelpBox("未找到缺失的 SourceImage。", MessageType.Info);return;}scrollPos = EditorGUILayout.BeginScrollView(scrollPos);foreach (var result in resultList){EditorGUILayout.BeginVertical("box");EditorGUILayout.ObjectField("Prefab", result.prefab, typeof(GameObject), false);EditorGUILayout.LabelField("包含 Missing Sprite 的节点路径:");foreach (var path in result.nodePaths){EditorGUILayout.LabelField(" - " + path);}if (GUILayout.Button("定位 Prefab", GUILayout.Width(100))){Selection.activeObject = result.prefab;EditorGUIUtility.PingObject(result.prefab);}EditorGUILayout.EndVertical();}EditorGUILayout.EndScrollView();}// 判断是否是 Missing 的引用private bool IsMissingReference(Object obj, string propertyName){SerializedObject so = new SerializedObject(obj);SerializedProperty sp = so.FindProperty(propertyName);return sp != null && sp.objectReferenceValue == null && sp.objectReferenceInstanceIDValue != 0;}// 获取节点相对 prefab 的路径private string GetTransformPath(Transform current, Transform root){List<string> path = new List<string>();while (current != null && current != root){path.Insert(0, current.name);current = current.parent;}return string.Join("/", path);}
}

效果预览

右键选中文件夹 选择Find Missing SourceImage

效果如下

总结

通过编写这个自定义的 Unity 编辑器扩展,你可以高效地查找和修复缺失的 Image 组件的 Sprite 引用。它能够自动扫描选定的文件夹中的所有 Prefab,并定位其中的缺失引用,大大节省了手动检查的时间。

如果你的项目中包含大量的 UI Prefab 和资源,这个工具将是你提高生产力的重要助手。希望这篇博客对你有所帮助,快去试试吧!


文章转载自:

http://zemE5qjh.kxLtf.cn
http://FiSPKlz6.kxLtf.cn
http://nBIZlXOI.kxLtf.cn
http://Sw1RjO2N.kxLtf.cn
http://ZAsg2FQs.kxLtf.cn
http://KAoJFqzY.kxLtf.cn
http://jRkxrzmM.kxLtf.cn
http://idNJ8cut.kxLtf.cn
http://KbZMOUXV.kxLtf.cn
http://K5XUmzmH.kxLtf.cn
http://PdPuehkO.kxLtf.cn
http://IHxY7i1V.kxLtf.cn
http://jcqPJbwn.kxLtf.cn
http://0zPV0dNq.kxLtf.cn
http://8A7WHvmq.kxLtf.cn
http://87f2ui3G.kxLtf.cn
http://nKwEH7kF.kxLtf.cn
http://oKO4snUa.kxLtf.cn
http://Y6LJTLmA.kxLtf.cn
http://mIkVU1Z9.kxLtf.cn
http://YOTcOOLd.kxLtf.cn
http://KRe9wzag.kxLtf.cn
http://czxT3OlY.kxLtf.cn
http://eEFi78Di.kxLtf.cn
http://CmzIViB5.kxLtf.cn
http://LndIQm6e.kxLtf.cn
http://1mEsS1V5.kxLtf.cn
http://kf0RuH3a.kxLtf.cn
http://lVwZPdHT.kxLtf.cn
http://sBgysN7u.kxLtf.cn
http://www.dtcms.com/wzjs/689525.html

相关文章:

  • 城乡建设部统计网站思途建站
  • 江阴哪家做网站便宜网站域名管理中心
  • 设计软件免费下载网站wamp做的网站标签图标
  • 免费建站网站seo西安企业网站
  • 哪里有未成年做的网站取个网站建设公司名字
  • 域名备案企业网站内容手机网站建设的现状
  • 湖南医院响应式网站建设企业应用市场app下载安装到手机
  • 做外贸 用国内空间做网站建设银行个人网银网站
  • 建网站的域名是什么意思wordpress无法显示文章
  • 北京网站建设的公天津建站方案
  • 龙岗网站优化公司案例Wordpress网站仿站
  • 公众号和网站小城镇建设期刊网站
  • 电子商务网站平台建设策划社区网站优化
  • 哪些企业必须用网站湖州高端网站设计
  • 排名前十的网站盐城公司网站建设电话
  • 我的世界做壁纸网站企业网站代备案
  • 百度aipage智能建站腾讯云域名管理
  • 余姚网站seo运营用front page2003做网站的导航条
  • 网站定制营销自建网站怎么做后台管理系统
  • 漯河网站建设e注册网站手机号收验证码
  • iis7搭建aspx网站crm系统解决方案
  • 在什么网站上做自媒体商标与logo的区别
  • 网站怎么下载视频网络网站建
  • 最新网站查询大连甘井子区
  • 伊利网站建设水平评价在线购物网站设计
  • 网站域名跳转是怎么做的招聘模板制作app
  • 株洲网站建设企业pageadmin安装教程
  • 朝阳区网站建设君和广州海珠建网站
  • 最好的科技资讯网站银川网站建设报价
  • 校园网站建设价格后台网站建设招聘