unity3d中利用网格去绘制血条

 

利用网格去绘制血条

血条肯定是一个矩形,网格是由一个一个三角形组成的,
矩形可以分成两个三角形。
创建一个空物体,添加以下脚本组件
 1 [RequireComponent(typeof(MeshFilter),typeof(MeshRenderer))]
 2 public class MeshAndUV : MonoBehaviour
 3 {
 4  
 5     private Mesh mh;
 6     private Renderer rd;
 7     private float size = 1;
 8     private Material mat;
 9     void Awake()
10     {
11         mh = GetComponent<MeshFilter>().mesh;
12         rd = GetComponent<MeshRenderer>();
13     }
14  
15     void Start()
16     {
17  
18        //顶点数组
19         Vector3[] vertes  = new Vector3[]
20         {
21             new Vector3(-size, -size, 0),//第一个点
22             new Vector3(-size, size, 0), //第二个
23             new Vector3(size, size, 0), //第三个
24             new Vector3(size, -size, 0), //第四个
25         };
26  
27         mh.vertices = vertes;
28  
29         //顶点组成的三角形
30         mh.triangles = new[]
31         {
32             0, 1, 2,
33             0, 2, 3
34         };
35         mh.RecalculateNormals();
36     }
37 }
38  
运行下,就发现绘制出一个粉红色的矩形,为啥是粉红色,因为没材质啊
 
在scene视图下把ShadingMode改为Wireframe模式就可以看到两个三角形
 
 
轴点在中心,边长为2的矩形
 
然后在脚本上设置UV映射,加上贴图材质。
 
在设置三角形下面添加
 1 //UV贴图的四个点,和顶点一一对应,左下角为(0,0),右上角为(1,1)
 2         //如果顶点顺序没有跟UV对应,贴图就会出现问题
 3 Vector2[] uvs = new Vector2[]
 4         {
 5             new Vector2(0,0),//第一个点
 6             new Vector2(0,1),//2
 7             new Vector2(1,1),//3
 8             new Vector2(1,0), //4
 9         };
10 
11         mh.uv = uvs;
12         rd.material = mat;

 

 
就可以把这张图绘制出来的
效果如下
 
这张图包含了HP,MP,我们就要把它们区分开来。
 
封装成一个函数 void CreateBar(int barIndex)
修改UV映射
血条索引从下往上数,每个间隔0.25f
1 Vector2[] uvs = new Vector2[]
2         {
3             new Vector2(0, 0.25f * barIndex),//第一个点
4             new Vector2(0, 0.25f * (barIndex+1)),//2
5             new Vector2(1, 0.25f * (barIndex+1)),//3
6             new Vector2(1, 0.25f * barIndex), //4
7         };
8  

 

在Start方法调用 CreateBar(0)
效果如下
 
由于满血状态是全红的,所以在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
        };

 

 

是不是有点像啦。只要改变下长宽比就好看啦。
 
函数添加多一个参数
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), //第四个
        };

 

 
调用下函数
void Start()
    {
        CreateBar(new Vector2(1,0.25f),0 );
    }

 

 
效果如下
 
改变血条的值有点个办法,
第一个是改变Material的mainTextureOffset值
mat.mainTextureOffset = new Vector2(0.2f,0);
但是这样会令到所以使用者材质的物体贴图都会改变
 
第二个办法就是修改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);
    }

 

 
效果如下
 
做到这里就差不多完成了,利用网格去绘制血条。
 
最终代码
 1 using UnityEngine;
 2 using System.Collections;
 3  
 4 [RequireComponent(typeof(MeshFilter),typeof(MeshRenderer))]
 5 public class MeshAndUV : MonoBehaviour
 6 {
 7  
 8     private Mesh mh;
 9     private Renderer rd;
10     
11     private float rate = 0.5f;
12     public Material mat;
13  
14     private int barIndex = 0;
15     void Awake()
16     {
17         mh = GetComponent<MeshFilter>().mesh;
18         rd = GetComponent<MeshRenderer>();
19        
20     }
21  
22     void Start()
23     {
24         CreateBar(new Vector2(1,0.25f),0 );
25         SetBarRate(0.9f);
26     }
27  
28     /// <summary>
29     /// 利用网格创建血条
30     /// </summary>
31     /// <param name="size">三角形大小</param>
32     /// <param name="barIndex">血条索引</param>
33     void CreateBar(Vector2 size, int barIndex)
34     {
35         this.barIndex = barIndex;
36  
37         //顶点数组
38         Vector3[] vertes = new Vector3[]
39         {
40             new Vector3(-size.x, -size.y, 0),//第一个点
41             new Vector3(-size.x, size.y, 0), //第二个
42             new Vector3(size.x, size.y, 0), //第三个
43             new Vector3(size.x, -size.y, 0), //第四个
44         };
45  
46         //给网格的顶点赋值
47         mh.vertices = vertes;
48  
49         //顶点组成的三角形
50         mh.triangles = new[]
51         {
52             0, 1, 2,
53             0, 2, 3
54         };
55  
56         //UV贴图的四个点,和顶点一一对应,左下角为(0,0),右上角为(1,1)
57         //如果顶点顺序没有跟UV对应,贴图就会出现问题
58         Vector2[] uvs = new Vector2[]
59         {
60             new Vector2(0, 0.25f * barIndex),//第一个点
61             new Vector2(0, 0.25f * (barIndex+1)),//2
62             new Vector2(0.5f , 0.25f * (barIndex+1)),//3
63             new Vector2(0.5f , 0.25f * barIndex), //4
64         };
65  
66         mh.uv = uvs;
67  
68         //材质
69         rd.material = mat;
70  
71         //法线重新计算
72         mh.RecalculateNormals();
73  
74     }
75  
76     /// <summary>
77     /// 设置血条比例
78     /// </summary>
79     /// <param name="value">血量失去的百分比</param>
80     void SetBarRate(float value)
81     {
82         value *= 0.5f;
83         Vector2[] uvs = new Vector2[]
84         {
85             new Vector2(value, 0.25f * barIndex),//第一个点
86             new Vector2(value, 0.25f * (barIndex+1)),//2
87             new Vector2(0.5f + value , 0.25f * (barIndex+1)),//3
88             new Vector2(0.5f + value, 0.25f * barIndex), //4
89         };
90         mh.uv = uvs;
91     }
92  
93  
94 }

 

 

 

原文地址:https://www.cnblogs.com/dongz888/p/4909012.html