IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

    [原](三十)unity4.6学习Ugui中文文档-------制作一个泛型的MODAL窗口

    u010019717发表于 2015-05-12 07:47:30
    love 0

    孙广东 2015.5.11

    在此文章中我们将制作一个泛型的MODAL窗口 (Yes, No, Maybeso, Cancel) 在那里我们可以把内容和动作push到窗口中,这个窗口可以在我们的游戏的任何地方使用,按钮被按下时事件工作。


    涉及到的代码:

    using UnityEngine;
    using System.Collections;
    
    public class BringToFront : MonoBehaviour {
    	
    	void OnEnable () {
    		transform.SetAsLastSibling ();
    	}
    }
    using UnityEngine;
    using UnityEngine.UI;
    using UnityEngine.Events;
    using System.Collections;
    
    //  This script will be updated in Part 2 of this 2 part series.
    public class ModalPanel : MonoBehaviour {
    	
    	public Text question;
    	public Image iconImage;
    	public Button yesButton;
    	public Button noButton;
    	public Button cancelButton;
    	public GameObject modalPanelObject;
    	
    	private static ModalPanel modalPanel;
    	
    	public static ModalPanel Instance () {
    		if (!modalPanel) {
    			modalPanel = FindObjectOfType(typeof (ModalPanel)) as ModalPanel;
    			if (!modalPanel)
    				Debug.LogError ("There needs to be one active ModalPanel script on a GameObject in your scene.");
    		}
    		
    		return modalPanel;
    	}
    	
    	// Yes/No/Cancel: A string, a Yes event, a No event and Cancel event
    	public void Choice (string question, UnityAction yesEvent, UnityAction noEvent, UnityAction cancelEvent) {
    		modalPanelObject.SetActive (true);
    		
    		yesButton.onClick.RemoveAllListeners();
    		yesButton.onClick.AddListener (yesEvent);
    		yesButton.onClick.AddListener (ClosePanel);
    		
    		noButton.onClick.RemoveAllListeners();
    		noButton.onClick.AddListener (noEvent);
    		noButton.onClick.AddListener (ClosePanel);
    		
    		cancelButton.onClick.RemoveAllListeners();
    		cancelButton.onClick.AddListener (cancelEvent);
    		cancelButton.onClick.AddListener (ClosePanel);
    		
    		this.question.text = question;
    		
    		this.iconImage.gameObject.SetActive (false);
    		yesButton.gameObject.SetActive (true);
    		noButton.gameObject.SetActive (true);
    		cancelButton.gameObject.SetActive (true);
    	}
    	
    	void ClosePanel () {
    		modalPanelObject.SetActive (false);
    	}
    }

    using UnityEngine;
    using UnityEngine.UI;
    using System.Collections;
    
    public class DisplayManager : MonoBehaviour {
    	
    	public Text displayText;
    	public float displayTime;
    	public float fadeTime;
    	
    	private IEnumerator fadeAlpha;
    	
    	private static DisplayManager displayManager;
    	
    	public static DisplayManager Instance () {
    		if (!displayManager) {
    			displayManager = FindObjectOfType(typeof (DisplayManager)) as DisplayManager;
    			if (!displayManager)
    				Debug.LogError ("There needs to be one active DisplayManager script on a GameObject in your scene.");
    		}
    		
    		return displayManager;
    	}
    	
    	public void DisplayMessage (string message) {
    		displayText.text = message;
    		SetAlpha ();
    	}
    	
    	void SetAlpha () {
    		if (fadeAlpha != null) {
    			StopCoroutine (fadeAlpha);
    		}
    		fadeAlpha = FadeAlpha ();
    		StartCoroutine (fadeAlpha);
    	}
    	
    	IEnumerator FadeAlpha () {
    		Color resetColor = displayText.color;
    		resetColor.a = 1;
    		displayText.color = resetColor;
    		
    		yield return new WaitForSeconds (displayTime);
    		
    		while (displayText.color.a > 0) {
    			Color displayColor = displayText.color;
    			displayColor.a -= Time.deltaTime / fadeTime;
    			displayText.color = displayColor;
    			yield return null;
    		}
    		yield return null;
    	}
    }
    using UnityEngine;
    using UnityEngine.UI;
    using UnityEngine.Events;
    using System.Collections;
    
    //  This script will be updated in Part 2 of this 2 part series.
    public class TestModalWindow : MonoBehaviour {
    	private ModalPanel modalPanel;
    	private DisplayManager displayManager;
    	
    	private UnityAction myYesAction;
    	private UnityAction myNoAction;
    	private UnityAction myCancelAction;
    	
    	void Awake () {
    		modalPanel = ModalPanel.Instance ();
    		displayManager = DisplayManager.Instance ();
    		
    		myYesAction = new UnityAction (TestYesFunction);
    		myNoAction = new UnityAction (TestNoFunction);
    		myCancelAction = new UnityAction (TestCancelFunction);
    	}
    	
    	//  Send to the Modal Panel to set up the Buttons and Functions to call
    	public void TestYNC () {
    		modalPanel.Choice ("Do you want to spawn this sphere?", TestYesFunction, TestNoFunction, TestCancelFunction);
    		//      modalPanel.Choice ("Would you like a poke in the eye?\nHow about with a sharp stick?", myYesAction, myNoAction, myCancelAction);
    	}
    	
    	//  These are wrapped into UnityActions
    	void TestYesFunction () {
    		displayManager.DisplayMessage ("Heck yeah! Yup!");
    	}
    	
    	void TestNoFunction () {
    		displayManager.DisplayMessage ("No way, José!");
    	}
    	
    	void TestCancelFunction () {
    		displayManager.DisplayMessage ("I give up!");
    	}
    }


    说说别的:

    Resolution & Device Independence

    PlayerSettings :

    iPhone6 Plus:具备1920x1080分辨率

    在一个比例下的分辨率通过 牟定的概念可以 打开适配,如16:9

    明显在四个角落上的元素直接牟定在对应的脚上即可!

    正中间就定在正中间。

    上下左右就定在对应的上下左右。

    但是屏幕变小时依然会出现很大的问题:

    接下来要登场的是:Canvas Scaler 组件

    这样,当屏幕大小发生变化后,UI不再是简单的牟定了,会随着变大变小。


    Creating a Scene Selection Menu
    
    场景更改后要切换声音:MonoBehaviour中的 
    void OnLevelWasLoaded(int level)
        {
            if (level == 2)
            {
                source.clip = level2Music;
                source.Play ();
            }
        }
    
    异步加载场景:
    using UnityEngine;
    using System.Collections;
    using UnityEngine.UI;
    
    public class ClickToLoadAsync : MonoBehaviour {
        public Slider loadingBar;
        public GameObject loadingImage;
        private AsyncOperation async;
        public void ClickAsync(int level)
        {
            loadingImage.SetActive(true);
            StartCoroutine(LoadLevelWithBar(level));
        }
        IEnumerator LoadLevelWithBar (int level)
        {
            async = Application.LoadLevelAsync(level);
            while (!async.isDone)
            {
                loadingBar.value = async.progress;
                yield return null;
            }
        }
    }
    




    


沪ICP备19023445号-2号
友情链接