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

编辑器工具--直接将精灵拖进场景并自动创建物体然后赋值给Image组件

我们平时是自己再创景里的Canvas上创建一个物体 物体上有Image组件 然后把美术给的Sprite拖进去
现在这个编辑器工具 直接批量选中 一键再场景生成好物体 上面挂载了相应精灵
以下脚本赋值以后 放到 Editor文件夹下 再工具栏的tools下面就有了

using UnityEditor;using UnityEditor.SceneManagement;using UnityEngine;using UnityEngine.SceneManagement;using UnityEngine.UI;public class Sprite2ImageTool:Editor{// 菜单入口:Assets右键 + Tools顶部[MenuItem("Assets/Sprite To UI Image",false,100)][MenuItem("Tools/UI/Sprite To UI Image",false,100)]staticvoidCreateImageFromSelectedSprite(){// ========== 关键修改:兼容所有选中场景 ==========// 1. 获取所有选中的对象(不限制类型)Object[]selectedObjects=Selection.objects;if(selectedObjects.Length==0){EditorUtility.DisplayDialog("提示","请先选中Project面板中的Sprite资源!","确定");return;}// 2. 手动筛选出Sprite类型的对象(兼容图集/Texture嵌套Sprite)System.Collections.Generic.List<Sprite>selectedSprites=new System.Collections.Generic.List<Sprite>();foreach(Object obj in selectedObjects){// 情况1:直接选中Spriteif(obj is Sprite sprite){selectedSprites.Add(sprite);}// 情况2:选中的是Texture,但该Texture导入为Sprite(常见于单张Sprite图)elseif(obj is Texture2D tex){Sprite texSprite=AssetDatabase.LoadAssetAtPath<Sprite>(AssetDatabase.GetAssetPath(tex));if(texSprite!=null){selectedSprites.Add(texSprite);}}}// 3. 仍无Sprite则提示(并打印调试信息)if(selectedSprites.Count==0){string tip="未识别到Sprite!\n选中的对象类型:\n";foreach(Object obj in selectedObjects){tip+=$"- {obj.name} : {obj.GetType().Name}\n";}Debug.LogError(tip);// 控制台打印详细信息EditorUtility.DisplayDialog("提示",tip,"确定");return;}// ========== 以下逻辑和之前一致 ==========// 查找/创建CanvasCanvas canvas=FindOrCreateCanvasInEditMode();if(canvas==null){EditorUtility.DisplayDialog("错误","创建Canvas失败!","确定");return;}// 批量创建ImageintsuccessCount=0;foreach(Sprite sprite in selectedSprites){if(!CheckSpriteForUI(sprite)){EditorUtility.DisplayDialog("提示",$"Sprite「{sprite.name}」导入设置错误!\n请将Texture Type改为:Sprite (2D and UI)","确定");continue;}CreateSingleImage(sprite,canvas);successCount++;}EditorSceneManager.MarkSceneDirty(canvas.gameObject.scene);EditorUtility.DisplayDialog("完成",$"成功创建 {successCount} 个UI Image!","确定");}// 菜单显隐验证:只要选中对象就显示(放宽限制)[MenuItem("Assets/Sprite To UI Image",true)]staticboolValidateCreateImage(){returnSelection.objects.Length>0;// 只要有选中对象就显示菜单}/// <summary>/// 查找/自动创建Canvas/// </summary>staticCanvasFindOrCreateCanvasInEditMode(){// 查找已有Canvasfor(inti=0;i<SceneManager.sceneCount;i++){Scene scene=SceneManager.GetSceneAt(i);if(!scene.isLoaded)continue;GameObject[]rootObjs=scene.GetRootGameObjects();foreach(GameObject rootObj in rootObjs){Canvas canvass=rootObj.GetComponentInChildren<Canvas>(true);if(canvass!=null)returncanvass;}}// 自动创建CanvasGameObject canvasGO=newGameObject("Canvas",typeof(Canvas),typeof(CanvasScaler),typeof(GraphicRaycaster));Canvas canvas=canvasGO.GetComponent<Canvas>();canvas.renderMode=RenderMode.ScreenSpaceOverlay;EditorUtility.SetDirty(canvasGO);returncanvas;}/// <summary>/// 校验Sprite导入设置/// </summary>staticboolCheckSpriteForUI(Sprite sprite){string spritePath=AssetDatabase.GetAssetPath(sprite);TextureImporter importer=AssetImporter.GetAtPath(spritePath)as TextureImporter;if(importer==null)returnfalse;returnimporter.textureType==TextureImporterType.Sprite;}/// <summary>/// 创建单个Image(匹配Sprite尺寸)/// </summary>staticvoidCreateSingleImage(Sprite sprite,Canvas parentCanvas){GameObject imageGO=newGameObject(sprite.name,typeof(RectTransform),typeof(Image));RectTransform imageRect=imageGO.GetComponent<RectTransform>();imageGO.transform.SetParent(parentCanvas.transform,false);imageRect.sizeDelta=newVector2(sprite.rect.width,sprite.rect.height);imageRect.anchoredPosition=Vector2.zero;imageRect.anchorMin=newVector2(0.5f,0.5f);imageRect.anchorMax=newVector2(0.5f,0.5f);Image imageComp=imageGO.GetComponent<Image>();imageComp.sprite=sprite;imageComp.preserveAspect=true;EditorUtility.SetDirty(imageGO);}}
http://www.cnnetsun.cn/news/113687.html

相关文章:

  • Agent的“话痨”病有救了!微软黑科技教你压缩对话历史,让AI告别失忆,这篇教程太顶了!
  • ARMv7 linux中断路由以及处理
  • 【详解】基于Kubernetes部署Kafka集群
  • AIoT:从万物互联到万物智联的进化之路
  • ERROR in ./node_modules/vue-router/dist/vue-router.mjs 被报错折磨半天?真相竟是……
  • Spring Boot 自动配置的底层实现原理
  • AI如何帮你快速掌握Wireshark端口过滤技巧
  • 手把手教你复现CVE-2023-51767漏洞
  • 雷柏V500Pro键盘新手必看:5分钟搞定基础设置
  • Java小白必看:5分钟上手MD5加密解密
  • AI一键搞定Java8安装:快马平台智能配置指南
  • 二叉排序树的构建与遍历
  • AI风险行为识别系统开发:给安全防护装个“智能哨兵”
  • After Effects Roto Brush 3.0:甲方没给绿幕也要“抠人”?AI 帮你 3 秒钟搞定逐帧噩梦
  • 1分钟搞定!用zip命令快速打包你的项目原型
  • 28、Linux 文件和目录管理全解析
  • 雷科电力-REKE610D绝缘油介质损耗电阻率测试仪
  • 对于设计IT系统的相关思路
  • 轻量无负担!2025 年 3 款小巧型文件加密软件分享
  • Canoe-Autosar网络管理自动化测试脚本 Capl源码,全套,修改项目配置可以直接使用...
  • 亚马逊、速卖通采购测评:构建安全环境,保障高效下单指南
  • 软连接vs硬链接:哪种更能提升你的工作效率?
  • 完全合作型博弈:当所有人的利益捆绑在一起 (Fully Cooperative)
  • 挖SRC必须知道的25个漏洞提交平台
  • AI市场舆情分析榜,原圈科技领跑研报神器
  • AI一键生成Python安装包配置脚本
  • 零基础学网安不慌!电脑小白 4 阶段入门路线,分阶段学习不踩坑
  • 传统锁 vs Redisson分布式锁:效率对比实测
  • 封神!从开发转安全渗透工程师,这是我做的最对的职业选择
  • 3、循环与分支:编程中的核心逻辑控制