中文字幕无码a片久久,亚洲日韩在线观看浪潮,人人超人人超碰超国产二区,国产人妻久久一区二区,国产人妻久久一区二区

福感科技有限公司 歡迎您!
聯(lián)系方式

    地址:北京市平谷區(qū)馬坊鎮(zhèn)金河北街17號院3號樓7層712

    電話:010-89968230

    網(wǎng)站:http://0743119.com

unity3d中利用網(wǎng)格+貼圖繪制血條/進度條

2021-3-7 22:09:42??????點擊:

利用網(wǎng)格去繪制血條, 血條肯定是一個矩形,網(wǎng)格是由一個一個三角形組成的,矩形可以分成兩個三角形。
創(chuàng)建一個空物體,添加以下腳本組件:

[RequireComponent(typeof(MeshFilter),typeof(MeshRenderer))]
public class MeshAndUV : MonoBehaviour
{
 
    private Mesh mh;
    private Renderer rd;
    private float size = 1;
    private Material mat;
    void Awake()
    {
        mh = GetComponent().mesh;
        rd = GetComponent();
    }
 
    void Start()
    {
 
       //頂點數(shù)組
        Vector3[] vertes  = new Vector3[]
        {
            new Vector3(-size, -size, 0),//第一個點
            new Vector3(-size, size, 0), //第二個
            new Vector3(size, size, 0), //第三個
            new Vector3(size, -size, 0), //第四個
        };
 
        mh.vertices = vertes;
 
        //頂點組成的三角形
        mh.triangles = new[]
        {
            0, 1, 2,
            0, 2, 3
        };
        mh.RecalculateNormals();
    }
}
運行下,就發(fā)現(xiàn)繪制出一個粉紅色的矩形,為啥是粉紅色,因為沒材質(zhì)啊?。?!@#¥%@#¥……

在scene視圖下把ShadingMode改為Wireframe模式就可以看到兩個三角形

軸點在中心,邊長為2的矩形,然后在腳本上設置UV映射,加上貼圖材質(zhì)。

在設置三角形下面添加一下代碼就可以顯示紋理了呀:

//UV貼圖的四個點,和頂點一一對應,左下角為(0,0),右上角為(1,1)
//如果頂點順序沒有跟UV對應,貼圖就會出現(xiàn)問題
Vector2[] uvs = new Vector2[]
{
    new Vector2(0,0),//第一個點
    new Vector2(0,1),//2
     new Vector2(1,1),//3
     new Vector2(1,0), //4
};

 mh.uv = uvs;
 rd.material = mat;


封裝成一個函數(shù) void CreateBar(int barIndex),修改UV映射,血條索引從下往上數(shù),每個間隔0.25f

Vector2[] uvs = new Vector2[]
{
     new Vector2(0, 0.25f * barIndex),//第一個點
     new Vector2(0, 0.25f * (barIndex+1)),//2
     new Vector2(1, 0.25f * (barIndex+1)),//3
     new Vector2(1, 0.25f * barIndex), //4
};
在Start方法調(diào)用 CreateBar(0),呀, 怎么紅色是滿的呢?

由于滿血狀態(tài)是全紅的,所以在UV的x映射也要做下改變

Vector2[] uvs = new Vector2[]
{
     new Vector2(0, 0.25f * barIndex),//第一個點
     new Vector2(0, 0.25f * (barIndex+1)),//2
     new Vector2(0.5f, 0.25f * (barIndex+1)),//3
     new Vector2(0.5f, 0.25f * barIndex), //4
};

是不是有點像啦。只要改變下長寬比就好看啦。 改成下面這樣多一個參數(shù)試試看。


void CreateBar(Vector2 size, int barIndex)
{
    Vector3[] vertes = new Vector3[]
        {
            new Vector3(-size.x, -size.y, 0),//第一個點
            new Vector3(-size.x, size.y, 0), //第二個
            new Vector3(size.x, size.y, 0), //第三個
            new Vector3(size.x, -size.y, 0), //第四個
        };
}
看看血條效果吧:



改變血條的值有2個辦法,
1.改變Material的mainTextureOffset值
mat.mainTextureOffset = new Vector2(0.2f,0);

但是這樣會令到所以使用者材質(zhì)的物體貼圖都會改變
2.修改UV映射


void SetBarRate(float value)
    {
        value *= 0.5f;
        Vector2[] uvs = new Vector2[]
        {
            new Vector2(value, 0.25f * barIndex),//第一個點
            new Vector2(value, 0.25f * (barIndex+1)),//2
            new Vector2(0.5f + value , 0.25f * (barIndex+1)),//3
            new Vector2(0.5f + value, 0.25f * barIndex), //4
        };
        mh.uv = uvs;
    }
//因為這張圖一半是亮的,一半是暗的,暗的那部分代表失去的血量,所以value要乘以0.5;
void Start()
    {
        CreateBar(new Vector2(1,0.25f),0 );
        SetBarRate(0.9f);
    }
到此基本完成了任務, 下面來個完整的代碼給各位親參考一下, 歡迎來我們網(wǎng)站wiseglove.com投稿哦~



using UnityEngine;
using System.Collections;
 
[RequireComponent(typeof(MeshFilter),typeof(MeshRenderer))]
public class MeshAndUV : MonoBehaviour
{
    private Mesh mh;
    private Renderer rd;
    
    private float rate = 0.5f;
    public Material mat;
 
    private int barIndex = 0;
    void Awake()
    {
        mh = GetComponent().mesh;
        rd = GetComponent();
       
    }
    void Start()
    {
        CreateBar(new Vector2(1,0.25f),0 );
        SetBarRate(0.9f);
    }
    ////// 利用網(wǎng)格創(chuàng)建血條
    //////三角形大小///血條索引void CreateBar(Vector2 size, int barIndex)
    {
        this.barIndex = barIndex;
        //頂點數(shù)組
        Vector3[] vertes = new Vector3[]
        {
            new Vector3(-size.x, -size.y, 0),//第一個點
            new Vector3(-size.x, size.y, 0), //第二個
            new Vector3(size.x, size.y, 0), //第三個
            new Vector3(size.x, -size.y, 0), //第四個
        };
        //給網(wǎng)格的頂點賦值
        mh.vertices = vertes;
 
        //頂點組成的三角形
        mh.triangles = new[]
        {
            0, 1, 2,
            0, 2, 3
        };
 
        //UV貼圖的四個點,和頂點一一對應,左下角為(0,0),右上角為(1,1)
        //如果頂點順序沒有跟UV對應,貼圖就會出現(xiàn)問題
        Vector2[] uvs = new Vector2[]
        {
            new Vector2(0, 0.25f * barIndex),//第一個點
            new Vector2(0, 0.25f * (barIndex+1)),//2
            new Vector2(0.5f , 0.25f * (barIndex+1)),//3
            new Vector2(0.5f , 0.25f * barIndex), //4
        };
        mh.uv = uvs;
        //材質(zhì)
        rd.material = mat;
        //法線重新計算
        mh.RecalculateNormals();
    }
    ////// 設置血條比例
    //////血量失去的百分比void SetBarRate(float value)
    {
        value *= 0.5f;
        Vector2[] uvs = new Vector2[]
        {
            new Vector2(value, 0.25f * barIndex),//第一個點
            new Vector2(value, 0.25f * (barIndex+1)),//2
            new Vector2(0.5f + value , 0.25f * (barIndex+1)),//3
            new Vector2(0.5f + value, 0.25f * barIndex), //4
        };
        mh.uv = uvs;
    }
}
按照上面的方法, 畫進度條也是這個方法。

Copyright 2019 0743119.com

福感科技有限公司 版權(quán)所有 All Rights Reserved

京ICP備20002031號

010-89968230