Unity 代码编写 自定义模型

Unity 代码编写 自定义模型


代码很简单没有难度, Plane 模块和 Cube 还是有细微的差别的。
这里我就不点透了,自己去发现吧。哈哈哈…
OK 老规矩,直接上代码:

代码编写 自定义模型(Cube)

Cube的 UV 编码好像有点问题,暂时还没找到,等找到我在更新一版吧。
很烦躁  啊啊啊!!!
using UnityEngine;
using System.Collections;
using System.Collections.Generic;


/// <summary>
/// 代码编写 自定义模型(Cube)
/// </summary>

public class MeshCube : MonoBehaviour
{
    //网格组件
    private MeshFilter _MeshFilter;
    //渲染组件
    private MeshRenderer _MeshRender;
    //碰撞组件
    private MeshCollider _MeshCollider;

    [Header("材质球")]
    public Material _Material;


    //顶点数据
    List<Vector3> _Verts = new List<Vector3>();
    //序号列表
    List<int> _Indices = new List<int>();
    //UV 数据
    Vector2[] _Uvs;



    void Start()
    {
        if (GetComponent<MeshFilter>() == null)
        {
            _MeshFilter = transform.gameObject.AddComponent<MeshFilter>();
        }
        else
        {
            _MeshFilter = GetComponent<MeshFilter>();
        }
        if (GetComponent<MeshRenderer>() == null)
        {
            _MeshRender = transform.gameObject.AddComponent<MeshRenderer>();
        }
        else
        {

            _MeshRender = GetComponent<MeshRenderer>();
        }
        if (GetComponent<MeshCollider>() == null)
        {
            _MeshCollider = transform.gameObject.AddComponent<MeshCollider>();
        }
        else
        {
            _MeshCollider = GetComponent<MeshCollider>();
        }


       
    }

    /// <summary>
    /// 网格渲染
    /// </summary>
    public void BuildCube()
    {

        //顶点信息
        _Verts.Add(new Vector3(0, 0, 0));
        _Verts.Add(new Vector3(1, 0, 0));
        _Verts.Add(new Vector3(1, 0, 1));
        _Verts.Add(new Vector3(0, 0, 1));

        _Verts.Add(new Vector3(0, 1, 0));
        _Verts.Add(new Vector3(1, 1, 0));
        _Verts.Add(new Vector3(1, 1, 1));
        _Verts.Add(new Vector3(0, 1, 1));


        //底
        _Indices.Add(0);
        _Indices.Add(1);
        _Indices.Add(2);
        _Indices.Add(0);
        _Indices.Add(2);
        _Indices.Add(3);
        //顶
        _Indices.Add(4);
        _Indices.Add(7);
        _Indices.Add(6);
        _Indices.Add(4);
        _Indices.Add(6);
        _Indices.Add(5);
        //前
        _Indices.Add(2);
        _Indices.Add(6);
        _Indices.Add(3);
        _Indices.Add(3);
        _Indices.Add(6);
        _Indices.Add(7);
        //后 
        _Indices.Add(0);
        _Indices.Add(5);
        _Indices.Add(1);
        _Indices.Add(0);
        _Indices.Add(4);
        _Indices.Add(5);
        //左
        _Indices.Add(0);
        _Indices.Add(7);
        _Indices.Add(4);
        _Indices.Add(0);
        _Indices.Add(3);
        _Indices.Add(7);
        //右
        _Indices.Add(1);
        _Indices.Add(5);
        _Indices.Add(2);
        _Indices.Add(5);
        _Indices.Add(6);
        _Indices.Add(2);




        #region -----

        顶点UV 构建  Cube为例子 Cube由8个顶点构成
        _Uvs = new Vector2[_Verts.Count];

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

        //_Uvs[4] = new Vector2(0, 0);
        //_Uvs[5] = new Vector2(1, 0);
        //_Uvs[6] = new Vector2(1, 1);
        //_Uvs[7] = new Vector2(0, 1);

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

        //_Uvs[4] = new Vector2(0, 1);
        //_Uvs[5] = new Vector2(1, 1);
        //_Uvs[6] = new Vector2(1, 1);
        //_Uvs[7] = new Vector2(0, 1);

        For 循环编辑 UV  
        //for (int i = 0; i < _Verts.Count;)
        //{
        //    // _Mesh.vertices  注解:  返回顶点位置的副本或分配新的顶点位置数组。
        //    if (_Mesh.vertices[i].x == _Mesh.vertices[i + 1].x && _Mesh.vertices[i].x == _Mesh.vertices[i + 2].x)
        //    {
        //        _Uvs[i] = new Vector2(_Mesh.vertices[i].y, _Mesh.vertices[i].z);

        //        _Uvs[i + 1] = new Vector2(_Mesh.vertices[i + 1].y, _Mesh.vertices[i + 1].z);

        //        _Uvs[i + 2] = new Vector2(_Mesh.vertices[i + 2].y, _Mesh.vertices[i + 2].z);
        //    }
        //    else if (_Mesh.vertices[i].y == _Mesh.vertices[i + 1].y && _Mesh.vertices[i].y == _Mesh.vertices[i + 2].y)
        //    {
        //        _Uvs[i] = new Vector2(_Mesh.vertices[i].x, _Mesh.vertices[i].z);

        //        _Uvs[i + 1] = new Vector2(_Mesh.vertices[i + 1].x, _Mesh.vertices[i + 1].z);

        //        _Uvs[i + 2] = new Vector2(_Mesh.vertices[i + 2].x, _Mesh.vertices[i + 2].z);
        //    }
        //    else if (_Mesh.vertices[i].z == _Mesh.vertices[i + 1].z && _Mesh.vertices[i].z == _Mesh.vertices[i + 2].z)
        //    {
        //        _Uvs[i] = new Vector2(_Mesh.vertices[i].x, _Mesh.vertices[i].y);

        //        _Uvs[i + 1] = new Vector2(_Mesh.vertices[i + 1].x, _Mesh.vertices[i + 1].y);

        //        _Uvs[i + 2] = new Vector2(_Mesh.vertices[i + 2].x, _Mesh.vertices[i + 2].y);
        //    }
        //    else
        //    {
        //        _Uvs[i] = new Vector2(_Mesh.vertices[i].x, _Mesh.vertices[i].y);

        //        _Uvs[i + 1] = new Vector2(_Mesh.vertices[i + 1].x, _Mesh.vertices[i + 1].y);

        //        _Uvs[i + 2] = new Vector2(_Mesh.vertices[i + 2].x, _Mesh.vertices[i + 2].y);
        //    }
        //    i += 3;
        //}


        #endregion

    }


    /// <summary>
    /// 数据清除
    /// </summary>
    private void CleraMeshData()
    {
        _Verts.Clear();
        _Indices.Clear();
        BuildCube();
    }

    /// <summary>
    /// 数据生成
    /// </summary>
    private void Generate()
    {

        //数据清除
        CleraMeshData();
        //Mesh构建以及渲染
        //构造Mesh对象
        Mesh _Mesh = new Mesh();


        //返回顶点位置的副本或分配新的顶点位置数组。
        _Mesh.vertices = _Verts.ToArray();
        //网格中包含所有三角形的数组
        _Mesh.triangles = _Indices.ToArray();

        //For 循环编辑 UV  
        for (int i = 0; i < _Verts.Count;)
        {
            // _Mesh.vertices  注解:  返回顶点位置的副本或分配新的顶点位置数组。
            if (_Mesh.vertices[i].x == _Mesh.vertices[i + 1].x && _Mesh.vertices[i].x == _Mesh.vertices[i + 2].x)
            {
                _Uvs[i] = new Vector2(_Mesh.vertices[i].y, _Mesh.vertices[i].z);

                _Uvs[i + 1] = new Vector2(_Mesh.vertices[i + 1].y, _Mesh.vertices[i + 1].z);

                _Uvs[i + 2] = new Vector2(_Mesh.vertices[i + 2].y, _Mesh.vertices[i + 2].z);

                _Uvs[i + 3] = new Vector2(_Mesh.vertices[i + 3].y, _Mesh.vertices[i + 3].z);
            }
            else if (_Mesh.vertices[i].y == _Mesh.vertices[i + 1].y && _Mesh.vertices[i].y == _Mesh.vertices[i + 2].y)
            {
                _Uvs[i] = new Vector2(_Mesh.vertices[i].x, _Mesh.vertices[i].z);

                _Uvs[i + 1] = new Vector2(_Mesh.vertices[i + 1].x, _Mesh.vertices[i + 1].z);

                _Uvs[i + 2] = new Vector2(_Mesh.vertices[i + 2].x, _Mesh.vertices[i + 2].z);

                _Uvs[i + 3] = new Vector2(_Mesh.vertices[i + 3].x, _Mesh.vertices[i + 3].z);
            }
            else if (_Mesh.vertices[i].z == _Mesh.vertices[i + 1].z && _Mesh.vertices[i].z == _Mesh.vertices[i + 2].z)
            {
                _Uvs[i] = new Vector2(_Mesh.vertices[i].x, _Mesh.vertices[i].y);

                _Uvs[i + 1] = new Vector2(_Mesh.vertices[i + 1].x, _Mesh.vertices[i + 1].y);

                _Uvs[i + 2] = new Vector2(_Mesh.vertices[i + 2].x, _Mesh.vertices[i + 2].y);

                _Uvs[i + 3] = new Vector2(_Mesh.vertices[i + 3].x, _Mesh.vertices[i + 3].y);
            }
            else
            {
                _Uvs[i] = new Vector2(_Mesh.vertices[i].x, _Mesh.vertices[i].y);

                _Uvs[i + 1] = new Vector2(_Mesh.vertices[i + 1].x, _Mesh.vertices[i + 1].y);

                _Uvs[i + 2] = new Vector2(_Mesh.vertices[i + 2].x, _Mesh.vertices[i + 2].y);

                _Uvs[i + 3] = new Vector2(_Mesh.vertices[i + 3].x, _Mesh.vertices[i + 3].y);
            }
            i += 4;
        }

        //网格的基本纹理坐标
        _Mesh.uv = _Uvs;

        //从顶点重新计算网格的边界体积。
        _Mesh.RecalculateBounds();
        //从三角形和顶点重新计算网格的法线
        _Mesh.RecalculateNormals();


        //网格赋予
        _MeshFilter.mesh = _Mesh;
        //材质球赋予
        _MeshRender.material = _Material;
        //碰撞体添加
        _MeshCollider.sharedMesh = _Mesh;

        print(_Mesh.vertices[_int].x);


    }
    public int _int;
    private void Update()
    {
        Generate();
    }
}

代码编写 自定义模型(Plane)

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

/// <summary>
/// 代码编写 自定义模型(Plane)
/// </summary>

public class MeshPlane_ZH : MonoBehaviour
{
    //网格组件
    private MeshFilter _MeshFilter;
    //渲染组件
    private MeshRenderer _MeshRender;
    //碰撞组件
    private MeshCollider _MeshCollider;

    //顶点数据 数组
    private List<Vector3> _Verts;
    private List<int> _Indices;

    [Header("网格渲染行")]
    public int _Row = 2;
    [Header("网格渲染列")]
    public int _Line = 2;

    [Header("网格间距")]
    public float _Width = 0.1f;
    [Header("网格高度")]
    public float _Height = 0.0f;


    [Header("材质球")]
    public Material _Material;
    private Vector2[] _UV;

    void Start()
    {
        _Verts = new List<Vector3>();
        _Indices = new List<int>();

        if (GetComponent<MeshFilter>() == null)
        {
            _MeshFilter = transform.gameObject.AddComponent<MeshFilter>();
        }
        else
        {
            _MeshFilter = GetComponent<MeshFilter>();
        }
        if (GetComponent<MeshRenderer>() == null)
        {
            _MeshRender = transform.gameObject.AddComponent<MeshRenderer>();
        }
        else
        {

            _MeshRender = GetComponent<MeshRenderer>();
        }
        if (GetComponent<MeshCollider>() == null)
        {
            _MeshCollider = transform.gameObject.AddComponent<MeshCollider>();
        }
        else
        {
            _MeshCollider = GetComponent<MeshCollider>();
        }
        Generate();
    }

    /// <summary>
    /// 数据生成
    /// </summary>
    private void Generate()
    {
        //数据清除
        CleraMeshData();
        //数据填充
        AddMeshData();


        //数据传递给 Mesh 生成网格数据
        //构造Mesh对象  
        Mesh _Mesh = new Mesh();
        //顶点数据加载读取
        _Mesh.vertices = _Verts.ToArray();
        //渲染序列加载读取
        _Mesh.triangles = _Indices.ToArray();

        //UV数据加载读取
        _Mesh.uv = _UV;

        //从顶点重新计算网格的边界体积。
        _Mesh.RecalculateNormals();
        //从三角形和顶点重新计算网格的法线
        _Mesh.RecalculateBounds();


        //网格数据加载
        _MeshFilter.mesh = _Mesh;
        //碰撞体添加
        _MeshCollider.sharedMesh = _Mesh;
        //材质球赋予
        _MeshRender.material = _Material;
    }

    /// <summary>
    /// 数据清除
    /// </summary>
    private void CleraMeshData()
    {
        _Verts.Clear();
        _Indices.Clear();
    }

    /// <summary>
    /// 数据填充
    /// </summary>
    private void AddMeshData()
    {

        //顶点赋值
        for (int z = 0; z < _Line; z++)
        {
            for (int x = 0; x < _Row; x++)
            {
                //每个顶点的坐标
                Vector3 p = new Vector3(x, _Height, z) * _Width;
                _Verts.Add(p);
            }
        }

        //三角面渲染  排除最后一行和最后一列
        for (int z = 0; z < _Line - 1; z++)
        {
            for (int x = 0; x < _Row - 1; x++)
            {
                //三角面渲染
                int _Index0 = z * _Row + x;                  //左下角     0
                int _Index1 = z * _Row + x + 1;              //右下角     1
                int _Index2 = (z + 1) * _Row + x + 1;        //右上角     2
                int _Index3 = (z + 1) * _Row + x;            //左上角     3

                //存储渲染序列
                _Indices.Add(_Index0); _Indices.Add(_Index3); _Indices.Add(_Index2); //渲染第一个三角面  0 3 2
                _Indices.Add(_Index0); _Indices.Add(_Index2); _Indices.Add(_Index1); //渲染第二个三角面  0 2 1
            }
        }

        //UV参数设置
        _UV = new Vector2[4];
        _UV[0] = new Vector2(0, 0);
        _UV[1] = new Vector2(0, 1);
        _UV[2] = new Vector2(1, 1);
        _UV[3] = new Vector2(1, 0);
    }
}

暂时先这样吧,如果实在看不明白就留言,看到我会回复的。
对了,还有一点是这个自定义模型代码是有编写UV的【傲娇脸】。
路长远兮,与君共勉。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Maddie_Mo

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值