unity3d利用网格去绘制血条实例图文教程

利用网格去绘制血条

血条肯定是一个矩形,网格是由一个一个三角形组成的,

矩形可以分成两个三角形。

创建一个空物体,添加以下脚本组件

[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<MeshFilter>().mesh;
        rd = GetComponent<MeshRenderer>();
    }
 
    void Start()
    {
 
       //顶点数组
        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();
    }
}

运行下,就发现绘制出一个粉红色的矩形,为啥是粉红色,因为没材质啊


在scene视图下把ShadingMode改为Wireframe模式就可以看到两个三角形



轴点在中心,边长为2的矩形

然后在脚本上设置UV映射,加上贴图材质。


在设置三角形下面添加

//UV贴图的四个点,和顶点一一对应,左下角为(0,0),右上角为(1,1)
        //如果顶点顺序没有跟UV对应,贴图就会出现问题
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;

就可以把这张图绘制出来的

效果如下


这张图包含了HP,MP,我们就要把它们区分开来。

封装成一个函数 void CreateBar(int barIndex)

修改UV映射

血条索引从下往上数,每个间隔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方法调用 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);
    }

效果如下


做到这里就差不多完成了,利用网格去绘制血条。

最终代码

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<MeshFilter>().mesh;
        rd = GetComponent<MeshRenderer>();
       
    }
 
    void Start()
    {
        CreateBar(new Vector2(1,0.25f),0 );
        SetBarRate(0.9f);
    }
 
    /// <summary>
    /// 利用网格创建血条
    /// </summary>
    /// <param name="size">三角形大小</param>
    /// <param name="barIndex">血条索引</param>
    void CreateBar(Vector2 size, int barIndex)
    {
        this.barIndex = 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), //第四个
        };
 
        //给网格的顶点赋值
        mh.vertices = vertes;
 
        //顶点组成的三角形
        mh.triangles = new[]
        {
            0, 1, 2,
            0, 2, 3
        };
 
        //UV贴图的四个点,和顶点一一对应,左下角为(0,0),右上角为(1,1)
        //如果顶点顺序没有跟UV对应,贴图就会出现问题
        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;
 
        //材质
        rd.material = mat;
 
        //法线重新计算
        mh.RecalculateNormals();
 
    }
 
    /// <summary>
    /// 设置血条比例
    /// </summary>
    /// <param name="value">血量失去的百分比</param>
    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;
    }
 
 
}

时间: 2024-09-20 22:53:05

unity3d利用网格去绘制血条实例图文教程的相关文章

Illustrator利用网格工具绘制花瓣花朵教程

给各位Illustrator软件的使用者们来详细的解析分享一下利用网格工具绘制花瓣花朵的教程. 教程分享: 1.第一步是将花瓣的大形勾勒出来,并填上渐变色.   2.选择该花瓣,执行object/expand,将其转化为一个网格对象,这样网格的经纬线就会根据你的渐变色方向进行排布.   3.下面的工作就是要耐心细致的将网格的节点根据花瓣的轮廓.色彩的渐变方向.表面的起伏等因素进行调节,为了更好的表现你还要在相应的地方多加几条线.   4.将底色铺好后,接着要表现花瓣上细微的条纹,先画好一大一小两

Illustrator利用网格工具绘制周星驰人像教程

给各位Illustrator软件的使用者们来详细的解析分享一下利用网格工具绘制周星驰人像的教程. 教程分享:                         好了,以上的信息就是小编给各位Illustrator的这一款软件的使用者们带来的详细的利用网格工具绘制周星驰人像的教程解析分享的全部内容了,各位使用者们看到这里了,小编相信大家现在是非常的清楚了绘制方法了吧,那么大家就快去按照小编的教程自己去绘制下周星驰人像吧.

Illustrator利用网格工具绘制带有绿叶子的红苹果教程

给各位Illustrator软件的使用者们来详细的解析分享一下利用网格工具绘制带有绿叶子的红苹果效果的教程. 教程分享: 1.先画线稿,大家应该都会了,但这里要注意以下,线跳一定要精简,能一个点完成的形状最好是一个点,这便于以后的操作;   2.找到网格渐变工具,也可以直接按"U"   3.把苹果主体填充颜色   4.按"U"后在上面点击,创建第一个格点   继续增加,如图   直到变成   初步上色,每个格点都可以单独上色,可以按"Q",来选择

Qt实现图片移动实例(图文教程)_C 语言

这学期实训的时候用MFC做过一个飞机大战,很无聊的东西,一直想用Qt做一个,但是在学校的时候比较颓,回来看了一下. 首先需要解决的问题是图片的移动,怎么说飞机啊子弹啊都是动着的,图片当然要跑起来. 闲话休絮,首先用QtCreator新建一个QtGui程序,命名为PaintWidget,随便起的名字,实验么这不是. 会生成这三个文件,其中呢ui不用管,实验的图片移动需要用的是Event,不是信号槽,所以ui就不管了,放了那就是. 第一步要把图片画出来,参照<Qt学习之路的这段代码>,不难把图画出

Illustrator中网格工具绘制漂亮的北极光效果教程

给各位Illustrator软件的使用者们来详细的解析分享一下网格工具绘制漂亮的北极光效果的教程. 教程分享: (1)先看一下最终效果:   现在我们开始制作吧 (2)选择工具栏里的"矩形工具",在绘图区绘制一个大小适中的矩形.   (3)选择菜单"对象>创建渐变网格",在弹出的对话框中设置"行数为1,列数为1",点击"确定"按钮,这样就将矩形转变为一个最简单的渐变网格,在此基础上我们可以添加更多的细节,创建各种各样的渐

Illustrator网格工具绘制漂亮的北极光效果教程

给各位Illustrator软件的使用者们来详细的解析分享一下网格工具绘制漂亮的北极光效果的教程. 方法分享: (1)先看一下最终效果:   现在我们开始制作吧 (2)选择工具栏里的"矩形工具",在绘图区绘制一个大小适中的矩形.   (3)选择菜单"对象>创建渐变网格",在弹出的对话框中设置"行数为1,列数为1",点击"确定"按钮,这样就将矩形转变为一个最简单的渐变网格,在此基础上我们可以添加更多的细节,创建各种各样的渐

Illustrator渐变网格工具绘制可爱的卡通小猪教程分享

给各位Illustrator软件的使用者们来详细的解析分享一下渐变网格工具绘制可爱的卡通小猪的教程. 教程分享:   美丽外表下的复杂渐变网格骨架.   首先,把扫描好的白描稿在AI中用钢笔工具描出来. 步骤:1.先将整体的轮廓描出来,这一步主要是为了定型,要不然以后的胳膊腿有可能装错位哦:) 2.然后分别将身体的大部组件分别描绘成闭合区域(因为要填色嘛,当然要描绘成闭合的了),这里注意千万不要盯住一个细节描,不是越细越好哦,有时候反而会影响到整体效果.好,我们现在将猪头:).猪脚.帽子等描出来

视频做成GIF实例图文教程

看到一个给力的视频,却不能贴上无聊图,这是何等的不给力啊.现在!不给力的时代结束了!让我们迎来人人都会把视频做成GIF的大GIF时代吧! 教程开始: 1. 把视频扒下来 图中显然是YouTube,对于YouTube我们可以用一些好用的工具,比如keepvid.com. 当然用Realplayer也可以用扒视频,如下图: 另外还有IDM (Internet Download Manager)也很好用- 注:以上两个软件对于国内的视频网站也是管用的. 2. 转换格式刚才扒下来的视频是FLV或者MP4

word统一图片大小实例图文教程

  图片过大,或者是大小不一,比如说有5张图片,想要发贴,下软件容易中毒又麻烦,教大家用电脑上的word来统一图片大小. word真是最好用的图片缩小工具,既能把图片缩小,又不会明显降低图片的质量,好用的不得了. 下面这5张图是编辑前的样子: 大小不一,显得杂乱 下面一步步跟我来用word来统一他们的大小 首先新建一个新建 Microsoft Word 文档 你想要把图片缩小到什么程度,就先设置一下 文件---页面设置---页边距 这里的左右页边距就是你要让自己的图片变成多大,页边距越大,图片之