【Unity3d】使用GUI绘制人物头顶血条和名称

本文介绍了一种在Unity中使用GUI绘制玩家头顶血量和名字的方法,通过计算世界坐标转换为屏幕坐标,利用GUI.DrawTexture和GUI.Label绘制血条和玩家名字,详细展示了代码逻辑和实现步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

背景:最近自己在学习写小游戏的时候想要在玩家头顶显示玩家当前血量和名字遇到了此问题,在此攻略一下。
攻略:谷歌了一下,人物头顶和名称的显示大致上分为两种方法:使用UI组件设置和使用GUI绘制,我采用的方式是后者,在此之前尝试过前面的方法,但是总是出一些问题,这里讨论使用GUI绘制,使用组件设置稍后再去研究。

使用GUI绘制重在代码逻辑,这里贴出我的代码

    private Camera Miancamera;
    private string playerName;
    public GameObject player;
    private float height;

    public Texture2D hpForeground;//血条的前景贴图
    public Texture2D hpBackground;//血条的背景贴图
    private int HP;
    private int offset = 30;//位置偏移,计算位置时可能出现有一些误差,偏移消除这些误差

    public Font fort;//显示名字的文字字体样式

    private void Start()
    {
        Miancamera = Camera.main;
        float size_y = player.GetComponent<Collider>().bounds.size.y;//获取游戏对象原始模型的高度值
        float scal_y = transform.localScale.y;//获取游戏对象当前缩放比例
        height = size_y * scal_y;//原始模型高度 * 当前缩放比例 = 模型当前高度
    }

    private void OnGUI()
    {
        //计算绘制血条和名称所在的世界坐标,此坐标就是玩家的世界坐标
        Vector3 worldPosition = new Vector3(transform.position.x, transform.position.y + height, transform.position.z);
        //血条和名称所在世界坐标转换成屏幕坐标
        Vector2 position = Miancamera.WorldToScreenPoint(worldPosition);
        //计算绘制血条和名称坐在的屏幕坐标,由于屏幕坐标屏幕在右下角是(0,0)点,左上角是(Screen.Width,Screen.Height)所以使用减法
        position = new Vector2(position.x, Screen.height - position.y);

        //计算绘制血条的大小,大小有hpForeground确定,[GUI.skin.lable]-GUIStyle
        Vector2 hpSize = GUI.skin.label.CalcSize(new GUIContent(hpForeground));
        //计算绘制血条的宽度,这样就可以实现扣血时,血条宽度的变化
        int hpWidth = hpForeground.width * HP / 200;
        //绘制血条
        GUI.DrawTexture(new Rect(position.x - hpSize.x / 2, position.y - hpSize.y - offset, hpSize.x, hpSize.y), hpBackground);
        GUI.DrawTexture(new Rect(position.x - hpSize.x / 2 , position.y - hpSize.y - offset, hpWidth, hpSize.y), hpForeground);

        //计算绘制名称的大小,以确定绘制名称的位置
        Vector2 nameSize = GUI.skin.label.CalcSize(new GUIContent(playerName));
        GUI.color = Color.black;
        //设置字体样式
        GUI.skin.label.font = fort;
        //绘制名称
        GUI.Label(new Rect(position.x - (nameSize.x / 2), position.y - nameSize.y - hpSize.y - offset, nameSize.x, nameSize.y), playerName);
    }

最终的显示效果:
在这里插入图片描述
参考博文:
http://www.xuanyusong.com/archives/1032

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值