• 坑1:因为替换图片要获取所有包含image的组件,开始我使用的是gameobject.getComponents<Image>()和FindObjectsOfType<Image>()  

    • 然鹅~getcomponts只能得到gameobject本身Image类型的所有组件,无法获取子物体上的
    • FindObjectsOfType<Image>()只能获取所有激活的image类型的物体,image的enable未开启也可以获取。
    • 使用GetComponentsInChildren<Image>(true)可以获得所有image组件,true的作用是将未激活的物体的也包含在集合中,不填写默认为FALSE。
    • 以下是测试结果

      

  • 坑2:很好,现在所有预设的图片都替换好了,并且ctrl+S,重新开了一遍工程,你会发现所有预设又回去了,为什么呢?我也不太清楚:-D。总之需要在代码里保存,在所有图片替换完毕后加一句EditorUtility.SetDirty(go); unity文档说明:如果您通过其他方式修改非场景对象,并且不希望为您的修改创建撤消条目时可以使用。
  • 坑3:记得加上场景保存代码EditorApplication.SaveScene();

以下附上替换脚本,将脚本放在Editor文件夹下,如何获取需要修改的文件可以去查一下AssetDatabase的用法

 using UnityEngine;
using UnityEditor;
using System.Collections.Generic;
using UnityEngine.UI;
using UnityEngine.SceneManagement; public class AssetReplace : EditorWindow{
[MenuItem("工具/替换Sprite")]
public static void SpriteReplace(){
EditorWindow.GetWindow<AssetReplace> (title:"SpriteReplace").Show ();
} /// <summary>
/// 老资源
/// </summary>
Sprite sp0; /// <summary>
/// 新资源
/// </summary>
Sprite sp1;
string s; void Update(){ } void OnGUI()
{ GUILayout.Label ("oldSprite");
sp0 = EditorGUILayout.ObjectField(sp0, typeof(Sprite)) as Sprite;
GUILayout.Label ("newSprite");
sp1 = EditorGUILayout.ObjectField (sp1, typeof(Sprite)) as Sprite; if(GUILayout.Button("替换预设Sprite")){
Debug.LogError ("替换预设中的Sprite");
ChangeSpriteInPrefab();
} if (GUILayout.Button ("替换场景Sprite")) {
Debug.LogError ("替换场景中的Sprite");
ChangeSpriteInScene();
} }
void ChangeSpriteInPrefab( )
{
List<string> ss = FileTool.getFiles(Application.dataPath, "prefab");
if (ss.Count > )
{
for (int i = ; i < ss.Count; i++)
ss[i] = ss[i].Replace(Application.dataPath, "Assets");
} for (int i = ; i < ss.Count; i++)
{
GameObject go= AssetDatabase.LoadAssetAtPath<GameObject>(ss[i]);
if (go == null)
{
continue;
} Image[] imgs =go.GetComponentsInChildren<Image>(true);
if (imgs == null) continue;
for (int j = ; j < imgs.Length; j++)
{
if (imgs[j].sprite == sp0)
{
imgs[j].sprite = sp1;
}
}
EditorUtility.SetDirty (go);
}
} void ChangeSpriteInScene()
{
Canvas[] cns = FindObjectsOfType<Canvas>();
foreach (Canvas item in cns)
{
Image[] imgs = item.GetComponentsInChildren<Image> (true);
foreach(Image img in imgs){
if (img.sprite == sp0)
img.sprite = sp1;
}
}
EditorApplication.SaveScene ();
} }

ps:一点体会,最近在做游戏界面,差不多完工到了整资源的时候,(菜鸟(是我)做界面就是会出很多错误)发现很多图片重复,一个个修改太麻烦了,前辈就让我写个小工具一起替换。没错!不知天高地厚的我以为这是个很简单的事情,于是交了一份全是漏洞的代码上去,前辈帮我指出错误的时候那叫一个羞愧啊冏rz。所以作为一个菜鸟,即使你很菜也一定要心细,不要眼高手低,呆在自己挖的井里就以为这是全世界了。

untiy3d小工具——修改scene与prefab中的sprite的更多相关文章

  1. node.js小工具--修改Xcode 'Create by'作者名称

    简介 用Xcode创建源文件时会自动在文件开始位置加入如下注释: // // ISSImageCycleScrollView.m // SoftTravel // // Created by iss1 ...

  2. 【java小工具】从.java文件中筛选出方法,并计算出方法在这些文件中出现的次数

    package getMethod; import java.io.*; import java.util.*; import java.util.regex.Matcher; import java ...

  3. 用C语言实现解析简单配置文件的小工具

    本文介绍作者写的一个小工具,简单的代码中包含了C语言对字符串的处理技巧,对文本文件的简单解析,二进制文件的数据复制的方法,以及格式化输出文本文件的示例. 工具的输入是如下内容的配置文件: ;资源管理器 ...

  4. C#7.2——编写安全高效的C#代码 c# 中模拟一个模式匹配及匹配值抽取 走进 LINQ 的世界 移除Excel工作表密码保护小工具含C#源代码 腾讯QQ会员中心g_tk32算法【C#版】

    C#7.2——编写安全高效的C#代码 2018-11-07 18:59 by 沉睡的木木夕, 123 阅读, 0 评论, 收藏, 编辑 原文地址:https://docs.microsoft.com/ ...

  5. 小工具:天气查询 Vs自定义设置 DevGridControl中GridView排序问题 小工具:火车票查询 小工具:邮件发送 小工具:截图&简单图像处理

    小工具:天气查询   开发一个天气查询的工具主要由两步构成,一是数据的获取,二是数据的展示.  一.数据获取 数据获取又可以分为使用其它公司提供的API和手动抓取其它网站数据. 1. 某公司提供的AP ...

  6. Confluence 6 从外部小工具中注册访问

    希望从 Confluence 中删除一个小工具,你可以选择小工具边上的 URL ,然后单击删除(Delete). 如果你希望取消订阅一个应用的小工具,你需要删除整个订阅.你不能仅仅删除你订阅中的某一个 ...

  7. Confluence 6 外部小工具在其他应用中设置可信关系

    为了在你的 Confluence 中与其他应用建立外部小工具,我们建议你在 2 个应用之间设置 OAuth 或者信任的应用连接关系.在这个例子中,外部应用为小工具的服务器(服务器提供者)和 Confl ...

  8. 如何通过C#开发调用Skyline软件中提供的小工具

    熟悉Skyline的朋友会知道,在TerraBuilder和TerraExplorer Pro软件的安装目录里,提供了很多个小工具(exe程序): 虽然我们看不到这些小工具的源代码,但我们还是可以在自 ...

  9. C# JSON使用过程中开发的小工具

    我在用JSON的过程中,经常要去看一下JSON的结构,而JSON串大不部分时候都是未格式化的数据,一次我不得不用一些网页上的在线解析和格式化工具来进行格式化查看,但是这些网页有时候并不好用:因此就结合 ...

随机推荐

  1. 淘宝内部分享:MySQL & MariaDB性能优化 【转】

    MySQL· 5.7优化·Metadata Lock子系统的优化 背景 引入MDL锁的目的,最初是为了解决著名的bug#989,在MySQL 5.1及之前的版本,事务执行过程中并不维护涉及到的所有表的 ...

  2. 解决wordcloud的一个error:Microsoft Visual C++ 9.0 is required. Get it from http://aka.ms/vcpython27

    环境: 操作系统:Windows 7 64位 语言:Python 2.7.13 |Anaconda 4.4.0 (64-bit)| (default, May 11 2017, 13:17:26) w ...

  3. python3入门之函数

    相信大家学习过其他语言,懂得函数的作用.简单的说函数最好的作用就是可以使程序变得懒惰.python作为后起之秀,当然也会拥有函数这个有用的东西: 创建函数 使用def语句即可创建函数,如创建一个用来生 ...

  4. (STM32F4) IAP程式碼實現

    IAP學習, 主要想了解實際上程式碼放在不同的Flash位置如何轉跳且執行. 我的應用程序只做了Pin12, Pin13 LED閃爍來分辨我的 App1 跟 App2的程式碼 App1 程式碼 int ...

  5. c# Config配置文件读写

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.C ...

  6. 【车联网T-BOX】基于CANoe实现的远程服务业务自动化测试方案

    为满足项目过程中不同阶段绝大部分测试需求,更方便快捷构造测试场景,支持异常场景测试.更早介入,不依赖周边ECU的稳定情况,专注于被测ECU.更经济,不加油,不充电,时间节省,物料节省等维度考虑.我们需 ...

  7. CSAPP阅读笔记-汇编语言初探(数据传送类指令)-来自第三章3.2-3.3的笔记-P115-P128

    1.如何由机器代码生成汇编代码? objdump -d再加上文件名即可直接在终端看到由反汇编器恢复的汇编代码.注意,文件名并不一定得是.o文件,任何可执行文件都可以. 结果如下: 仅列举了反汇编tes ...

  8. 3dsmax2016卸载/安装失败/如何彻底卸载清除干净3dsmax2016注册表和文件的方法

    3dsmax2016提示安装未完成,某些产品无法安装该怎样解决呢?一些朋友在win7或者win10系统下安装3dsmax2016失败提示3dsmax2016安装未完成,某些产品无法安装,也有时候想重新 ...

  9. 性能测试工具Jmeter12-Jmeter连接配置带跳板机(SSH)的mysql服务器

    准备工作: 1.下载mysql-connector-java-5.1.13-bin.jar包,然后放在jmeter安装目录lib下 2.重新打开jmeter即可 要完成以上两步才能进行后续操作 要点: ...

  10. es6精华

    函数: ES6 允许为函数的参数设置默认值,即直接写在参数定义的后面.function log(x, y = 'World') { console.log(x, y); } log('Hello') ...