using UnityEngine;
public class LookAtCamera : MonoBehaviour {
void Update () {
this.transform.LookAt (Camera.main.transform.position);
}
}
using UnityEngine;
using System.Collections;
using UnityEngine.UI;
public class Health : MonoBehaviour
{
public Slider mainSlider;
public float HP;
private void Start()
{
mainSlider = GetComponent<Slider>();
HP = mainSlider.maxValue;
}
void OnGUI()
{
if (GUI.Button(new Rect(10, 10, 100, 40), "Increase HP"))
HP += 10;
if (GUI.Button(new Rect(10, 70, 100, 40), "Decrease HP"))
HP -= 10;
if (HP > 100)
HP = 100;
if (HP < 0)
HP = 0;
mainSlider.value = HP;
}
}
为了更好的体现效果,我们将Slider的背景颜色打开,设成白色,这样模拟了游戏中空血条的样子。
最终,我们的界面如下所示,有两个按钮以及一个人物,可以通过键盘上面的上下左右按键来控制移动,血条也会跟随人物的移动而移动:
当我们按下减少血量的按钮时,模拟人物受到了攻击,此时血量减少,白色部分是减少的血量,红色是剩余的血量:
要将血条设置成预制,我们只需要将Canvas对象拖入Perfabs文件夹,即可生成预制。
脚本主要还是生成了两个按钮和一个血条,能够通过按钮来控制血量的增减:
using UnityEngine;
public class BloodBar : MonoBehaviour
{
public float health = 0.0f;
private float resultHealth;
private Rect HealthBar;
void Start()
{
HealthBar = new Rect(200, 40, 200, 20);
resultHealth = health;
}
void OnGUI()
{
if (GUI.Button(new Rect(10, 10, 100, 40), "Increase HP"))
resultHealth = resultHealth + 0.1f;
if (GUI.Button(new Rect(10, 70, 100, 40), "Decrease HP"))
resultHealth = resultHealth - 0.1f;
if (resultHealth > 1.0f)
resultHealth = 1.0f;
if (resultHealth < 0.0f)
resultHealth = 0.0f;
// make health bar change smoothly
health = Mathf.Lerp(health, resultHealth, 0.05f);
// show health
GUI.HorizontalScrollbar(HealthBar, 0.0f, health, 0.0f, 1.0f);
}
}
制作好的血条效果如下所示,比起之前的UGUI,我们让血条的变化更加平滑:
要将血条设置成预制,我们只需要将这个空对象拖入Perfabs文件夹,即可生成预制。
IMGUI(Immediate Mode GUI)及时模式图形界面。它是代码驱动的 UI 系统,没有图形化设计界面,只能在 OnGUI 阶段用 GUI 系列的类绘制各种 UI 元素,因此 UI元素只能浮在游戏界面之上。
其优点在于:
从血条的预制设计上来看,对比与UGUI,其实现非常简单,只需利用代码设计位置,然后将脚本拖拽到某个空对象上,整个界面就完成了。
但是我们也可以看出,这种编程模式的效果并没有UGUI好。UGUI的血条更加生动、形象、IMGUI显得比较落后,并且UGUI的血条能够随着人物的移动而移动,是游戏中常常实现的方式。
按照官方说法,其主要用于以下场景:
Unity GUI / UGUI 是面向对象的 UI 系统。所有 UI 元素都是游戏对象,友好的图形化设计界面, 可在场景渲染阶段渲染这些 UI 元素。优点主要有:
在血条的预设中,虽然UGUI的设计步骤相比与IMGUI要更加的复杂化,但是其效果非常好,在设计过程中也体现了面向对象的设计方法。