Unity 3D\2D手机游戏开发:从学习到产品(第3版)
上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);
            }