RPG游戏《黑暗之光》流程介绍与代码分析之(十):主角状态信息界面与小地图的实现

第十章:主角状态信息界面与小地图

主角状态信息与小地图功能是交互中经常要用到的部分,通过状态信息面板可以方便查看当前角色的等级、名称、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减少,地图视野减小
    }

}
即可实现小地图的缩放功能。

猜你喜欢

转载自blog.csdn.net/s1314_jhc/article/details/80118360
今日推荐