步骤:1.在NGUI中制作血条和名字
2.达到血条在角色头顶上方显示的效果
3.在场景开始时,由角色创建自己的血条
实现:1.创建一个在容纳血条的父物体(创建这个因为一个场景中往往有很多角色拥有血条,这样做是方便管理)
在UI中创建一个容器(NGUI->Create->Widget),然后在Container下创建一个空物体命名为RoleHeadBarRoot
2.制作血条
创建一个空物体,重命名为RoleHeadBar,再在RoleHeadBar下创建一个UILabel,用于显示角色昵称
再创建血条,打开NGUI的Widget Tools(NGUI->Open->Widget Wizard),选择创建类型为Progress Bar,选择血条的背景以及血条的物品,确认父物体为RoleHeadBar之后创建
修改血条颜色,背景透明度,以及血条位置之后的效果
步骤二:血条显示的核心代码
第一行:如果角色,主相机,UI相机有一个为空,血条就无法显示,直接返回;
第二行:m_Target.position为角色头顶的位置,即将血条要显示的位置转换成相机中的观看的位置,第三个方向z用于表示目标点与相机之间的距离
第三行:因为血条是属于UI层级,主摄像机无法观察到,所以需要将视口坐标转化成UI摄像机能看到的世界坐标。
主代码如下,初始化函数,用于角色创建血条时调用。上弹伤害文字需要用到HUDText插件,比较简单,在RoleHeadBar下添加HUDText脚本,就可以使用,有兴趣的小伙伴可以自行了解下,这里不详细解释
using UnityEngine;
using System.Collections;
public class RoleHeadBarCtrl : MonoBehaviour
{
/// <summary>
/// 昵称
/// </summary>
[SerializeField]
private UILabel lblNickName;
/// <summary>
/// 飘血显示
/// </summary>
[SerializeField]
private HUDText hudText;
/// <summary>
/// 血条
/// </summary>
[SerializeField]
private UISlider pbHP;
/// <summary>
/// 对齐的目标点
/// </summary>
private Transform m_Target;
void Update()
{
if (Camera.main == null || UICamera.mainCamera == null || m_Target==null) return;
//世界坐标点转换成视口坐标
Vector3 pos = Camera.main.WorldToViewportPoint(m_Target.position);
//转换成UI摄像机的世界坐标
Vector3 uiPos = UICamera.mainCamera.ViewportToWorldPoint(pos);
gameObject.transform.position = uiPos;
}
/// <summary>
/// 角色顶部条初始化
/// </summary>
/// <param name="target"></param>
/// <param name="nickName"></param>
/// <param name="isShowHPBar">是否显示血条</param>
public void Init(Transform target,string nickName,bool isShowHPBar=false)
{
m_Target = target;
lblNickName.text = nickName;
//只有小怪显示血条 主角不显示
NGUITools.SetActive(pbHP.gameObject, isShowHPBar);
}
/// <summary>
/// 上弹伤害文字
/// </summary>
/// <param name="hurtValue"></param>
public void Hurt(int hurtValue,float pbHPValue)
{
hudText.Add(string.Format("-{0}", hurtValue), Color.red, 0.1f);
pbHP.value = pbHPValue;
//Debug.Log("MonsterHP" + pbHP.value);
}
}
步骤三:角色创建自己的血条
1.将血条添加到Resources文件夹下作为预制体。
2.添加RoleHeadBarRoot一个脚本,并定义为单例,方便角色找到血条的父物体
public class RoleHeadBarRoot : MonoBehaviour
{
public static RoleHeadBarRoot Instance;
void Awake()
{
Instance = this;
}
}
3.在角色脚本中初始化血条
/// <summary>
/// 初始化头顶条
/// </summary>
private void InitHeadBar()
{
if (RoleHeadBarRoot.Instance == null) return;
if (CurrRoleInfo == null) return;
if (m_HeadBarPos == null) return;
//克隆预设
m_HeadBar = Resources.Load("RoleHeadBar");
m_HeadBar.transform.parent = RoleHeadBarRoot.Instance.transform;
m_HeadBar.transform.localScale = Vector3.one;
roleHeadBarCtrl = m_HeadBar.GetComponent<RoleHeadBarCtrl>();
//给预设赋值 判断当前角色是否为主角 为主角不现实血条 怪物显示血条
roleHeadBarCtrl.Init(m_HeadBarPos, CurrRoleInfo.NickName, isShowHPBar: (CurrRoleType == RoleType.MainPlayer ? false : true));
}