血条(Health Bar)的预制设计。具体要求如下
1. 分别使用 IMGUI 和 UGUI 实现
2. 使用 UGUI,血条是游戏对象的一个子元素,任何时候需要面对主摄像机
3. 分析两种实现的优缺点
4. 给出预制的使用方法
IMGUI实现
将下面脚本挂载在游戏对象上即可。
public class IMGUI : MonoBehaviour {
public float healthPanelOffset = 2f;
private void OnGUI()
{
Vector3 worldPos = new Vector3(transform.position.x, transform.position.y, transform.position.z);
Vector2 screenPos = Camera.main.WorldToScreenPoint(worldPos);
Rect rect = new Rect(screenPos.x -50,screenPos.y,100,100);
GUI.HorizontalScrollbar(rect, 0, 75, 0, 100);
}
}
UGUI实现
在预期实现血条的游戏对象上添加Canvas画布子对象,在Canvas上添加Slider滑条作为血条子对象,将下面脚本挂载在游戏对象上。
public class UIScript : MonoBehaviour {
public Canvas canvas;
public GameObject healthPrefab;
public float healthPanelOffset = 2f;
public GameObject healthPanel;
private Slider healthSlider;
// Use this for initialization
void Start () {
healthPanel = Instantiate(healthPrefab) as GameObject;
healthPanel.transform.SetParent(canvas.transform, false);
healthSlider = healthPanel.GetComponentInChildren<Slider>();
Vector3 worldPos = new Vector3(transform.position.x, transform.position.y + healthPanelOffset, transform.position.z);
Vector3 screenPos = Camera.main.WorldToScreenPoint(worldPos);
healthPanel.transform.position = new Vector3(screenPos.x, screenPos.y, screenPos.z);
}
// Update is called once per frame
void Update () {
Vector3 worldPos = new Vector3(transform.position.x, transform.position.y + healthPanelOffset, transform.position.z);
Vector3 screenPos = Camera.main.WorldToScreenPoint(worldPos);
healthPanel.transform.position = new Vector3(screenPos.x, screenPos.y, screenPos.z);
}
}
两种实现的优缺点
IMGUI
优点是实现简单,比如绘制一个控件,只需要GUI.Lable()、GUI.Button()这样即可,不需要使用UI组件,很容易上手。缺点是不利于布局,在协调对象之间的位置关系的时候会很麻烦,这样维护起来也会很困难。调用OnGUI,每一帧都需要重算布局重新渲染,性能低下。
UGUI
优点是可视化,所见即所得。UGUI的控件是以“游戏对象”的形式存在与游戏场景中,这样直观易于使用,直接可以在Scene视图中编辑大小、位置、旋转角度、缩放等等,不需要手动写任何代码。据说效率比较高,“提供了一个经过优化的解决方案,使得开发者添加到游戏中的UI能够快速的被GPU执行(绘制)”直观的缺点是上手比较困难,学习成本比较高,提供强大功能的同时意味着需要花更多的时间了解这些功能的使用。