• 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 }

     

     

     

  • 相关阅读:
    暑假假期周进度报告(第七周)
    暑假假期周进度报告(第五周)
    暑假假期周进度报告(第二周)
    接口 interface 实现接口implements 抽象类 abstract 继承extends
    标准JavaBean
    IO FileInputStream 输入字节流类(读文件) FileOutputStream 输出字节流(写文件) 复制文件
    如何获取任意范围内的一个随机数?
    hadoop 简介
    创建Student数组和Student对象,键盘录入
    云计算01
  • 原文地址:https://www.cnblogs.com/dongz888/p/4909012.html
Copyright © 2020-2023  润新知