NGUI的UISprite动态染色的一种方法
本文主要参考iwinterice 的 NGUI的UISprite动态染色的一种解决方案 文章。
参考参考,就是既参详又拷贝,-,-|||
相关理论依据,还请去移步 NGUI的UISprite动态染色的一种解决方案 里面去寻找。我这里只有提供一下源码,并对原博文进行了一点点修改,至于修改后的好坏,俺也不知道咯。
首先阐明一下需求,就是几个角色,打怪,扫怪,头像一直blingbling的闪,但是,duang,血量爆掉了,角色挂了,头像就得死灰死灰的样子了。
原博文是去改了UISprite的源码,虽然本人很想去改,但本着不能随意修改源码的原则(因为,你不知道你修改之后对其他人会造成什么影响,而且也为了保持源码的简洁),于是,继承咯
//----------------------------------------------
// NGUI: Next-Gen UI kit
// Copyright © 2011-2015 Tasharen Entertainment
//---------------------------------------------- using UnityEngine;
using System.Collections.Generic; /// <summary>
/// Sprite is a textured element in the UI hierarchy.
/// 可以赋值一个ColorMaterial
/// </summary> [ExecuteInEditMode]
[AddComponentMenu("NGUI/UI/NGUI SpriteExt")]
public class UISpriteExt : UISprite
{
/// <summary>
/// Retrieve the material used by the font.
/// </summary> [HideInInspector][SerializeField]private Material mColorMaterial;
public Material ColorMaterial
{
get { return mColorMaterial; }
set { mColorMaterial = value; }
}
[System.NonSerialized]bool mIsShowColor = false;
public bool IsShowColor
{
get { return mIsShowColor; }
set { mIsShowColor = value; }
}
public override Material material
{
//get { return (mAtlas != null) ? mAtlas.spriteMaterial : null; }
get
{
Material mat = base.material;
if ( mat == null )
{
mat = (mAtlas != null) ? mAtlas.spriteMaterial : null;
} if (mColorMaterial != null && mIsShowColor)
{
ColorMaterial.SetTexture(, mat.GetTexture());
return ColorMaterial;
}
else
{
return mat;
}
} } GameObject GetMostClosePanel(Transform rootTrans)
{
if (rootTrans.GetComponent<UIPanel>() != null)
{
return rootTrans.gameObject;
}
else if (rootTrans.parent == null)
{
return null;
}
else
{
return GetMostClosePanel(rootTrans.parent);
}
} GameObject panelObj = null;
public bool selfRefresh = true; public void RefreshPanel(GameObject go)
{
if (!selfRefresh)
return; if (panelObj == null)
{
panelObj = GetMostClosePanel(go.transform);
} if (panelObj != null)
{
panelObj.GetComponent<UIPanel>().enabled = false;
panelObj.GetComponent<UIPanel>().enabled = true;
go.SetActive(false);
go.SetActive(true);
}
}
}
自古以来,起名字就是个文雅的活,本博只是一个有文化的流氓,所以起的名字也比较流氓(=@__@=)哪
有了基本类,是远远不够的,还需要一个Editor内的类,o(╯□╰)o,比较简单,快来瞅瞅~~
using UnityEngine;
using UnityEditor;
using System.Collections.Generic; /// <summary>
/// Inspector class used to edit UISpriteExts.
/// </summary> [CanEditMultipleObjects]
[CustomEditor(typeof(UISpriteExt), true)]
public class UISpriteExtInspector : UISpriteInspector
{
/// <summary>
/// Draw the atlas and sprite selection fields.
/// </summary> protected override bool ShouldDrawProperties ()
{
base.ShouldDrawProperties(); SerializedProperty wm = NGUIEditorTools.DrawProperty("WMaterial", serializedObject, "mColorMaterial", GUILayout.MinWidth(20f));
if ( wm!= null )
{
Material mColorMaterial = wm.objectReferenceValue as Material;
}
GUILayout.Space(6f); return true;
}
}
用的时候,就是直接将材质球拖到WMaterial内咯,

看,连材质球,都是借用的原博文内的东西。我实在是个懒人。
我还提供了 mIsShowColor 这个变量,用来控制显示。使用的示例代码如下:
// 灰度图像
public void ShowAsGray()
{
spriteIcon.IsShowColor = true;
spriteIcon.RefreshPanel(spriteIcon.gameObject);
}
// 恢复正常图像
public void ShowAsNormal()
{
spriteIcon.IsShowColor = false;
spriteIcon.RefreshPanel(spriteIcon.gameObject);
}
效果图:
是死灰死灰的吧。。。。。。。
后来,被告知,还要去改透明度,就是呃,变灰之后,就需要半透明效果。。。
NGUI的UISprite动态染色的一种方法的更多相关文章
- 在Oracle中执行动态SQL的几种方法
转载:在Oracle中执行动态SQL的几种方法 以下为内容留存: 在Oracle中执行动态SQL的几种方法 在一般的sql操作中,sql语句基本上都是固定的,如:SELECT t.empno,t.en ...
- vue父组件向子组件动态传值的两种方法
在一些项目需求中需要父组件向子组件动态传值,比如我这里的需求是,父组件动态通过axios获取返回的图片url数组然后传给子组件,上传图片的子组件拿到该数组后进行遍历并展示图片,因为有时候获取到的会是空 ...
- java动态代理的两种方法
动态代理,有两种情况,第一种是有接口的情况下,你可以选择为jdk自带的动态代理的方式来编写程序,但你想要为一个实在的类编写动态代理的方式的话,这时候就必须选择一些开源的lib包,如cglib包,同时还 ...
- SpringBoot中使用Spring Data Jpa 实现简单的动态查询的两种方法
软件152 尹以操 首先谢谢大佬的简书文章:http://www.jianshu.com/p/45ad65690e33# 这篇文章中讲的是spring中使用spring data jpa,使用了xml ...
- OC中动态创建可变数组的问题.有一个数组,数组中有13个元素,先将该数组进行分组,每3个元素为一组,分为若干组,最后用一个数组统一管理这些分组.(要动态创建数组).两种方法
<span style="font-size:24px;">//////第一种方法 // NSMutableArray *arr = [NSMutableArray a ...
- Spring data jpa 实现简单动态查询的通用Specification方法
本篇前提: SpringBoot中使用Spring Data Jpa 实现简单的动态查询的两种方法 这篇文章中的第二种方法 实现Specification 这块的方法 只适用于一个对象针对某一个固定字 ...
- unity游戏开发之NGUI的UISprite染色
游戏的UI开发中常常会遇到染色问题.比如button失效变灰的效果,同一个道具通过策划表配的颜色值染上红绿蓝紫等颜色,效果例如以下 最笨最挫的方法当然是让美术多出几个资源图.这种一个缺点是浪费资源,在 ...
- NGUI制作字体的三种方法
主要参考两篇博文: (1).NGUI制作字体的三种方法 (2).使用位图字体工具BMFont从图片生成自定义字体 1.BMFont下载地址 http://www.angelcode.com/produ ...
- Jquery动态添加的元素绑定事件的3种方法
假设我们点击li标签,弹出他的文本,如果是动态添加的li,点击是没有效果的,压根弹不出来文本. 下面博主分享一下为动态添加的元素绑定事件的三种方法,网上一般都是两种,我在这里多增加了一种. 事件案例: ...
随机推荐
- ASP.NET MVC3-第02节-添加一个Controller (C#)
前言 ---------------------------- 第01节[翻译]01-ASP.NET MVC 3介绍 ---------------------------- MVC是“model-v ...
- ThinkPHP学习(三)
我们已经将数据保存到了后台数据库,那接下来我们肯定要将数据显示出来看看了. 先建立一个要显示数据的模板formlist.html: <!DOCTYPE HTML PUBLIC "-// ...
- ReactiveCocoa 5.0 初次了解
RAC 5.0 相比于 4.0 有了巨大的变化,不仅是受 swift 3.0 大升级的影响,RAC 对自身项目结构的也进行了大幅度的调整.这个调整就是将 RAC 拆分为四个库:ReactiveCoco ...
- Using 1-Wire device with Intel Galileo
Using 1-Wire device with Intel Galileo 3 Replies Many people have had trouble with getting 1-Wire de ...
- 【ASP.NET】ASP.NET如何发布Web项目
1.右击需要发布的项目,选择 属性>应用程序 在目标框架中选择.NET的版本,选择的版本的要本机安装的版本相符合,通常可以在“C:\Windows\Microsoft.NET\Framework ...
- hibernate使用注解设置日期默认值
用注解设置属性的默认值时 使用 @Temporal(TemporalType.TIMESTAMP) @Column(updatable = false,nullable=false,length=20 ...
- 如何从40亿整数中找到不存在的一个 webservice Asp.Net Core 轻松学-10分钟使用EFCore连接MSSQL数据库 WPF实战案例-打印 RabbitMQ与.net core(五) topic类型 与 headers类型 的Exchange
如何从40亿整数中找到不存在的一个 前言 给定一个最多包含40亿个随机排列的32位的顺序整数的顺序文件,找出一个不在文件中的32位整数.(在文件中至少确实一个这样的数-为什么?).在具有足够内存的情况 ...
- MYSQL-使用mysqldump创建数据库快照
对已经有数据的mysql库创建主从的时候,可以使用mysqldump创建数据库快照 #--master-data选项会自动加上开启复制需要的"change master to"语句 ...
- Python 文件 read() 方法
概述 Python 文件 read() 方法用于从文件中读取指定的字符数,如果未给定或为负则读取所有. 语法 read() 方法语法如下: fileObject.read([size]) 参数 siz ...
- Oracle in和exists效率问题分析
--------------------------in和exists效率问题------------- 单说in和exsist,in的效率较差.关于EXISTS与IN的区别:EXISTS检查是否有结 ...