unity编辑器拓展七——脚本创建模型

  描述:

其实这个教程到处都是,我真正想做的是把模型分成N个等分,实现动态加载。但是在网上搜索了很久,也没有搜索

到合适的方法,要么就是不写清楚,舍不得把代码全部放出来。要么就是自带地形的切割,最想要的是,t4m 刷完后直

接将模型分成N分,所以只能苦逼的从最mesh最基础的开始学吧。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEditor;
using System;

public class CreatMesh : Editor {

    [MenuItem("tool/creatMesh")]
    static void CreaMesh()
    {
         creatVertAadTriangels();

    }

    //创建顶点 三角面
    static void creatVertAadTriangels()
    {

        /*mesh属性
         * 长宽
         * 段数
         */
        Vector2 size = new Vector3(10, 10); //长宽(因为是平面,所以就xy了 不要高度了)
        Vector2 segment =new Vector2 (10,10);//xy段数

        /*mesh组成部分
         * 顶点
         * uv
         * 三角形索引
         * 法线
         */
        Vector3[] verters;//顶点数组
        Vector2[] uv;//uv数组
        int[] triangles; //三角形索引

        //1.顶点数组赋值
        int countVert = Mathf.FloorToInt ((segment.x + 1) * (segment.y + 1)); //根据长宽计算出总的顶点数 转换成int类型
        float w = size.x / segment.x; //计算每一段的宽度
        float h = size.y / segment.y; //计算每一段的长度

        int index01 = 0;
        verters = new Vector3[countVert];
        uv = new Vector2[countVert];
        for (int i = 0; i < segment.y + 1; i++)
        {
            for (int j = 0; j < segment.x + 1; j++)
            {
                verters[index01] = new Vector3(j * w, 0, i * h); //创建每个点 (按照xy的段数距离)并且给顶点数组赋值

                float u = j / segment.x;   //每个点在u上面的位置
                float v = i / segment.y;   //每个点在v上面的位置

                uv[index01] = new Vector2(u, v); //将每个点的uv加到uv数组里面

                index01++;
            }
        }

        Vector2[] uv02 = new Vector2[] {new Vector2(0,0), new Vector2(0.5f, 0), new Vector2(1, 0), new Vector2(0, 1), new Vector2(0.5f, 1), new Vector2(1, 1), };

        //3.三角形
        int countVertTri = Mathf.FloorToInt ( segment.x * segment.y * 6); //三角形顶点总数:每1*1段有两个三角形组成  两个三角形有6个点(包含公用的两个点),所有总点数 是段数*6

        int index02 = 0;
        triangles = new int[countVertTri];
        for (int i = 0; i < segment.y; i++)
        {
            for (int j = 0; j < segment.x; j++)
            {
                //顺时针
                int role = Mathf.FloorToInt (segment.x) + 1; //x方向顶点数
                int self = j + (i * role);       // i=0 j=0的时候 第0行第0个点  i=0 j=1的时候 第0行第1个点
                int next = j + ((i + 1) * role); // i=0 j=0的时候 第1行第0个点  i=0 j=1的时候 第1行第1个点

                //第一个正方形
                //顺时针
                //第一个三角形
                triangles[index02] = self;         //i=0 j=0的时候  第0行0个点
                triangles[index02 + 1] = next;     //i=0 j=0的时候  第1行0个点
                triangles[index02 + 2] = next + 1; //i=0 j=0的时候  第1行1个点

                //第二个三角形
                triangles[index02 + 3] = self;     //i=0 j=0的时候  第0行0个点
                triangles[index02 + 4] = next + 1; //i=0 j=0的时候  第1行1个点
                triangles[index02 + 5] = self + 1; //i=0 j=0的时候  第0行1个点         //一次可以实现6个点的排序,两个三角形 拼成一个正方形
                //随着j index的增加 绘制第一行的所有正方形 随着i的增加 一行一行的向上绘制
                index02 += 6;
            }
        }

    //渲染
    //新建mesh,并对它的属性赋值
    Mesh me = new Mesh();
        me.vertices = verters; //mesh顶点赋值
        me.triangles = triangles; //mesh三角形索引赋值
        me.uv = uv;
        me.RecalculateNormals(); //自动添加法线信息
        //新建材质球
        Material ma = new Material(Shader.Find("Diffuse"));

        //新建模型,将mesh跟material给他赋值
        GameObject  m_gameObject = new GameObject("m_newOBJ");//新建一个gameobject
        m_gameObject.AddComponent<MeshFilter>().sharedMesh = me; //增加meshFilter组件
        m_gameObject.AddComponent<MeshRenderer>().sharedMaterial = ma;//增加MeshRenderer组件
    }

}

下一篇不吃不喝一定搞个自动分割的出来

时间: 2024-10-11 02:15:09

unity编辑器拓展七——脚本创建模型的相关文章

在Unity编辑器中增加脚本的中文说明

在游戏中,程序,美术,策划甚至音效都是分工合作的.很多时候,对于unity3d中一堆英文,大家都会看得很郁闷.尤其是不同的程序员,命名方式也不尽相同,甚至还是用拼音.因此,在脚本中增加一些中文显示,就能够很好地解决这个问题. 首先,unity中对于字段(Field)已经有了很好的中文显示方法[Header]标签 比如 using UnityEngine; public class TestScript : MonoBehaviour {     [Header("变量A")]    

编辑器拓展七——不实例化的情况下修改Assets下面的文件

描述 1.今天接了个任务,因为公司的项目展示界面的人物与武器都用了standard与standard(specular steup),这个两个自带的材质球是带雾效的,然后收到场景的影响 在ui界面 角色跟枪械都受到雾效的影响 ,需要将它换成不受雾效影响的shader.于是将这两个shader的源码改了一下,新加在项目中,接下来问题就来了,美术一个一个 去替换?那么多角色枪械如何贴换?如何能做到完全替换?只能靠工具才能完美解决 2.方案 1.要把所有用了这两个shader的材质球路径找出来  通过

(转 )Unity对Lua的编辑器拓展

转 http://blog.csdn.net/ZhangDi2017/article/details/61203505 当前版本的Unity(截至Unity5.5.x)中TextAsset类不支持后缀为lua的文件,将lua文件导入到项目中后,其会被识别为类型为DefaultAsset的文件,即不被Unity原生支持.此外在编辑器模式下也无法直接创建lua文件,需要在文件夹中手动进行创建.经过一番探索,简单实现了在编辑器中创建lua文件和预览lua文件的功能. 一.在编辑器下创建Lua文件 打开

Unity编辑器扩展chapter1

Unity编辑器扩展chapter1 unity通过提供EditorScript API 的方式为我们提供了方便强大的编辑器扩展途径.学好这一部分可以使我们学会编写一些工具来提高效率,甚至可以自制一些小的插件应用的项目工程中去,达到复用的目的.今天首先创建一个新场景生成的菜单项,生成的场景已经绑定好需要的游戏对象及脚本. Tips:1.官方API 2.编辑器扩展脚本都需放在Editor文件夹下,Editor的层级和数目没有要求 EditorUtil.cs :编辑器扩展类,向外部提供编辑器扩展方法

[译]如何在Unity编辑器中添加你自己的工具

在这篇教程中你会学习如何扩展你的Unity3D编辑器,以便在你的项目中更好的使用它.你将会学习如何绘制你自己的gizmo,用代码来实现创建和删除物体,创建编辑器窗口,使用组件,并且允许用户撤销他们所作出的任何动作,这些全部都是用编辑器脚本来实现的. 这篇教程假设你已经熟悉Unity的基本工作流程.如果你知道如何在编辑器中创建物体.预设.场景并且知道如何移动它们,知道如何添加组件,那么你可以开始本教程的学习了. 最终结果预览 让我们看一下我们做出的最终结果是什么样子: 如你所见,我们会创建一个编辑

Unity 编辑器下控制播放粒子

在Unity编辑器的Scene视图进行控制播放粒子ParticleSystem,可以借助方法Simulate,具体可以参照以下例子: 创建一个空对象ParticleAll,在这个对象下添加一个粒子(要添加多个粒子的话,添加到这个粒子之下),此时选中粒子,可以看到Scene视图预览播放粒子效果.附上新脚本EditParticleSystem,此为空脚本,如下: C# Code 1 2 3 4 5 6 using UnityEngine; public class EditParticleSyste

Unity 编辑器下控制播放Animator

在Unity编辑器的Scene视图进行控制播放Animator,可以借助方法StartPlayback.StopPlayback.StartRecording和StopRecording,具体可以参照以下例子: 创建一个带Controller的Animator对象,可以看到此时人物呈现T型姿势.附上新脚本EditAnimator,此为空脚本,如下: C# Code 1 2 3 4 5 6 using UnityEngine; public class EditAnimator : MonoBeh

unity编辑器xml数据库插件

unity编辑器xml数据库插件 程序和数据分离的意义我就不多说了,大家自己脑补或者百度.在使用unity开发时,数据的调试是非常频繁和重要的.我们可以制作一个简单的编辑器插件,将数据显示在Inspector面板上,并进行编辑操作.这样测试人员就可以非常方便的管理测试数据了. 需求很简单,具体的效果是,能读取资源内的类,将其属性显示在面板上,可以对此进行增删改查的操作.如下图所示(对象组,相当于数据库所有的表.对象,相当于表的所有记录). 当需要创建一条新记录的时候,先填上主键,然后点击创建按钮

Unity添加自定义拓展方法

Shepherdog|2014-04-08 10:50|16151次浏览|Unity(373)0 通常你会发现你不能修改正在使用的那些类,无论它是基础的数据类型还是已有框架的一部分,它提供的方法让你困苦不堪.不过..C# 提供了一种巧妙的方式来让你扩充已有的类,也就是我们今天要讲的扩展方法. 扩展方法由于很方便而被经常使用到,我们更愿意叫他语法糖豆(syntactic sugar),一个实用样例是Unity的Transform类,比如:你只想设置Transform.position中Vector