利用水平滚动条HorizontalScrollbar
,通过设置滚动条的内部标记条的长度来表示血条剩余量。
static function HorizontalScrollbar (position : Rect, value : float, size : float, leftValue : float, rightValue : float, style : GUIStyle) : float
参数:
所以通过设置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的平均值。
因此,在刷新方法(如Update
、onGUI
等等)内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的Slider组件
,直接添加到Canvas视图,使用2D模式编辑,删去Handle Slide Area
(内部标记块),将Fill Area
的Left和Right
都设置为0(使得可以进度条可以被填满)。
为了使游戏对象(也就是血条,因为血条是游戏对象的子元素)任何时候需要面对主摄像机,可以使用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);
}
}
视频地址:地址
实现与脚本直接相关,便于进行全方位的控制和操作,包括但不限于一些常规的UI组件功能,比较利于工程师对呈现效果的严格把控。
但是,也是由于直接与脚本相关,所以对定位(位置)、样式的设置往往不能直接得到呈现效果,而是需要等待脚本运行才能具体体现,同时也可能出现相互影响的状况,而这可能需要反复调试,这将大大延长项目交付时间。
实现比较方便,直接添加到视图中即可,但是因为是内置的方法,所以只提供有限的方法和使用方式,另外必须要去了解其内部的实现原理,与便于可以熟练合理的使用这些UI组件,而不引发一些意外的BUG,例如之前如何使血条填满fillArea。
将含有脚本的游戏对象(IMGUI)制作成预制,当需要使用血条时,将该游戏对象加入到对应游戏对象的子对象中;
将含有已制作完成的Slider的Canvas(UGUI)制作成预制,当需要使用血条时,将Canvas作为子对象加入到对应游戏对象。