要实现通知中心功能,首先要创建一个游戏物体,在上面挂载GUITeture和GUIText脚本。注意GUITexture和GUIText脚本的顺序,GUITexture在前,GUIText在后,否则GUITexture会将GUIText遮挡住。
接着设置Position属性,讲Position的X属性设置为1.2,Y设置为0.9,这样就将物体设置为屏幕之外靠近右上角的位置。
下面给物体挂载脚本,实现通知功能。
1 using UnityEngine; 2 using System.Collections; 3 4 public class TestTest : MonoBehaviour 5 { 6 private GUITexture guiTexture; 7 private GUIText guiText; 8 private float x; 9 private bool sholdMove = true; 10 private bool shouldFadeOut = true; 11 public float stopMoveTime = 0; 12 public bool shouldPlay = true; 13 private float winStoreNotificationCenterStayTime = 3f; 14 private float androidToastStayTime = 0.5f; 15 public enum NotificationStyle { AndroidToast, WinStoreNotificationCenter }; 16 17 public NotificationStyle currentNotificationStyle = NotificationStyle.WinStoreNotificationCenter; 18 void Start() 19 { 20 guiTexture = GetComponent<GUITexture>(); 21 guiText = GetComponent<GUIText>(); 22 23 audio.PlayDelayed(0.5f); 24 25 switch (currentNotificationStyle) 26 { 27 case NotificationStyle.AndroidToast: 28 29 Vector3 pos = guiTexture.gameObject.transform.position; 30 pos.x = 0.5f - (guiTexture.pixelInset.size.x / Screen.width) * 0.5f; 31 pos.y = 0.5f + (guiTexture.pixelInset.size.y / Screen.height) * 0.5f; 32 guiTexture.gameObject.transform.position = pos; 33 guiText.alignment = TextAlignment.Center; 34 35 shouldFadeOut = true; 36 37 break; 38 39 case NotificationStyle.WinStoreNotificationCenter: 40 41 x = 1 - (guiTexture.pixelInset.size.x / Screen.width) - 0.02f; 42 shouldFadeOut = false; 43 break; 44 default: 45 46 break; 47 } 48 49 } 50 51 // Update is called once per frame 52 void Update() 53 { 54 switch (currentNotificationStyle) 55 { 56 case NotificationStyle.AndroidToast: 57 58 if (stopMoveTime != 0 && stopMoveTime + androidToastStayTime <= Time.time) 59 { 60 shouldFadeOut = true; 61 } 62 63 if (shouldFadeOut) 64 { 65 Color temp = guiTexture.color; 66 temp.a -= Time.deltaTime / 2f; 67 guiTexture.color = temp; 68 if (guiTexture.color.a <= 0) 69 { 70 shouldFadeOut = false; 71 Destroy(this.gameObject); 72 } 73 } 74 75 break; 76 case NotificationStyle.WinStoreNotificationCenter: 77 78 if (sholdMove) 79 { 80 guiTexture.transform.Translate(new Vector3(-0.1f, 0, 0) * Time.deltaTime * 2); 81 if (guiTexture.transform.position.x <= x) 82 { 83 sholdMove = false; 84 stopMoveTime = Time.time; 85 } 86 } 87 88 if (stopMoveTime != 0 && stopMoveTime + winStoreNotificationCenterStayTime <= Time.time) 89 { 90 shouldFadeOut = true; 91 } 92 93 if (shouldFadeOut) 94 { 95 Color temp = guiTexture.color; 96 temp.a -= Time.deltaTime; 97 guiTexture.color = temp; 98 if (guiTexture.color.a <= 0) 99 { 100 shouldFadeOut = false; 101 Destroy(this.gameObject); 102 } 103 } 104 105 break; 106 107 default: 108 break; 109 } 110 } 111 }
然后给游戏物体加上Audio Source组件,由于播放消息声音。接下来将物体命名为Notification,做成Prefab。最终结果如下图所示:
下面写一个Notification脚本,用于统一管理通知。
1 using UnityEngine; 2 using System.Collections; 3 4 public class NotificationCenter : MonoBehaviour 5 { 6 public static NotificationCenter Instance; 7 8 public GameObject notificationPrefab; 9 void Awake() 10 { 11 Instance = this; 12 } 13 14 public void Add(TestTest.NotificationStyle notificationStyle, string guiTextContent) 15 { 16 GameObject go = Instantiate(notificationPrefab) as GameObject; 17 go.GetComponent<TestTest>().currentNotificationStyle = notificationStyle; 18 go.guiText.text = guiTextContent; 19 } 20 }
这样,当我们使用的时候直接调用NotificationCenter.Instance. Add(TestTest.NotificationStyle notificationStyle, string guiTextContent)
方法就行了。其中notificationStyle参数表示消息现实的风格(WinStore样式或Android Toast样式),guiTextContent表示GUIText组件现实的文本,也就是消息内容。
接着我的上一篇文章,要想显示截图保存成功的消息,只需要这样调用NotificationCenter.Instance. Add(TestTest.NotificationStyle.WinStoreNotificationCenter, "成功截图并保存")。