• 坑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. 动态sql语句和动态传入参数个数

    1.可以将要传入的几个参数封装成一个实体类,然后将实体类作为一个参数传入到相应的方法中,这时候就需要这sqlMapper.xml文件中对传入的字段利用<if test=""& ...

  2. redis 学习笔记(一)

    redis 基本类型 String 基本操作: GET 获取存储在给定键中的值 SET 设置存储在给定键中的值 DEL 删除存储在给定键中的值 List 基本操作: LPUSH/RPUSH 从左/右推 ...

  3. c++primer plus笔记

    > 第六版 操作符重载 #include<iostream> using namespace std; class Time { public: Time() { h=m=0; } ...

  4. bzoj 4032(A的一个最短的子串,它不是B的子串 || A的一个最短的子串,它不是B的子序列 || A的一个最短的子序列,它不是B的子串||A的一个最短的子序列,它不是B的子序列)

    在虐各种最长公共子串.子序列的题虐的不耐烦了之后,你决定反其道而行之. 一个串的“子串”指的是它的连续的一段,例如bcd是abcdef的子串,但bde不是. 一个串的“子序列”指的是它的可以不连续的一 ...

  5. PC端政务云产品的一些的看法

    第一部分:网站整体问题 1. 在hover或click时,没有明确的色彩等样式变化,如腾讯采取的是背景和颜色同时变化,搜狐和知乎采取的是颜色字体颜色的改变,无论时哪种,我觉得都是必要的. 2. 与上一 ...

  6. android httpclient 发送 PATCH 请求

    Put 用于全部更新 Patch 用于部分更新 重写一下 HttpPut 或 HttpPost 的 getMethod 方法 /** * Send a patch request */ public ...

  7. RequireJs学习笔记之Define a Module

    简单的键值对定义define({    color: "black",    size: "unisize"}); 如果一个模块没有任何依赖,又需要做用一个函数 ...

  8. java获取当前秒数输出

    Date的getSeconds()已经过时了.不建议用.所以用了下面方法 Calendar c = Calendar.getInstance(); while(true) {            c ...

  9. CCF 201412-4 最优灌溉

    问题描述 试题编号: 201412-4 试题名称: 最优灌溉 时间限制: 1.0s 内存限制: 256.0MB 问题描述: 问题描述 雷雷承包了很多片麦田,为了灌溉这些麦田,雷雷在第一个麦田挖了一口很 ...

  10. iOS 富文本属性

    // NSFontAttributeName 设置字体属性,默认值:字体:Helvetica(Neue) 字号:12 // NSForegroundColorAttributeNam 设置字体颜色,取 ...