unity万能的提示窗口

来源:互联网 发布:js array删除方法 编辑:程序博客网 时间:2024/05/29 12:29

这里给大家一个通用的提示或警告窗口的框架

首先先创建一个警告的Model类(不用继承MonoBehaviour)WarningModel 

[csharp] view plain copy
  1. using UnityEngine;  
  2. using System.Collections;  
  3. //声明一个警告委托  用于在弹出警告的同时运行其他程序的方法    
  4. public delegate void WarningResult();  
  5. public class WarningModel {  
  6. //声明该方法委托  
  7. public WarningResult result;  
  8. //需要显示的文字  
  9. public string value;  
  10. //延迟多久自动关闭  
  11. public float delay;  
  12. //警告模型  
  13. public WarningModel(string value,WarningResult result=null,float delay=-1)  
  14. {  
  15. this.value=value;  
  16. this.result=result;  
  17. this.delay=delay;  
  18. }  
  19. }  


接着再创建一个警告的UI窗口,创建一个WarningWindow脚本拖给该窗口,并将自身的子物体UILabel(NGUI)或Text(UGUI),拖到检视窗口,然后拖成预制体

[csharp] view plain copy
  1. using System.Collections;  
  2.   
  3. public class WarningWindow : MonoBehaviour {  
  4. [SerializeField]  
  5. private UILabel text;    //NGUI  
  6. //private Text text;     //UGUI  
  7. //用于接收model的result方法  
  8. WarningResult result;  
  9. //使Window显示出来  如果有需要延迟消失   就delay后消失  
  10. public void active(WarningModel value)  
  11. {  
  12. text.text=value.value;  
  13. this.result=value.result;  
  14. //如果WarningModel设置了延迟时间  
  15. if(value.delay>0)  
  16. {  
  17. //delay时间后执行close函数  
  18. Invoke("close",value.delay);  
  19. }  
  20. gameObject.SetActive(true);  
  21. }  
  22. //关闭Window   如果有需要运行的方法就运行  
  23. public void close()  
  24. {  
  25. //close函数是否正待等候调用   很明显他已经调用了  现在要删除它  
  26. if(IsInvoking("close"))  
  27. {  
  28. //取消调用  
  29. CancelInvoke("close");  
  30. }  
  31. gameObject.SetActive(false);  
  32. //看看是否有需要执行的函数  
  33. if(result!=null)  
  34. {  
  35. result();  
  36. }  
  37. }  
  38. }  


创建WarningManager脚本,挂载在一个一直存在的物体上(比如:摄像机)

[csharp] view plain copy
  1. using UnityEngine;  
  2. using System.Collections;  
  3. using System.Collections.Generic;  
  4. public class WarningManager : MonoBehaviour {  
  5. //存放所有警告Model的列表  
  6. public static List<WarningModel> errors=new List<WarningModel> ();  
  7.   
  8.   
  9. [SerializeField]  
  10. private WarningWindow window;   //警告窗口  
  11.   
  12.   
  13. void Update()  
  14. {  
  15. if(errors.Count>0)  
  16. {  
  17. //取出列表的第一个  
  18. WarningModel err=errors[0];  
  19. //然后删除  
  20. errors.RemoveAt(0);  
  21. //最后显示  
  22. window.active(err);  
  23. }  
  24. }  
  25. }  


如果想要在其他窗口重用,将创建的预制体拖到Canvas(UGUI)或UI Root(NGUI)下,然后将WarningManager 拖给一个一直存在的物体上(比如:摄像机)


如果想要显示警告窗口,就在代码中使用

[csharp] view plain copy
  1. WarningManager.errors.Add(new WarningModel("你的金币已为0,恭喜,又变成了屌丝!"));