久久精品国产精品亚洲精品_日日爽爽_国产免费不卡av_男人的网站你懂得_少妇和子乱视频_超碰碰人人

  • 您的位置:首頁 > 新聞動態(tài) > Unity3D

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

    2019/11/1??????點(diǎn)擊:

    利用網(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()
        {
     
           //頂點(diǎn)數(shù)組
            Vector3[] vertes  = new Vector3[]
            {
                new Vector3(-size, -size, 0),//第一個點(diǎn)
                new Vector3(-size, size, 0), //第二個
                new Vector3(size, size, 0), //第三個
                new Vector3(size, -size, 0), //第四個
            };
     
            mh.vertices = vertes;
     
            //頂點(diǎn)組成的三角形
            mh.triangles = new[]
            {
                0, 1, 2,
                0, 2, 3
            };
            mh.RecalculateNormals();
        }
    }
    運(yùn)行下,就發(fā)現(xiàn)繪制出一個粉紅色的矩形,為啥是粉紅色,因為沒材質(zhì)啊!!!@#¥%@#¥……

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

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

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

    //UV貼圖的四個點(diǎn),和頂點(diǎn)一一對應(yīng),左下角為(0,0),右上角為(1,1)
    //如果頂點(diǎn)順序沒有跟UV對應(yīng),貼圖就會出現(xiàn)問題
    Vector2[] uvs = new Vector2[]
    {
        new Vector2(0,0),//第一個點(diǎn)
        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),//第一個點(diǎn)
         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),//第一個點(diǎn)
         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
    };

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


    void CreateBar(Vector2 size, int barIndex)
    {
        Vector3[] vertes = new Vector3[]
            {
                new Vector3(-size.x, -size.y, 0),//第一個點(diǎn)
                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),//第一個點(diǎn)
                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ù), 下面來個完整的代碼給各位親參考一下, 歡迎來我們網(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;
            //頂點(diǎn)數(shù)組
            Vector3[] vertes = new Vector3[]
            {
                new Vector3(-size.x, -size.y, 0),//第一個點(diǎn)
                new Vector3(-size.x, size.y, 0), //第二個
                new Vector3(size.x, size.y, 0), //第三個
                new Vector3(size.x, -size.y, 0), //第四個
            };
            //給網(wǎng)格的頂點(diǎn)賦值
            mh.vertices = vertes;
     
            //頂點(diǎn)組成的三角形
            mh.triangles = new[]
            {
                0, 1, 2,
                0, 2, 3
            };
     
            //UV貼圖的四個點(diǎn),和頂點(diǎn)一一對應(yīng),左下角為(0,0),右上角為(1,1)
            //如果頂點(diǎn)順序沒有跟UV對應(yīng),貼圖就會出現(xiàn)問題
            Vector2[] uvs = new Vector2[]
            {
                new Vector2(0, 0.25f * barIndex),//第一個點(diǎn)
                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();
        }
        ////// 設(shè)置血條比例
        //////血量失去的百分比void SetBarRate(float value)
        {
            value *= 0.5f;
            Vector2[] uvs = new Vector2[]
            {
                new Vector2(value, 0.25f * barIndex),//第一個點(diǎn)
                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;
        }
    }
    按照上面的方法, 畫進(jìn)度條也是這個方法。 



    主站蜘蛛池模板: 亚州一区二区三区中文字幕国产精品 | 久久免费视频4 | www.亚洲一区.com | 国产社区在线综合不卡 | 日韩中文字幕在线看 | 国产一区二区三区在线免费 | 日韩一级片在线观看 | 无码影片一区二区三区 | 国产精品久久久久久久久久免 | 国产日产一区二区三区四区五区 | 欧美性色黄大片a级毛片视频 | 亚洲精品资源在线观看 | 在线日韩亚洲 | 红桃一区 | 无码aⅴ一区二区三区 | 欧美一级h | 国产一区国产精品 | 久久亚洲精品视频 | 国产成人小视频 | 国产免费av片在线观看 | 精品九一| 久久人人97超碰人人澡国产 | 亚洲最大一级无码av网站 | 尤物久久av一区二区三区亚洲 | 中文字幕中文字幕在线中文字幕三区 | 国产精品拍自在线观看 | 性生大片一级毛片免费观看 | 国产精品乱码一区二区三区 | 18禁人看免费无遮挡网站不卡 | 99热6这里只有精品 亚洲AV无码片一区二区三区H0 | 午夜精品久久久久久毛片 | 亚洲の无码国产の无码影院 | 狠狠色丁香久久综合婷婷 | 日日夜夜香蕉 | 99精品无人区乱码3区的功能 | 99国产精品久久久久久久成人 | 女人16一级毛片 | 精品一二三区免费视频 | 91精品久久久久久久久久不卡 | 成人免费看吃奶视频网站 | 性色一区二区三区 |