unity3D 作業8 Health Bar

1、血條(Health Bar)的預製設計。具體要求如下

  • 分別使用 IMGUI 和 UGUI 實現
  • 使用 UGUI,血條是遊戲對象的一個子元素,任何時候需要面對主攝像機
  • 分析兩種實現的優缺點
  • 給出預製的使用方法

Github
演示視頻地址

IMGUI

首先是IMGUI的實現,優先定義一個Health類型,用於管理血條。代碼如下:

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

public class Health : MonoBehaviour
{
    public float curHP;
    public float nextHP;
    public float fullHP = 100.0f;

    private void Start() {
        curHP = fullHP;
        nextHP = fullHP;
    }

    private void Update() {
        //Linear interpolation to make HP change smoothly
        curHP = Mathf.Lerp(curHP, nextHP, 0.05f);
    }

    public void Hurt(){
        nextHP = (curHP - 10.0f)>=0f?curHP-10.0f:0.0f;
    }

    public void Recover(){
        nextHP = fullHP;
    }
}


然後是開始實現IMGUI的內容,代碼如下:

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

[RequireComponent(typeof(Health))]
public class IMGUI : MonoBehaviour
{
    private GameObject Character;
	private GameObject people;
    private float curHP;
    private float fullHP;
    private void Start() {
        Character = this.gameObject;
		Character.AddComponent<Health>();
    }

    private void OnGUI() {
        if(GUI.Button(new Rect(UnityEngine.Screen.width/2 - 50,UnityEngine.Screen.height/2 - 40,80,40),"Hurt"))
        {
            Character.GetComponent<Health>().Hurt();
        }
        if(GUI.Button(new Rect(UnityEngine.Screen.width/2 + 50,UnityEngine.Screen.height/2 - 40,80,40),"Recover"))
        {
            Character.GetComponent<Health>().Recover();
        }

        curHP = Character.GetComponent<Health>().curHP;
        fullHP = Character.GetComponent<Health>().fullHP;

        GUI.HorizontalScrollbar(new Rect(UnityEngine.Screen.width/2 - 42,UnityEngine.Screen.height/2 +20,170,20), 0.0f, curHP, 0.0f, fullHP);
    }
}

UGUI

這一部分是按照老師講的內容進行實現的,不過老師所給的有一些小問題,在這裏我已經修改了。

具體實現步驟如下:

  • 菜單 Assets -> Import Package -> Characters 導入資源(Characters資源是Unity的標準資源,新版本沒有,自己去官網下)

  • 在層次視圖,Context 菜單 -> 3D Object -> Plane 添加 Plane 對象

  • 資源視圖展開 Standard Assets :: Charactors :: ThirdPersonCharater :: Prefab
    將 ThirdPersonController 預製拖放放入場景,改名爲 Ethan
    檢查以下屬性

    • Plane 的 Transform 的 Position = (0,0,0)
    • Ethan 的 Transform 的 Position = (0,0,0)
    • Main Camera 的 Transform 的 Position = (0,1,-10)
  • 運行檢查效果

  • 選擇 Ethan 用上下文菜單 -> UI -> Canvas, 添加畫布子對象

  • 選擇 Ethan 的 Canvas,用上下文菜單 -> UI -> Slider 添加滑條作爲血條子對象

  • 運行檢查效果

  • 選擇 Ethan 的 Canvas,在 Inspector 視圖

    • 設置 Canvas 組件 Render Mode 爲 World Space
    • 設置 Rect Transform 組件 (PosX,PosY,Width, Height) 爲 (0,2,160,20)
      • 設置 Rect Transform 組件 Scale (x,y) 爲 (0.01,0.01)
  • 運行檢查效果,應該是頭頂 Slider 的 Ethan,用鍵盤移動 Ethan,觀察

  • 展開 Slider

    • 選擇 Handle Slider Area,禁灰(disable)該元素
    • 選擇 Background,禁灰(disable)該元素
    • 選擇 Fill Area 的 Fill,修改 Image 組件的 Color 爲 紅色
  • 選擇 Slider 的 Slider 組件

    • 設置 MaxValue 爲 100
    • 設置 Value 爲 75
  • 運行檢查效果,發現血條隨人物旋轉

然後內容就實現了,同時爲了保持血條一直面對着攝像頭,可以在characters上添加如下的代碼。

using UnityEngine;

public class LookAtCamera : MonoBehaviour {

	void Update () {
		this.transform.LookAt (Camera.main.transform.position);
	}
}

這樣子血條就能夠一直直面着攝像頭了。

分析兩種實現的優缺點

IMGUI:

  • 如果不做複雜的界面,代碼簡單易用
  • 在修改模型,渲染模型這樣的經典遊戲循環編程模式中,在渲染階段之後,繪製 UI 界面無可挑剔
    避免了 UI 元素保持在屏幕最前端,又有最佳的執行效率,一切控制掌握在程序員手中,這對早期計算和存儲資源貧乏的遊戲設備來說,更是彌足珍貴。

缺點:

  • 傳統代碼驅動的 UI 開發效率低下,難以調試

UGUI:

優點:

  • 爲了讓設計師也能參與參與程序開發,從簡單的地圖編輯器、菜單編輯器等工具應運而生。 設計師甚至不需要程序員幫助,使用這些工具就可直接創造遊戲元素,乃至產生遊戲程序。
  • 所見即所得(WYSIWYG)設計工具
  • 支持多模式、多攝像機渲染
  • 面向對象的編程

給出預製的使用方法

對於預製的使用方法,對於IMGUI而言,只需要把腳本掛到對應的物體上就可以使用了。

對於UGUI而言,只需要把實現了血條的canvas保存下來需要的時候加載到對應的物體上面就可以了。

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章