李虹霖

 

UGUI

作者:孙广东 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;  
        }  
    }  
}  

http://blog.csdn.net/u010019717/article/category/2121975

posted on 2015-07-12 19:09  lol霖  阅读(476)  评论(0编辑  收藏  举报

导航