3.5 UI界面 在继续改进主角和敌人的脚本之前,我们需要创建一个游戏管理器来管理游戏中的事件和UI界面显示。 在前一章,我们使用OnGUI制作了一些简单的UI,使用OnGUI可以更快地创建UI元素,但它的缺点是性能较差,在编写脚本的同时也无法预览UI的效果。这一次我们将使用另一种方式,直接在场景中创建2D贴图表示UI界面。 在Project窗口找到预设的UI贴图文件,如图3-12所示 图3-12 设置动画过渡 选择贴图文件,在菜单栏选择【GameObject】→【Create Other】→【GUI Texture】创建2D贴图,然后在Inspector窗口移动贴图的位置,在Game窗口可以直接预览贴图效果。默认贴图是中心对齐,将Pixel Inset的X和Y设为0即为左下对齐,如果将X和Y设为Width和Height的负值,即为右上对齐,可根据需要调整,如图3-13所示。 图3-13 UI贴图效果 接下来我们创建文字。到Windows的Font文件夹中找一个喜欢的字体,将其复制到Unity工程内,确定其处于选中状态,在菜单栏选择【GameObject】→【Create Other】→【GUI Text】创建游戏文字,并调整位置和大小等。文字的常见设置包括,在Text中输入预设的文字,在Anchor中选择文字的轴心点,在Alignment中选择文字对齐方式,在Font Size中设置文字的大小,如图3-14所示。 图3-14 设置文字 最后的UI界面效果如图3-15所示。 图3-15 UI界面效果 创建一个空的游戏体命名为GameManager,将其坐标设为0,然后将所有2D贴图和文字都作为其子物体。因为我们需要在游戏中动态改变文字的内容,所以需要知道文字的名字,这里设txt_ammo为弹药数量的名字,txt_hiscore为记录,txt_life为生命,txt_score为得分,如图3-16所示。 图3-16 游戏文字的名字 创建脚本GameManager.cs,将其指定给游戏体GameManager。 using UnityEngine; using System.Collections; public class GameManager : MonoBehaviour { public static GameManager Instance = null; // 游戏得分 int m_score = 0; // 游戏最高得分 static int m_hiscore = 0; // 弹药数量 int m_ammo = 100; // 游戏主角 Player m_player; // UI文字 GUIText txt_ammo; GUIText txt_hiscore; GUIText txt_life; GUIText txt_score; // Use this for initialization void Start () { Instance = this; // 获得主角 m_player = GameObject.FindGameObjectWithTag("Player").GetComponent<Player>(); // 获得设置的UI文字 txt_ammo = this.transform.FindChild("txt_ammo").GetComponent<GUIText>(); txt_hiscore = this.transform.FindChild("txt_hiscore").GetComponent<GUIText>(); txt_life = this.transform.FindChild("txt_life").GetComponent<GUIText>(); txt_score = this.transform.FindChild("txt_score").GetComponent<GUIText>(); } } 这里的代码主要是通过FindChild函数获得文字UI组件。 添加函数,用于更新 UI界面信息。 // 更新分数 public void SetScore(int score) { m_score+= score; if (m_score > m_hiscore) m_hiscore = m_score; txt_score.text = "Score "+m_score; 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(); } 如果主角的生命为零,则游戏失败。这里用OnGUI提供一个简单的按钮重新开始游戏,添加代码如下: void OnGUI() { if (m_player.m_life <= 0) { // 居中显示文字 GUI.skin.label.alignment = TextAnchor.MiddleCenter; // 改变文字大小 GUI.skin.label.fontSize = 40; // 显示Game Over GUI.Label(new Rect(0, 0, Screen.width, Screen.height), "Game Over"); // 显示重新游戏按钮 GUI.skin.label.fontSize = 30; if ( GUI.Button( new Rect( Screen.width*0.5f-150,Screen.height*0.75f, 300,40),"Try again")) { Application.LoadLevel(Application.loadedLevelName); } } }