上QQ阅读APP看书,第一时间看更新
3.5 UI界面
在继续改进主角和敌人的脚本之前,我们需要创建一个游戏管理器来管理游戏中的事件和UI界面显示。
首先使用Unity的新GUI系统创建一个简单的界面。
步骤 01 在Project窗口中找到预设的UI贴图文件,如图3-12所示
图3-12 找到预设的贴图文件
步骤 02 在Hierarchy窗口中单击鼠标右键,选择【UI】→【Image】→【GUI Texture】创建2D图像控件,在Source Image中引用heath.png作为贴图,使用左上对齐方式,如图3-13所示。
图3-13 UI贴图效果
步骤 03 创建文字。在Hierarchy窗口中单击鼠标右键,选择【UI】→【Text】创建游戏文字,并调整位置、大小等,如图3-14所示。因为我们需要在游戏中动态改变文字的内容,所以必须知道文字的名字,这里设置txt_ammo为弹药数量的名字,txt_hiscore为纪录,txt_life为生命,txt_score为得分。右击并选择【UI】→【Button】,创建一个按钮,命名为Restart Button,用于重新开始游戏。
图3-14 设置文字
最后的UI界面效果如图3-15所示。
图3-15 UI界面效果
步骤 04 创建一个空的游戏体并命名为GameManager,将其坐标设为0。创建脚本GameManager.cs,将其指定给游戏体GameManager。
using UnityEngine; using UnityEngine.UI; //UI名称域 using UnityEngine.SceneManagement; // 关卡名称域 [AddComponentMenu("Game/GameManager")] public class GameManager : MonoBehaviour { public static GameManager Instance = null; // 游戏得分 public int m_score = 0; // 游戏最高得分 public static int m_hiscore = 0; // 弹药数量 public int m_ammo = 100; // 游戏主角 Player m_player; // UI文字 Text txt_ammo; Text txt_hiscore; Text txt_life; Text txt_score; Button button_restart; void Start () { Instance = this; // 获得主角 m_player = GameObject.FindGameObjectWithTag("Player").GetComponent<Player>(); // 获得UI文字 GameObject uicanvas = GameObject.Find("Canvas"); foreach (Transform t in uicanvas.transform.GetComponentsInChildren<Transform>()) { if (t.name.CompareTo("txt_ammo") == 0) { txt_ammo = t.GetComponent<Text>(); } else if (t.name.CompareTo("txt_hiscore") == 0) { txt_hiscore = t.GetComponent<Text>(); txt_hiscore.text = "High Score " + m_hiscore; } else if (t.name.CompareTo("txt_life") == 0) { txt_life = t.GetComponent<Text>(); } else if (t.name.CompareTo("txt_score") == 0) { txt_score = t.GetComponent<Text>(); } else if (t.name.CompareTo("Restart Button") == 0) { button_restart = t.GetComponent<Button>(); button_restart.onClick.AddListener(delegate(){ //设置重新开始游戏按钮事件 // 读取当前关卡 SceneManager.LoadScene(SceneManager.GetActiveScene().name); }); button_restart.gameObject.SetActive(false); // 游戏初期隐藏重新开始游戏按钮 } } }
这里的代码主要是通过GetComponentsInChildren获得所有UI子物体,并通过子物体的名字获取到UI文字组件。
步骤 05 继续为GameManager.cs添加函数,用于更新UI界面信息。
// 更新分数 public void SetScore(int score) { m_score+= score; if (m_score > m_hiscore) m_hiscore = m_score; txt_score.text="Score<color=yellow>"+m_score +"</color>"; ; txt_hiscore.text = "High Score " + m_hiscore; } // 更新弹药 public void SetAmmo(int ammo) { m_ammo -= ammo; // 如果弹药为负数,重新填弹 if (m_ammo <= 0) m_ammo = 100- m_ammo; txt_ammo.text = m_ammo.ToString()+"/100"; } // 更新生命 public void SetLife(int life) { txt_life.text = life.ToString(); if(life<=0) // 当主角生命值为0时,显示重新“开始游戏”按钮 button_restart.gameObject.SetActive(true); }