在Unity中,使用UI可以实时反映游戏角色的血量。本文提供一种实现方式,主要使用了C#语言中的事件。
实现的效果(敌人碰到角色之后角色血量减少并反映在UI上)
可以看下面的GIF展示效果
实现的效果:当红色胶囊体(敌人)撞击到玩家角色时,画面右上角的血条减少了一部分,代表了血量的减少。PS:撞击之后人物后退并不是被撞的,而是操纵产生的
实现步骤:
UI的创建
在Unity界面添加画布,画布中添加一个图片,我这里是一个爱心代表血量,然后再添加一个滑块,滑块命名为HpSlider,具体的UI创建这里就不详细介绍了,可以参考其他创建UI的文章。创建好的UI画布如下图所示:(注意红框处的设置,我这里人物最大血量为5,所以Max Value我设置的就为5)
C#脚本的编写
GameBehavior脚本的编写
首先创建一个空的游戏对象Game Manager,再在其上挂载一个GameBehavior脚本,该脚本主要用来管理游戏中游戏对象的属性,脚本内容如下所示:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;
using UnityEngine.UI;
//声明了一个委托
public delegate void HpChanged(int newValue);
public class GameBehavior : MonoBehavior
{
//利用该委托声明了一个事件
public static event HpChanged OnHpChanged;
private int _playerHP = 5;
public int HP
{
get { return _playerHP; }
set
{
_playerHP = value;
if(OnHpChanged != null)
{
//回调OnHpChanged所订阅的具体方法
OnHpChanged(_playerHP);
}
}
}
}
该脚本中主要定义了一个事件,在接下来的脚本中将订阅该事件,该事件主要与_playerHP这一属性绑定。对角色HP属性这样写法可以参考我上一篇博文。
UIBehavior脚本的编写
首先创建一个空的游戏对象UIManager,再在其上挂载一个UIBehaviorr脚本,该脚本主要用来管理游戏中的UI部分,内容如下:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class UIBehavior : MonoBehaviour
{
//创建一个滑块
public Slider HpSlider;
public GameBehavior gameBehavior;
private void Start()
{
gameBehavior = GameObject.Find("Game Manager").GetComponent<GameBehavior>();
//订阅GamenBehavior脚本中的事件,事件处理器为UpdateHpSliderValue方法
GameBehavior.OnHpChanged += UpdateHpSliderValue;
//将滑块的值初始化为血量的最大值
HpSlider.value = HpSlider.maxValue;
}
private void UpdateHpSliderValue(int newValue)
{
//更新滑块的值
HpSlider.value=newValue;
}
}
该脚本主要负责将事件的拥有者GameBehavior类的事件OnHpChanged与事件的订阅者UIBehavior联系起来,UIBehavior的事件处理器为UpdateHpSliderValue方法,该方法用来改变UI中HpSlider的值。因为角色一开始的血量为满,所以不要忘了将滑块的值初始化为最大值。
PlayerBehavior的编写
最后是PlayerBehavior的编写,游戏角色的行为改变血量值,PlayerBehavior的编写如下:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PlayerBehavior : MonoBehaviour
{
private GameBehavior _gameManager;
private void Start()
{
_gameManager = GameObject.Find("Game Manager").GetComponent<GameBehavior>();
}
//游戏角色的行为会影响血量
private void OnCollision(Collision collision)
{
if(collision.gameObject.name == "Enemy")
{
_gameManager.HP -= 1;
}
}
}
代码的主要逻辑就是编写角色的哪些行为会影响血量,通过_gameManager来在GameBehavior中进行反馈。本代码中的逻辑是当敌人碰撞到了角色,角色掉血,利用的是触发器,当然读者可以有自己的逻辑。
脚本中变量的挂载
最后一步将PlayerBehavior脚本挂载到Player上,此外还需要将开头创建的画布中的滑块HpSlider挂载到UIBehavior中的HpSlider上,如下图所示:
总结
本文主要利用的是C#中的事件来在Unity的UI上实时反馈游戏角色的血量变化,希望对大家有所帮助,如有错误欢迎指正!