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

本文主要参考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(0, mat.GetTexture(0));

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内咯,

 

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

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

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

        // 灰度图像  

        public void ShowAsGray()

        {

            spriteIcon.IsShowColor = true;

            spriteIcon.RefreshPanel(spriteIcon.gameObject);

        }

        // 恢复正常图像  

        public void ShowAsNormal()

        {

            spriteIcon.IsShowColor = false;

            spriteIcon.RefreshPanel(spriteIcon.gameObject);

        }

效果图:NGUI的UISprite动态染色的一种方法   NGUI的UISprite动态染色的一种方法  是死灰死灰的吧。。。。。。。

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

你可能感兴趣的:(Sprite)