本文主要参考iwinterice 的 NGUI的UISprite动态染色的一种解决方案 文章。

参考参考,就是既参详又拷贝,-,-|||

相关理论依据,还请去移步 NGUI的UISprite动态染色的一种解决方案 里面去寻找。我这里只有提供一下源码,并对原博文进行了一点点修改,至于修改后的好坏,俺也不知道咯。

首先阐明一下需求,就是几个角色,打怪,扫怪,头像一直blingbling的闪,但是,duang,血量爆掉了,角色挂了,头像就得死灰死灰的样子了。

原博文是去改了UISprite的源码,虽然本人很想去改,但本着不能随意修改源码的原则(因为,你不知道你修改之后对其他人会造成什么影响,而且也为了保持源码的简洁),于是,继承咯

  1. //----------------------------------------------
  2. // NGUI: Next-Gen UI kit
  3. // Copyright © 2011-2015 Tasharen Entertainment
  4. //----------------------------------------------
  5.  
  6. using UnityEngine;
  7. using System.Collections.Generic;
  8.  
  9. /// <summary>
  10. /// Sprite is a textured element in the UI hierarchy.
  11. /// 可以赋值一个ColorMaterial
  12. /// </summary>
  13.  
  14. [ExecuteInEditMode]
  15. [AddComponentMenu("NGUI/UI/NGUI SpriteExt")]
  16. public class UISpriteExt : UISprite
  17. {
  18. /// <summary>
  19. /// Retrieve the material used by the font.
  20. /// </summary>
  21.  
  22. [HideInInspector][SerializeField]private Material mColorMaterial;
  23. public Material ColorMaterial
  24. {
  25. get { return mColorMaterial; }
  26. set { mColorMaterial = value; }
  27. }
  28. [System.NonSerialized]bool mIsShowColor = false;
  29. public bool IsShowColor
  30. {
  31. get { return mIsShowColor; }
  32. set { mIsShowColor = value; }
  33. }
  34. public override Material material
  35. {
  36. //get { return (mAtlas != null) ? mAtlas.spriteMaterial : null; }
  37. get
  38. {
  39. Material mat = base.material;
  40. if ( mat == null )
  41. {
  42. mat = (mAtlas != null) ? mAtlas.spriteMaterial : null;
  43. }
  44.  
  45. if (mColorMaterial != null && mIsShowColor)
  46. {
  47. ColorMaterial.SetTexture(, mat.GetTexture());
  48. return ColorMaterial;
  49. }
  50. else
  51. {
  52. return mat;
  53. }
  54. }
  55.  
  56. }
  57.  
  58. GameObject GetMostClosePanel(Transform rootTrans)
  59. {
  60. if (rootTrans.GetComponent<UIPanel>() != null)
  61. {
  62. return rootTrans.gameObject;
  63. }
  64. else if (rootTrans.parent == null)
  65. {
  66. return null;
  67. }
  68. else
  69. {
  70. return GetMostClosePanel(rootTrans.parent);
  71. }
  72. }
  73.  
  74. GameObject panelObj = null;
  75. public bool selfRefresh = true;
  76.  
  77. public void RefreshPanel(GameObject go)
  78. {
  79. if (!selfRefresh)
  80. return;
  81.  
  82. if (panelObj == null)
  83. {
  84. panelObj = GetMostClosePanel(go.transform);
  85. }
  86.  
  87. if (panelObj != null)
  88. {
  89. panelObj.GetComponent<UIPanel>().enabled = false;
  90. panelObj.GetComponent<UIPanel>().enabled = true;
  91. go.SetActive(false);
  92. go.SetActive(true);
  93. }
  94. }
  95. }

自古以来,起名字就是个文雅的活,本博只是一个有文化的流氓,所以起的名字也比较流氓(=@__@=)哪

有了基本类,是远远不够的,还需要一个Editor内的类,o(╯□╰)o,比较简单,快来瞅瞅~~

  1. using UnityEngine;
  2. using UnityEditor;
  3. using System.Collections.Generic;
  4.  
  5. /// <summary>
  6. /// Inspector class used to edit UISpriteExts.
  7. /// </summary>
  8.  
  9. [CanEditMultipleObjects]
  10. [CustomEditor(typeof(UISpriteExt), true)]
  11. public class UISpriteExtInspector : UISpriteInspector
  12. {
  13. /// <summary>
  14. /// Draw the atlas and sprite selection fields.
  15. /// </summary>
  16.  
  17. protected override bool ShouldDrawProperties ()
  18. {
  19. base.ShouldDrawProperties();
  20.  
  21. SerializedProperty wm = NGUIEditorTools.DrawProperty("WMaterial", serializedObject, "mColorMaterial", GUILayout.MinWidth(20f));
  22. if ( wm!= null )
  23. {
  24. Material mColorMaterial = wm.objectReferenceValue as Material;
  25. }
  26. GUILayout.Space(6f);
  27.  
  28. return true;
  29. }
  30. }

用的时候,就是直接将材质球拖到WMaterial内咯,

看,连材质球,都是借用的原博文内的东西。我实在是个懒人。

我还提供了 mIsShowColor 这个变量,用来控制显示。使用的示例代码如下:

  1. // 灰度图像
  2. public void ShowAsGray()
  3. {
  4. spriteIcon.IsShowColor = true;
  5. spriteIcon.RefreshPanel(spriteIcon.gameObject);
  6. }
  7. // 恢复正常图像
  8. public void ShowAsNormal()
  9. {
  10. spriteIcon.IsShowColor = false;
  11. spriteIcon.RefreshPanel(spriteIcon.gameObject);
  12. }

效果图:     是死灰死灰的吧。。。。。。。

后来,被告知,还要去改透明度,就是呃,变灰之后,就需要半透明效果。。。

NGUI的UISprite动态染色的一种方法的更多相关文章

  1. 在Oracle中执行动态SQL的几种方法

    转载:在Oracle中执行动态SQL的几种方法 以下为内容留存: 在Oracle中执行动态SQL的几种方法 在一般的sql操作中,sql语句基本上都是固定的,如:SELECT t.empno,t.en ...

  2. vue父组件向子组件动态传值的两种方法

    在一些项目需求中需要父组件向子组件动态传值,比如我这里的需求是,父组件动态通过axios获取返回的图片url数组然后传给子组件,上传图片的子组件拿到该数组后进行遍历并展示图片,因为有时候获取到的会是空 ...

  3. java动态代理的两种方法

    动态代理,有两种情况,第一种是有接口的情况下,你可以选择为jdk自带的动态代理的方式来编写程序,但你想要为一个实在的类编写动态代理的方式的话,这时候就必须选择一些开源的lib包,如cglib包,同时还 ...

  4. SpringBoot中使用Spring Data Jpa 实现简单的动态查询的两种方法

    软件152 尹以操 首先谢谢大佬的简书文章:http://www.jianshu.com/p/45ad65690e33# 这篇文章中讲的是spring中使用spring data jpa,使用了xml ...

  5. OC中动态创建可变数组的问题.有一个数组,数组中有13个元素,先将该数组进行分组,每3个元素为一组,分为若干组,最后用一个数组统一管理这些分组.(要动态创建数组).两种方法

    <span style="font-size:24px;">//////第一种方法 // NSMutableArray *arr = [NSMutableArray a ...

  6. Spring data jpa 实现简单动态查询的通用Specification方法

    本篇前提: SpringBoot中使用Spring Data Jpa 实现简单的动态查询的两种方法 这篇文章中的第二种方法 实现Specification 这块的方法 只适用于一个对象针对某一个固定字 ...

  7. unity游戏开发之NGUI的UISprite染色

    游戏的UI开发中常常会遇到染色问题.比如button失效变灰的效果,同一个道具通过策划表配的颜色值染上红绿蓝紫等颜色,效果例如以下 最笨最挫的方法当然是让美术多出几个资源图.这种一个缺点是浪费资源,在 ...

  8. NGUI制作字体的三种方法

    主要参考两篇博文: (1).NGUI制作字体的三种方法 (2).使用位图字体工具BMFont从图片生成自定义字体 1.BMFont下载地址 http://www.angelcode.com/produ ...

  9. Jquery动态添加的元素绑定事件的3种方法

    假设我们点击li标签,弹出他的文本,如果是动态添加的li,点击是没有效果的,压根弹不出来文本. 下面博主分享一下为动态添加的元素绑定事件的三种方法,网上一般都是两种,我在这里多增加了一种. 事件案例: ...

随机推荐

  1. [转载]virtual&nbsp;box如何生成新的UUID

    原文地址:virtual box如何生成新的UUID作者:阿昭 问题描述:在为Virtual Box加载多台虚拟机器(显然这些虚拟机器都来自一个模板)的时候,出现如下错误: "Cannot ...

  2. java hibernate Criteria 删除数据 delete data 2种方法

    public String deleteByUserAccount(String account) { 方式一: Session session = this.getCurrentSession(); ...

  3. 基于24位AD转换模块HX711的重量称量实验(已补充皮重存储,线性温度漂移修正)

    转载:http://www.geek-workshop.com/thread-2315-1-1.html 以前在X宝上买过一个称重放大器,180+大洋.原理基本上就是把桥式拉力传感器输出的mV级信号放 ...

  4. XmlSerializer 对象序列化成XML 自定义编码格式(gb2312)

    随着面向服务(SOA)的开发方式的兴起,客户端和服务端之间的消息传送,很多采用了XML的格式.但是大家在日常的开发中,应该会有这么种体验,就是组织xml格式的代码太繁琐,这篇随笔也是为了和大家分享下简 ...

  5. python练习笔记——组合恒等式

    排列组合结合恒等式 已知从n个物品中取出m个,则存在一个组合恒等式. C(n, m)=C(n, n-m)=C(n-1, m-1)+C(n-1,m) 其中C(n,0) = 1 求:从5取3 和 10 取 ...

  6. golang学习笔记 --switch

    switch的例子: switch coinflip() { case "heads": heads++ case "tails": tails++ defau ...

  7. Oracle 12C -- ADRCI查看DDL日志

    $ adrci ADRCI: Release - Production on Tue Nov :: Copyright (c) , , Oracle and/or its affiliates. Al ...

  8. 绿色版mysql注册卸载服务

    如果直接用绿色版的mysql,则下载后解压,只需对目录下的my.ini文件的basedir(mysql的基本目录)和datadir(mysql数据目录)指定就可以,如下所示. #Path to ins ...

  9. 还没被玩坏的robobrowser(6)——follow_link

    背景 在做spider的时候,我们经常会有点击链接的需求. 考虑这样的一个简单spider:获取qq.com主页上的今日话题中的内容. 一般思路是先去qq.com首页上找到今日话题的链接,然后点击这个 ...

  10. java.lang.RuntimeException: Date pattern must be set for column update_time in the schema of component

    使用Talend open studio  ,从mysql数据源中读取数据,将数据导出到excel文档,另外一个mysql数据库,和一个普通文件,遇到标题的错误,模型如下图所示: tMap将30.7中 ...