• unity3d 公告板


    Unity 自带具有一个平面的原始对象,但一个简单的平面在2D游戏或GUI可能是有用的,在任何情况下作出一个好的开始例子。一个最小的平面包含四个顶点,界定两个三角形的边角。

    第一件事就是设置顶点数组。我们假设,这个平面在X和Y轴上(就是XOY平面),让参数变量确定其宽度和高度。我们将按顺序、左下角、右下角,左上角,右上角提供顶点。

    var vertices: Vector3[] = new Vector3[4];

    vertices[0] = new Vector3(0, 0, 0);
    vertices[1] = new Vector3(width, 0, 0);
    vertices[2] = new Vector3(0, height, 0);
    vertices[3] = new Vector3(width, height, 0);

    mesh.vertices = vertices;

    (由于网格数据属性在场景后执行代码,在自己的数组建立数据然后赋予属性,更为有效,而不是一个一个地访问属性数组元素)

    接下来是三角形。因为我们想要两个三角形,每个三角形由三个整数界定,三角形数组总共拥有六个元素。记住边角顺时针排序规则,左下角的三角形将使用0,2,1作为索引,1,而右上角的用2,3,1。

    var tri: int[] = new int[6];

    // Lower left triangle.
    tri[0] = 0;
    tri[1] = 2;
    tri[2] = 1;

    // Upper right triangle.
    tri[3] = 2;
    tri[4] = 3;
    tri[5] = 1;

    mesh.triangles = tri;

    具有顶点和三角形的网格,将在编辑器中可见,但好像没什么效果,因为它没有法线,不能正确着色。平面上的法线是很简单的 - 他们都是相同的,在平面的本地空间, 顶点指向Z轴负方向。添加了法线,平面可以正确着色,但记住,你需要在场景添加一个灯光才能看到效果。
    var normals: Vector3[] = new Vector3[4];

    normals[0] = -Vector3.forward;
    normals[1] = -Vector3.forward;
    normals[2] = -Vector3.forward;
    normals[3] = -Vector3.forward;

    mesh.normals = normals;

    最后,添加纹理坐标网格使其能够正确显示材质。假设我们要显示整个平面的图像,UV值都会是0或1,对应到的纹理的边角点。

    var uv: Vector2[] = new Vector2[4];

    uv[0] = new Vector2(0, 0);
    uv[1] = new Vector2(1, 0);
    uv[2] = new Vector2(0, 1);
    uv[3] = new Vector2(1, 1);

    mesh.uv = uv;

    完整的脚本可能像这样:

    var float;
    var height: float;

    function Start() {
    var mf: MeshFilter = GetComponent(MeshFilter);
    var mesh = new Mesh();
    mf.mesh = mesh;

    var vertices: Vector3[] = new Vector3[4];

    vertices[0] = new Vector3(0, 0, 0);
    vertices[1] = new Vector3(width, 0, 0);
    vertices[2] = new Vector3(0, height, 0);
    vertices[3] = new Vector3(width, height, 0);

    mesh.vertices = vertices;

    var tri: int[] = new int[6];

    tri[0] = 0;
    tri[1] = 2;
    tri[2] = 1;

    tri[3] = 2;
    tri[4] = 3;
    tri[5] = 1;

    mesh.triangles = tri;

    var normals: Vector3[] = new Vector3[4];

    normals[0] = -Vector3.forward;
    normals[1] = -Vector3.forward;
    normals[2] = -Vector3.forward;
    normals[3] = -Vector3.forward;

    mesh.normals = normals;

    var uv: Vector2[] = new Vector2[4];

    uv[0] = new Vector2(0, 0);
    uv[1] = new Vector2(1, 0);
    uv[2] = new Vector2(0, 1);
    uv[3] = new Vector2(1, 1);

    mesh.uv = uv;
    }

    请注意,如果执行的代码是放在Start 函数里执行一次,那么网格在整个游戏都不变。但是,您可以很容易地把代码放在Update函数里,让网格每一帧都发生改变(虽然这样会大大增加CPU开销)。

  • 相关阅读:
    JS 定义函数的参数的个数,传入参数的个数对调用的影响
    jQuery常见操作总结
    jQuery hover事件
    Ajax实现登陆并友好提示错误信息
    JS实现弹出登录框
    .NET源码 SortedSet(红黑树)
    C#链接SQL Server数据库
    628. Maximum Product of Three Numbers 最大的三个数的乘积
    501. Find Mode in Binary Search Tree 找二叉搜索树的众数
    235. Lowest Common Ancestor of a Binary Search Tree 二叉搜索树的LCA
  • 原文地址:https://www.cnblogs.com/RenderLife/p/3261578.html
Copyright © 2020-2023  润新知