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

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





  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值