UGUI制作一个泛型的MODAL模态对话框窗口

 

本篇unity3d教程,我们来学习下unity new ui即UGUI中制作一个泛型的MODAL模态对话框窗口(Yes, No, Maybeso, Cancel 在那里我们可以把内容和动作push到窗口中,这个窗口可以在我们的游戏的任何地方使用,按钮被按下时事件工作。


MODAL模态对话框

废话不多说,贴上涉及到的代码:


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 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;
}
}

 

说说别的:

Resolution & Device Independence

PlayerSettings :

iPhone6 Plus:具备1920×1080分辨率
在一个比例下的分辨率通过 牟定的概念可以 打开适配,如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;
}
}
}

好了,本篇unity3d教程关于用UGUI制作泛型的模态对话框窗口到此结束,下篇我们再会!