第十章:主角状态信息界面与小地图
主角状态信息与小地图功能是交互中经常要用到的部分,通过状态信息面板可以方便查看当前角色的等级、名称、HP和MP。小地图可以提供当前的地图信息,并显示重要的人物标识,如下图所示。
本篇博客重点实现上述两种功能,难度不大。
10.1主角状态信息面板
主角状态信息显示在游戏界面的左上角,方便玩家查看。
10.1.1 角色头像框
用Camera正对主角的脸,将获取的Camera信息做成UI显示在左上角,步骤如下。
新建一个Camera,命名为FaceCamera并拖放到Magician下,将Magician的Layer设置为Player(新增),将FaceCamera的Culling Mask设置为只有Player。
之后将Camera对准主角,可以用Align with view辅助对齐
新建一个文件夹存放所有的Texture,新建一个Render Texture,并拖放到FaceCamera之中。
在UI root中,创建一个Simple Texture,命名为FaceTexture,我们在Texture文件夹中创建一个Material,将Mask Texture和Main Texture(即FaceTexture)导入,其中Mask为遮蔽物,其作用是改变Texture显示的形状。
至此我们得到了一个Material,拖放到FaceTexture中的Material即可,效果如下左图所示。
考虑到显示效果,我们对头像栏添加一个边框,在FaceTexture中,新建一个Child Sprite,命名为Frame,用于存储边框,导入边框素材,如上右图所示
10.1.2 HP、MP等状态信息
本小节实现名称、等级、HP的MP的显示功能。
在FaceTexture中新建一个Child Label,存储名字等信息,并添加2个Colored Progress Bar表示血条和蓝条,改变一些Sprite外观即可,不多做赘述。
最后添加Anchor以保证头像框永远显示在左上角,设置Anchor的Side为TopLeft即可,结果如下所示。
之后我们需要提供一个接口以更改等级、名字、HP和MP的显示(通过访问PlayerStatus实现交互)。
在FaceTexture中新建一个脚本,命名为FaceUI,代码如下
using UnityEngine; using System.Collections; public class FaceUI : MonoBehaviour { public static FaceUI _instance; private UILabel nameLabel; private UISlider HPSlider; //两个进度条的类型是UISlider private UISlider MPSlider; private UILabel HPLabel; private UILabel MPLabel; private PlayerStatus ps; void Awake() { _instance = this; nameLabel = transform.Find ("Name").GetComponent<UILabel> (); HPSlider = transform.Find ("HP").GetComponent<UISlider> (); MPSlider = transform.Find ("MP").GetComponent<UISlider> (); HPLabel = transform.Find ("HP/Thumb/Label").GetComponent<UILabel> (); MPLabel = transform.Find ("MP/Thumb/Label").GetComponent<UILabel> (); } void Start() { ps = GameObject.FindGameObjectWithTag (Tags.player).GetComponent<PlayerStatus> (); //通过Tag找到PlayerStatus SetFaceProperty (); } public void SetFaceProperty() //访问PlayerStatus,改变头像框的效果 { nameLabel.text = "Lv." + ps.level + " " + ps.name; HPSlider.value = ps.hp_remain / ps.hp; MPSlider.value = ps.mp_remain / ps.mp; HPLabel.text = ps.hp_remain + "/" + ps.hp; MPLabel.text = ps.mp_remain + "/" + ps.mp; } }
最终的显示效果如下
10.2 小地图功能
小地图作为提示玩家信息的功能界面,主要功能包括放大或缩小显示当前地图的情景,并在小地图上显示NPC等提示信息。
与上节类似,我们依旧使用一个Camera获取地图信息,调整好合适的角度,使Camera覆盖到当前地图所需的区域。操作方法与1.1节类似,故不做赘述,最终结果如下
10.2.1 NPC的特殊标识
为了在地图上较容易地辨别出NPC的标识,我们为NPC新建一个layer,命名为NPC,方便之后与小图标进行区分。并为任务和药品NPC创建一个Child Quad,将小图标导入,如下图所示,并为小图标添加单独的layer,命名为MiniMap
改变MapCamera和Main Camera的Culling Mask,以达到显示不同layer的效果,对于小地图,不显示NPC,因此勾选layer中的MiniMap,去掉NPC,如下图所示
10.2.2 小地图的缩放功能
本节为小地图创建放大和缩小的功能,便于调节。为UI root下的MapFrame添加两个Child Sprite,用于存储放大和缩小按钮,如下图所示。
为MapFrame添加一个Map脚本,提供两个函数接口OnPlusButton和OnMinusButton给提供给地图的两个缩放按钮。为了在脚本中达到访问MiniMap的目的,我们为其添加一个单独的Tag创建,命名为MiniMap,并在Map脚本中添加
using UnityEngine; using System.Collections; public class Map : MonoBehaviour { private Camera mapCamera; void Awake() { mapCamera = GameObject.FindGameObjectWithTag (Tags.miniMap).camera; //通过指定Tag得到GameObject并访问Camera } public void OnPlusButton() { mapCamera.orthographicSize++; //size增加,地图视野变大 } public void OnMinusButton() { mapCamera.orthographicSize--; //size减少,地图视野减小 } }
即可实现小地图的缩放功能。