Unity3D——血条制作

文章目录

      • 游戏要求
        • 使用IMGUI实现血条
        • 使用UGUI实现血条
        • 两种实现的优缺点
            • IMGUI实现
            • UGUI实现
        • 预制的使用方法

游戏要求

  • 分别使用 IMGUI 和 UGUI 实现
  • 使用 UGUI,血条是游戏对象的一个子元素,任何时候需要面对主摄像机
  • 分析两种实现的优缺点
  • 给出预制的使用方法

使用IMGUI实现血条

利用水平滚动条HorizontalScrollbar,通过设置滚动条的内部标记条的长度来表示血条剩余量。

static function HorizontalScrollbar (position : Rect, value : float, size : float, leftValue : float, rightValue : float, style : GUIStyle) : float

参数:

  • position:表示整个滚动条Bar的大小(包含基点和长宽)。
  • size:表示滚动条内部标记条的长度。
  • value:表示滚动条内部标记条的初始位置,应该是在leftValue和rightValue之间的一个值。
  • leftValue:表示滚动条最左边的值(横向坐标)。
  • rightValue:表示滚动条最右边的值(横向坐标)。
  • style:滚动条背景的样式,如果不设置,水平滚动条样式应用当前的GUISkin皮肤。

所以通过设置size我们即可达到如同血条增减的效果。

为了实现渐变的效果,可以通过插值static function Lerp (from : float, to : float, t : float) : float。基于浮点数t返回a到b之间的插值,t限制在0~1之间。例如,当t = 0返回from,当t = 1 返回to。当t = 0.5 返回from和to的平均值。

因此,在刷新方法(如UpdateonGUI等等)内value = Mathf.Lerp(value, temp, 0.01f);就可以让value的值以0.01的速度逐渐逼近temp的值,表现出来就是,血条将逐渐变慢的增长至temp的值。

所以通过设置temp的值可以合适的改变value(血量),进而改变血量。

代码内容

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

public class NewBehaviourScript : MonoBehaviour
{
    public float value;

    private float temp;

    void Start()
    {
        value = 0.0f;
        temp = 0.0f;
    }

    void OnGUI()
    {
        if (GUI.Button(new Rect(250, 20, 40, 20), "+"))
        {
            if(temp<10)
                temp++;
        }

        if (GUI.Button(new Rect(300, 20, 40, 20), "-"))
        {
            if(temp>0)
                temp--;
        }

        value = Mathf.Lerp(value, temp, 0.01f);

        GUI.color = Color.red;
        GUI.HorizontalScrollbar(new Rect(20, 20, 200, 20), 0.0f, value, 0.0f, 10.0f);
    }
}

视频地址:地址

使用UGUI实现血条

利用UGUI的Slider组件,直接添加到Canvas视图,使用2D模式编辑,删去Handle Slide Area(内部标记块),将Fill AreaLeft和Right都设置为0(使得可以进度条可以被填满)。

创建一个游戏对象,将UI组件Slider加入作为子元素。
Unity3D——血条制作_第1张图片

为了使游戏对象(也就是血条,因为血条是游戏对象的子元素)任何时候需要面对主摄像机,可以使用LookAt函数,function LookAt (target : Transform, worldUp : Vector3 = Vector3.up) : void,旋转物体,这样向前向量指向target的当前位置。简单说,旋转物体使z轴指向目标物体。

当该物体设置了LookAt并指定了目标物体时,该物体的z轴将始终指向目标物体,在设置了worldUp轴向时,该物体在更接近指定的轴向是旋转便的灵活,注意worldUp指的是世界空间。

所以将目标游戏对象设置为包含Slider的游戏对象,脚本添加到Main Camera上,外部为脚本设置目标游戏对象,即可。

代码如下

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

public class NewBehaviourScript1 : MonoBehaviour
{
    public GameObject game_object;

    // Start is called before the first frame update
    void Start()
    {
        
    }

    // Update is called once per frame
    void Update()
    {
       transform.LookAt(game_object.transform);
    }
}

视频地址:地址

两种实现的优缺点

IMGUI实现

实现与脚本直接相关,便于进行全方位的控制和操作,包括但不限于一些常规的UI组件功能,比较利于工程师对呈现效果的严格把控。

但是,也是由于直接与脚本相关,所以对定位(位置)、样式的设置往往不能直接得到呈现效果,而是需要等待脚本运行才能具体体现,同时也可能出现相互影响的状况,而这可能需要反复调试,这将大大延长项目交付时间。

UGUI实现

实现比较方便,直接添加到视图中即可,但是因为是内置的方法,所以只提供有限的方法和使用方式,另外必须要去了解其内部的实现原理,与便于可以熟练合理的使用这些UI组件,而不引发一些意外的BUG,例如之前如何使血条填满fillArea。

预制的使用方法

将含有脚本的游戏对象(IMGUI)制作成预制,当需要使用血条时,将该游戏对象加入到对应游戏对象的子对象中;

将含有已制作完成的Slider的Canvas(UGUI)制作成预制,当需要使用血条时,将Canvas作为子对象加入到对应游戏对象。

你可能感兴趣的:(Unity3D——血条制作)