您的位置:首页 > 产品设计 > UI/UE

NGUI的UISprite动态染色的一种方法

2015-06-11 11:46 597 查看
本文主要参考iwintericeNGUI的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(0, mat.GetTexture(0));
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);
}


效果图:



是死灰死灰的吧。。。。。。。

后来,被告知,还要去改透明度,就是呃,变灰之后,就需要半透明效果。。。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: