创建一个空gameObject,添加Mesh Filter和Mesh Renderer两个component,再添加一个脚本createMeshScript:

using UnityEngine;
using System.Collections;

[ExecuteInEditMode]
public class createMeshScript : MonoBehaviour {
    void Awake() {
        gameObject.GetComponent<MeshFilter> ().mesh = CreateMesh (1,1);
    }
    Mesh CreateMesh(float width, float height)
    {
        Mesh m = new Mesh();
        m.name = "ScriptedMesh";
        //note: unity is left-hand system
        m.vertices = new Vector3[] {
            new Vector3(-width/2, -height/2, 0),
            new Vector3(-width/2, height/2, 0),
            new Vector3(width/2, height/2, 0),
            new Vector3(width/2, -height/2, 0)
        };
        m.uv = new Vector2[] {
            new Vector2 (0, 0),
            new Vector2 (0, 1),
            new Vector2 (1, 1),
            new Vector2 (1, 0)
        };
        m.triangles = new int[] { 0, 1, 2, 0, 2, 3};
        m.RecalculateNormals();
        m.RecalculateBounds();
        return m;
    }
}

此时可以看到Inspector中Mesh Filter->Mesh显示为ScriptedMesh(因为我们在代码中为它命名是scriptedMesh)。

此时创建的mesh没有材质,显示为紫色,新建一个Material拖放到Mesh Renderer->Materials->Element 0上,完成mesh的创建。

运行程序,可以看到脚本创建的mesh如图:

另外需要注意的是:

1,unity中是坐标系统是左手系,如果不注意这一点把顶点顺序(法线)搞反了,可能画出来的东西因背面剔除而看不到。

2,mesh.vertices要用局部坐标。

参考:

http://blog.nobel-joergensen.com/2010/12/25/procedural-generated-mesh-in-unity/

http://answers.unity3d.com/questions/139808/creating-a-plane-mesh-directly-from-code.html

----补充:(2015-5-23)

下面尝试创建一个复杂一点儿的面片:

将前面的脚本改成:

using UnityEngine;
using System.Collections;
[ExecuteInEditMode]
public class createMeshScript : MonoBehaviour {
    void Awake() {
        gameObject.GetComponent<MeshFilter> ().mesh = CreateRandomPlane (1,1,3,3,true);//false
    }
    Mesh CreateCustomPlane(float width, float height,int nRow,int nCol,bool isAddRandom){
        Mesh m = new Mesh();
        m.name = "customPlane";
        //note: unity is left-hand system
        Vector3 LU = new Vector3 (-width/2,height/2,0);
        float dx = width / nCol;
        float dy = height / nRow;
        int vertCount = (nRow + 1) * (nCol + 1);
        int triangleCount = nRow * nCol * 2;
        Vector3[] vertices=new Vector3[vertCount];
        Vector2[] uv=new Vector2[vertCount];
        int[] IDs=new int[triangleCount*3];
        for (int i=0; i<nRow+1; i++) {
            for(int j=0;j<nCol+1;j++){
                Vector3 v=LU+new Vector3(dx*j,-dy*i,0);
                Vector2 texCoord=new Vector2(dx*j/width,1-dy*i/height);
                if(isAddRandom){//add random
                    v.z=(Random.value*2-1)*0.1f;
                }
                vertices[i*(nCol+1)+j]=v;
                uv[i*(nCol+1)+j]=texCoord;
                
            }
        }
        for (int i=0; i<nRow; i++) {
            for(int j=0;j<nCol;j++){
                //quad[i][j]
                int LUID=i*(nCol+1)+j;
                int LDID=LUID+(nCol+1);
                int RUID=LUID+1;
                int RDID=LDID+1;
                //quad[i][j] is triangle[2*(i*4+j)] and triangle[2*(i*4+j)+1] 
                //triangle[2*(i*4+j)] is {IDs[2*(i*4+j)*3],IDs[2*(i*4+j)*3+1],IDs[2*(i*4+j)*3+2]}
                IDs[2*(i*nCol+j)*3]=LUID;
                IDs[2*(i*nCol+j)*3+1]=RUID;
                IDs[2*(i*nCol+j)*3+2]=LDID;
                //triangle[2*(i*4+j)+1] is {IDs[(2*(i*4+j)+1)*3],IDs[(2*(i*4+j)*3+1)*3+1],IDs[(2*(i*4+j)*3+2)*3+2]}
                IDs[(2*(i*nCol+j)+1)*3]=LDID;
                IDs[(2*(i*nCol+j)+1)*3+1]=RUID;
                IDs[(2*(i*nCol+j)+1)*3+2]=RDID;
            }
        }
        
        
        m.vertices = vertices;
        m.uv = uv;
        m.triangles = IDs;
        
        m.RecalculateNormals();
        m.RecalculateBounds();
        return m;
        
    }
}

运行结果:

左边是isAddRandom取false,右边是isAddRandom取true。

 

注:脚本中的m.RecalculateBounds()可能是多余的,因为Mesh.RecalculateBounds的官方文档中写道:After modifying vertices you should call this function to ensure the bounding volume is correct. Assigning triangles will automatically Recalculate the bounding volume.

unity, 用脚本创建mesh的更多相关文章

  1. Unity通过脚本创建Mesh(网格)

    ##1.创建一个带Mesh的物体 Unity中的网格作为组件不能脱离物体单独存在 新建脚本CreateMesh public class CreateMesh: MonoBehaviour { voi ...

  2. Unity中动态创建Mesh

    什么是Mesh? Mesh是指的模型的网格,3D模型是由多边形拼接而成,而多边形实际上又是由多个三角形拼接而成的.即一个3D模型的表面其实是由多个彼此相连的三角面构成.三维空间中,构成这些三角形的点和 ...

  3. Unity Mono脚本 加密

    加密环境 引擎版本:Unity3D 5.3.4 及更高版本 (使用Mono而并非IL2CPP) 操作系统:CentOS 6.2(Final) 加密环境:Android.IOS(暂定) 加密对象:C#源 ...

  4. 游戏编程之Unity常用脚本类的继承关系

    前言学习Unity开发引擎的初学者会接触大量的脚本类,而这些类之间的关系往往容易被忽略.本文对Unity引擎开发中的一些常用类及其关系进行了简单的归纳总结. 博文首发地址:http://tieba.b ...

  5. Unity基础-脚本生命周期

    理解Unity脚本的生命周期对游戏开发很重要,这篇文章对生命周期做一个记录和总结.Unity的脚本生命周期(消息),也就是在脚本运行时,自动并且按顺序执行的一系列函数.在unity官网中有对生命周期详 ...

  6. Unity3D学习笔记4——创建Mesh高级接口

    目录 1. 概述 2. 详论 3. 其他 4. 参考 1. 概述 在文章Unity3D学习笔记2--绘制一个带纹理的面中使用代码的方式创建了一个Mesh,不过这套接口在Unity中被称为简单接口.与其 ...

  7. Unity获取脚本的CustomEditor(自定义编辑)数据

    在此之前,粗略的介绍下 CustomEditor(自定义编辑). Unity对于我们创建的Mono脚本提供了属性面板的展示和修改.默认情况下,Inspector面板中会显示当前脚本类的公开字段(pub ...

  8. loadrunner工具使用之脚本创建

    loadrunner工具使用之脚本创建 一.创建脚本 1.打开loadrunner,选择第一个控件VuGen(创建/编辑脚本),点击

  9. BlazeMeter发布chrome扩展插件,支持JMeter脚本创建

    BlazeMeter发布chrome扩展插件,支持JMeter脚本创建http://www.automationqa.com/forum.php?mod=viewthread&tid=3898 ...

随机推荐

  1. JAVAssist---动态改动注解

    ​ITOOV3.0開始了,须要研究一些技术难点,先来说一个我认为比較有趣的技术点吧.需求是这种.我们须要动态的切换数据源,又因为我们是通过实体单元的注入来完毕的.实体单元是通过注解的形式注入的.这样假 ...

  2. 工作流引擎activiti入门

    眼下最新的版本号是5.17 1.下载:activiti-5.17.0.zip http://activiti.org/download.html 2.解压activiti-5.17.0.zip 3.打 ...

  3. springBoot 2.X-自定义拦截器

    package com.cx.springboot.myInter; import javax.servlet.http.HttpServletRequest; import javax.servle ...

  4. pytest文档6-fixture之yield实现teardown

    前言 上一篇讲到fixture通过scope参数控制setup级别,既然有setup作为用例之前前的操作,用例执行完之后那肯定也有teardown操作. 这里用到fixture的teardown操作并 ...

  5. 加载大量的xml数据 使用压缩方法解决(当然较小时也可以压缩)

    如果你的应该程序必须在运行期间加载一个外部大且冗长的XML文件时,这个方案可能是有用的,通过将XML保存为二进制,你可以压缩数据得到一个较小的文件,当然,你可以得到的压缩的数量取决于数据的复杂性,但它 ...

  6. win7 64位搭建scrapy(转)

    win7 64位系统依赖的scrapy文件链接:http://pan.baidu.com/s/1mgJS7BM 一个很好的python 64位包下载页面:http://www.lfd.uci.edu/ ...

  7. 怎样解决MySQL数据库主从复制延迟的问题

    像Facebook.开心001.人人网.优酷.豆瓣.淘宝等高流量.高并发的网站,单点数据库很难支撑得住,WEB2.0类型的网站中使用MySQL的居多,要么用MySQL自带的MySQL NDB Clus ...

  8. 仿LOL项目开发第二天

    仿LOL项目开发第二天 by草帽 接着上节来讲,上节更新还没开始写代码逻辑,今天我们补充完整. 我们找到VersionManager脚本里面的CheckVersion方法: 首先我们想到检测版本,需要 ...

  9. 如何把rc.local里执行的shell脚本的日志内容放到其他位置

    rc.local的日志内容默认是/var/log/boot.log /etc/rc.d/rc.local文件的文件头是#!/bin/sh ,我们把这修改成#!/bin/sh -x,这样系统启动后就会把 ...

  10. Qt 事件处理机制 (上篇)

    本篇来介绍Qt 事件处理机制 .深入了解事件处理系统对于每个学习Qt人来说非常重要,可以说,Qt是以事件驱动的UI工具集. 大家熟知Signals/Slots在多线程的实现也依赖于Qt的事件处理机制. ...