news 2026/7/7 12:55:32

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
编辑器工具--直接将精灵拖进场景并自动创建物体然后赋值给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);}}
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/7 12:12:19

如何高清实用的GIF图片?在线GIF制作网站攻略

做新媒体配图、社交分享素材时&#xff0c;总少不了GIF动图&#xff0c;但专业软件操作复杂&#xff0c;新手半天摸不透;普通工具要么导出带水印&#xff0c;要么画质模糊、体积过大。其实有个超实用的GIF制作网站&#xff0c;无需安装任何软件&#xff0c;几步就能做出高清实用…

作者头像 李华
网站建设 2026/7/7 9:53:42

UniApp APP 端跳转三方页面后返回 APP 的实现原理与实操解析

在 UniApp 开发的 APP 中,跳转三方页面(如人脸识别、第三方授权页)并实现稳定返回 APP 的核心诉求,本质是解决APP 容器与三方 H5 页面的跨环境通信问题。本文将从原理、核心代码设计、关键配置三个维度,解析uni.webView.postMessage的应用逻辑及整套实现方案。 一、核心原…

作者头像 李华
网站建设 2026/7/6 22:10:51

【dz-943】基于单片机的电压表监测仪

基于单片机的电压表监测仪 摘要 在电子设备调试、电路检修及实验教学等场景中&#xff0c;精准、便捷的电压监测是保障设备正常运行和操作安全的重要环节。传统电压表存在量程固定、操作繁琐等问题&#xff0c;难以满足多场景下不同电压范围的监测需求&#xff0c;而高精度数字…

作者头像 李华
网站建设 2026/7/7 6:41:38

sward全面介绍(15) - sward与soular相关联,实现统一登录

本篇文章将介绍&#xff0c;如何通过soular实现sward的统一登录 1、soular的安装与配置 1.1 安装 下载&#xff0c;点此下载&#xff0c;或直接使用命令在线下载安装包 wget -O tiklab-soular-1.1.5.rpm https://install.tiklab.net/app/install/soular/V1.1.5/tiklab-soula…

作者头像 李华
网站建设 2026/7/7 18:32:12

Java-IO流

IO (位于 java.io 包中) 一、概念 1. 流&#xff1a;数据在内存和其他存储设备传输的通道、管道。【理解】 2. 流的分类&#xff1a;【面试内容】 (1) 按照方向分&#xff1a;[以JVM内存为参照物] a. 输入流&#xff1a;将 [其他存储设备]中数据读入到[JVM内存]中 。->读 b.…

作者头像 李华
网站建设 2026/7/7 8:59:03

全栈开发者:雷池 WAF 受欢迎,不是超越谁,是它不打扰开发

我做全栈开发 8 年&#xff0c;从前端到后端都得管&#xff0c;安全这块一直是痛点。以前要么花大量时间研究安全规则&#xff0c;要么将就用简单工具&#xff0c;防护不到位。直到用了雷池&#xff0c;才发现安全工具也能做到 “不打扰开发”。之前维护一个电商小项目&#xf…

作者头像 李华