前言
游戏中的头顶血条是一种常见的小功能,一般游戏会要求做2D的头顶血条,这是因为这样能保证UI的大小不变,图片和文字不会产生变形引起的其他效果;反过来,3D的头顶血条会由于透视的原因会有近大远小的效果,看起来会更真实。
实现
资源的制作上,2D血条与3D血条都一样,需要注意的是,实现3D血条时需要将场景camera的CullingMask选中血条所在的图层即可,同时将UI camera的cullingMask血条所在的图层去掉,不然会同时出现两个血条。这里的制作血条的图层名称为HeadBlood.
源代码
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class HeadBlood : MonoBehaviour
{
public Camera mainCamera;
public Camera uiCamera;
public GameObject headBlood;
void Update ()
{
//3d head blood
Transform bloodPos = headBlood.transform; //血条位置
Vector3 targetPos = gameObject.transform.position; //capsule的位置
bloodPos.position = targetPos;
bloodPos.localPosition = new Vector3(bloodPos.localPosition.x, bloodPos.localPosition.y + 600f, bloodPos.localPosition.z); //600f用来调整高度
bloodPos.transform.forward = mainCamera.transform.forward; //使血条朝向摄像机
//2d head blood
//Transform bloodPos = headBlood.transform;
//Vector3 targetPos = gameObject.transform.position;
//targetPos.y += 2f; //+2f用于调整高度
//targetPos = mainCamera.WorldToScreenPoint(targetPos); //主摄像机 从世界坐标转到屏幕坐标
//if (targetPos.z < 0) //忽略在摄像机后面
//{
// return;
//}
//targetPos.z = 0;
//targetPos = uiCamera.ScreenToWorldPoint(targetPos); , //UI摄像机 从屏幕坐标转到世界坐标
//bloodPos.position = new Vector3(targetPos.x, targetPos.y, 0f);
}
}
坐标转换规则,可以参见: Unity 与 NGUI 坐标转换原理
2D血条:
可以看到血条的尺寸没有变化
3D血条: