其他分享
首页 > 其他分享> > 3Dgame_homework9

3Dgame_homework9

作者:互联网

3D游戏 作业9

血条(Health Bar)的预制设计

要求

相关理论

Unity UI

UI 即 User Interface(用户界面)的简称,在许多软件中狭义地指 窗体、面板、按钮、文本框等人们熟悉的人机交互元素其组织与风格(也称皮肤),而 Unity UI 系统采用的就是上述的狭义概念。

Unity 目前支持三套完全不同风格的 UI 系统:

IMGUI

IMGUI 的存在符合游戏编程的传统,即使在今天它依然没有被官方宣判为遗留(将要淘汰的)系统(Legacy Systems)。在修改模型,渲染模型这样的经典游戏循环编程模式中,在渲染阶段之后,绘制 UI 界面无可挑剔(参考 Execution Order of Event Functions)。这样的编程即避免了 UI 元素保持在屏幕最前端,又有最佳的执行效率,一切控制掌握在程序员手中,这对早期计算和存储资源贫乏的游戏设备来说,更是弥足珍贵。当然,早年 UI 交互手段就是绘制图片和文本,检测输入事件等基本任务。

按 Unity 官方说法,IMGUI 主要用于以下场景:

如果不做复杂的界面,IMGUI 简单易用的代码是程序员喜欢的,对于新手 UI 入门容易,可以帮助新手理解引擎的游戏循环;对于高级程序员可以创建在线调试环境;对于工具开发者定义了 Unity 新的编程工具。

IMGUI 系统通常不打算用于玩家可能使用并与之交互的普通游戏内用户界面,因此可以选择使用 Unity 的基于 GameObject 的 UGUI 系统

UGUI

现代游戏 UI 满足:

传统代码驱动的 UI 有着开发效率低下,难以调试等问题。而 UGUI 的优势有:

UGUI 的基础使用

参考:UI 系统

画布 是绘图区域,是 UI 元素的容器,UI 元素及其子 UI 元素都将绘制在其上。画布区域在场景视图中显示为矩形。UI 元素采用像素单位表示位置和尺寸。

画布中的UI元素按照它们在层次结构中出现的顺序绘制。如果两个UI元素重叠,后面的元素将出现在较早的元素之上,最后一个孩子显示在最上面。

渲染模式 设置可用于使其在屏幕空间或世界空间中渲染。将 UI 元素放置在场景顶部渲染的屏幕,画布会自动更改大小匹配屏幕(Canvas 默认中心点为屏幕中心)。

UI 布局基础:每个UI元素都被表示为一个矩形,为了相对于 Canvas 和 其他 UI 元素实现定位,Unity 在 Transform 基础上定义了 RectTransform (矩形变换) 支持矩形元素在 2/3D 场景中变换。
矩形工具

矩形工具:有移动、旋转、比例、矩形四个工具。在选择矩形工具时,设置为“旋转”和“局部”视图,通常便于操作。

矩形变换:像常规变换一样具有位置,旋转和比例,也具有宽度和高度表示矩形的尺寸。

UI 组件与元素

UI 部件都是用 Script 开发的自定义组件。包括在 UI、Layout 和 Rendering 等分类中。

1、可视化组件

2、UI 交互元素:

是 GameObject,它拥有 UI 交互组件、UI可视化组件、及相关组件的组合,以及一些 UI 子元素构成,以便于用户在设计场景中创建交互界面。

详细信息参见官方:UI 元素

圆形遮罩、动画、富文本、血条

都是菜单制作,初步理解 Text,Image,RowImage,Mask 等的基本使用技巧。

圆形遮罩:

参考:使用透明度实现 Mask 遮罩的 Unity Shader

动画:

动画与按钮的集成,参见官方: 动画集成

富文本:

为了显示格式复杂的文字,Unity 提供了类似 HTML 的标签,控制字体、字号、颜色。

详细参见官方:Rich Text

血条:

参考资源:Faking World Space for monster health bars in Unity

实现过程

IMGUI 实现

将水平滚动条的宽度作为血量来显示,设置了变量 Healthval,并利用Math.Lerp插值计算血量,使血条值变化平缓。

代码:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class healthBar: MonoBehaviour
{
    // 血量
    public float healthval = 0.0f;
    // 用来调整血条的临时变量
    private float temp;
    private Rect barpos;//血条的位置
    private Rect addpos;//加血按钮的位置
    private Rect minuspos;//减血按钮的位置
    void Start()
    {
        barpos = new Rect(30, 0, 140, 80);
        addpos = new Rect(55, 15, 45, 15);
        minuspos = new Rect(100, 15, 45, 15);
        temp = healthval;
    }
    void OnGUI()
    {
        if (GUI.Button(addpos, "+"))
        {
            temp = temp + 0.1f > 1.0f ? 1.0f : temp + 0.1f;
        }
        if (GUI.Button(minuspos, "-"))
        {
            temp = temp - 0.1f < 0.0f ? 0.0f : temp - 0.1f;
        }
        //插值计算
        healthval = Mathf.Lerp(healthval, temp, 0.05f);
        // 显示血条
        GUI.HorizontalScrollbar(barpos, 0.0f, healthval, 0.0f, 1.0f);
    }
}

将该脚本挂载到空对象上,运行即显示血条与加血减血按钮。


可以通过更改变量 Healthval(0~1)来改变初始血量的比例,比如在 Healthval = 0.5 时:


将挂载脚本的空对象拖入下方的project窗口,生成预制。

UGUI实现

下载并import unity提供的standard assets中的characters。将第三人称的预制拖入场景,命名为Ethan,Position设为(0,0,0),Rotation设为(0,180,0)。

新建一个Plane,Position设为(0,0,0)。

main camera的position设置为(0,1,-10)。

在Ethan上右击添加画布,在画布上右击添加slider作为血条。
设置画布的render mode为world space。更改rect transfom和scale

禁掉slider的handle slider area和background

把fill area里fill的image改成绿色。

设置slider组件的value。

运行,发现虽然此时血条会随着Ethan移动,但人物转向血条也会反转,所以给画布添加一个脚本,让它能一直朝向照相机。

实现结果

优缺点

IMGUI:
IMGUI更符合编程习惯,在渲染阶段之后,绘制UI效果更好,效率更高。缺点是调试起来更困难,不支持可视化开发,无法在UI上添加3D模型的效果。

UGUI:
UGUI相比IMGUI在功能上还不够成熟,但官方在不断开发中,有取代NGUI的趋势。更适合没有编程基础的人在游戏制作过程中操作UI,降低了门槛。UGUI的锚点很方便适应屏幕。
缺点是对象过多时需要很多画布,不够灵活。

预制的使用方法

IMGUI血条直接将healthBar预制体拖入场景,点击±按钮可以修改血量。
UGUI血条先按照上述操作导入Ethan,生成场景,再将Canvas预制体拖入Ethan对象成为子对象。

标签:IMGUI,血条,元素,Unity,homework9,UI,3Dgame,UGUI
来源: https://blog.csdn.net/weixin_45683170/article/details/110794317