3D游戏编程9--用IMGUI和UGUI实现血条

IMGUI实现效果

IMGUI

UGUI实现效果

UGUI

IMGUI代码 IMGUI血条.cs

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

public class IMGUI : MonoBehaviour {

    public float bloodValue = 0.0f;
    private float ResultValue;
    private Rect rctBloodBar;
    private Rect rctUpButton;
    private Rect rctDownButton;
    private bool onoff;

    void Start()
    {
        //血条横向  
        rctBloodBar = new Rect(20, 20, 200, 20);  
        //加血-按钮  
        rctUpButton = new Rect(20, 50, 40, 20);  
        //减血-按钮  
        rctDownButton = new Rect(70, 50, 40, 20);  
        ResultValue = bloodValue;
    }

    void OnGUI()
    {
        if (GUI.Button(rctUpButton, "加血"))
        {
            ResultValue += 0.1f;
        }
        if (GUI.Button(rctDownButton, "减血"))
        {
            ResultValue -= 0.1f;
        }
        if (ResultValue > 1.0f)
        {
            ResultValue = 1.0f;
        }
        if (ResultValue < 0.0f)
        {
            ResultValue = 0.0f;
        }
        //插值计算HP值

        bloodValue = Mathf.Lerp(bloodValue, ResultValue, 0.05f);

        GUI.HorizontalScrollbar(rctBloodBar, 0.0f, bloodValue, 0.0f, 1.0f);  
    }
}

UGUI代码 UGUI.cs

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

public class UGUI : MonoBehaviour {
    //外侧的血条边框
    public RectTransform rectBloodPos;
    //内侧的血条
    public RectTransform blood;
    //减少的血条,先要将内部血条设为stretch,然后这里的reduceBlood对应right属性
    public int reduceBlood = 0;
    void Update()
    {
        //为了保证物体移动的时候血条跟着动
        Vector2 vec2 = Camera.main.WorldToScreenPoint(this.gameObject.transform.position);
        rectBloodPos.anchoredPosition = new Vector2(vec2.x - Screen.width / 2 + 0, vec2.y - Screen.height / 2 + 60);
        //这里需要用到下面的ExtendsionMethod,否则不能直接设置Right属性
        blood.GetComponent<RectTransform>().Right(reduceBlood);
    }

    private void OnGUI()
    {
        if (GUI.Button(new Rect(20, 30, 40, 20), "加血"))
        {
            reduceBlood -= 10;
            if(reduceBlood < 0)
            {
                reduceBlood = 0;
            }
        }
        if (GUI.Button(new Rect(70, 30, 40, 20), "减血"))
        {
            reduceBlood += 10;
            if(reduceBlood > 200)
            {
                reduceBlood = 200;
            }
        }
    }
}

ExtendsionMethod.cs

参考这个链接

using UnityEngine;

// 必须是静态类才可以添加扩展方法
public static class ExtensionMethod
{
    // 扩展方法必须是静态的
    // this 必须有,RectTransform表示我要扩展的类型,rTrans表示对象名
    // 如果要带参数就在后面带上
    public static void Left(this RectTransform rTrans, int value)
    {
        rTrans.offsetMin = new Vector2(value, rTrans.offsetMin.y);
    }

    public static void Right(this RectTransform rTrans, int value)
    {
        rTrans.offsetMax = new Vector2(-value, rTrans.offsetMax.y);
    }

    public static void Bottom(this RectTransform rTrans, int value)
    {
        rTrans.offsetMin = new Vector2(rTrans.offsetMin.x, value);
    }

    public static void Top(this RectTransform rTrans, int value)
    {
        rTrans.offsetMax = new Vector2(rTrans.offsetMax.x, -value);
    }
}

视频以及资源

视频以及资源

猜你喜欢

转载自blog.csdn.net/yaoxh6/article/details/80545708
今日推荐