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