• 坑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的用法

  1. using UnityEngine;
  2. using UnityEditor;
  3. using System.Collections.Generic;
  4. using UnityEngine.UI;
  5. using UnityEngine.SceneManagement;
  6.  
  7. public class AssetReplace : EditorWindow{
  8. [MenuItem("工具/替换Sprite")]
  9. public static void SpriteReplace(){
  10. EditorWindow.GetWindow<AssetReplace> (title:"SpriteReplace").Show ();
  11. }
  12.  
  13. /// <summary>
  14. /// 老资源
  15. /// </summary>
  16. Sprite sp0;
  17.  
  18. /// <summary>
  19. /// 新资源
  20. /// </summary>
  21. Sprite sp1;
  22. string s;
  23.  
  24. void Update(){
  25.  
  26. }
  27.  
  28. void OnGUI()
  29. {
  30.  
  31. GUILayout.Label ("oldSprite");
  32. sp0 = EditorGUILayout.ObjectField(sp0, typeof(Sprite)) as Sprite;
  33. GUILayout.Label ("newSprite");
  34. sp1 = EditorGUILayout.ObjectField (sp1, typeof(Sprite)) as Sprite;
  35.  
  36. if(GUILayout.Button("替换预设Sprite")){
  37. Debug.LogError ("替换预设中的Sprite");
  38. ChangeSpriteInPrefab();
  39. }
  40.  
  41. if (GUILayout.Button ("替换场景Sprite")) {
  42. Debug.LogError ("替换场景中的Sprite");
  43. ChangeSpriteInScene();
  44. }
  45.  
  46. }
  47. void ChangeSpriteInPrefab( )
  48. {
  49. List<string> ss = FileTool.getFiles(Application.dataPath, "prefab");
  50. if (ss.Count > )
  51. {
  52. for (int i = ; i < ss.Count; i++)
  53. ss[i] = ss[i].Replace(Application.dataPath, "Assets");
  54. }
  55.  
  56. for (int i = ; i < ss.Count; i++)
  57. {
  58. GameObject go= AssetDatabase.LoadAssetAtPath<GameObject>(ss[i]);
  59. if (go == null)
  60. {
  61. continue;
  62. }
  63.  
  64. Image[] imgs =go.GetComponentsInChildren<Image>(true);
  65. if (imgs == null) continue;
  66. for (int j = ; j < imgs.Length; j++)
  67. {
  68. if (imgs[j].sprite == sp0)
  69. {
  70. imgs[j].sprite = sp1;
  71. }
  72. }
  73. EditorUtility.SetDirty (go);
  74. }
  75. }
  76.  
  77. void ChangeSpriteInScene()
  78. {
  79. Canvas[] cns = FindObjectsOfType<Canvas>();
  80. foreach (Canvas item in cns)
  81. {
  82. Image[] imgs = item.GetComponentsInChildren<Image> (true);
  83. foreach(Image img in imgs){
  84. if (img.sprite == sp0)
  85. img.sprite = sp1;
  86. }
  87. }
  88. EditorApplication.SaveScene ();
  89. }
  90.  
  91. }

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. [Python]json 错误xx is not JSON serializable

    TypeError: Decimal('1457501') is not JSON serializable 在使用json的时候经常会遇到xxx  is not JSON serializable, ...

  2. mysql数据库表的基本操作sql语句总结

    1,命令行登录命令 mysql -h localhost -u root -p C:\Users\lenovo>mysql -u root -p Enter password: ***** We ...

  3. miniui中表单验证规则总结

    页面链接: http://www.miniui.com/demo/#src=form/rules.html 页面效果图: 页面代码: <!DOCTYPE html PUBLIC "-/ ...

  4. 977 AlvinZH过生日(背包DP大作战S)

    977 AlvinZH过生日 思路 难题.逆推DP. 要明确dp的状态只与是否有选择权有关,而与选择权在谁手里无关.因为不论选择权在谁手里,那个人都会尽可能的获得最大的蛋糕重量. dp[i]表示分配到 ...

  5. css加载顺序

    最近发现个有意思的事情,印象中的是css中class后面会覆盖前面的, 于是写了代码 div{ width: 100px; height: 100px; } .red{ background-colo ...

  6. jquery将json数据放入表格当中

    数据: var datas = [{ name:"淘宝", url:"www.taobao.com", type:"购物网站" },{ na ...

  7. Nginx反向代理与负载简单实现

    反向代理 1.proxy_pass 通过反向代理把请求转发到百度 2.proxy_pass 既可以是ip地址,也可以是域名,同时还可以指定端口 3.proxy_pass 指定的地址携带了URI,如果前 ...

  8. Jenkins Slave Nodes – using the Swarm Plugin

    link: http://www.donaldsimpson.co.uk/2013/03/18/jenkins-slave-nodes-using-the-swarm-plugin/ I’ve bee ...

  9. JavaWeb学习笔记(二十一)—— 监听器Listener

    一.监听器概述 JavaWeb中的监听器是Servlet规范中定义的一种特殊类,它用于监听web应用程序中的ServletContext, HttpSession和 ServletRequest等域对 ...

  10. ie下的值改变事件

    前两天在页面上写了一个值改变事件,值是用js改变的,用的oninput方法和onpropertyChange方法,但是可能是因为框架的缘故,在ie浏览器下,陷入了莫名其妙的循环中.然后考虑是在加载的时 ...