Unity中mesh次要通过Vertexs(顶点)、Normals(法线)、Triangles(三角面)、UVs(uv坐标)这四个局部数据生成。
一、Mesh的轴心地位的类型
通过这个类型判断生成坐标的偏移量

 public enum MeshPivot    {        /// <summary>        /// 核心        /// </summary>        CENTER,        /// <summary>        /// 上        /// </summary>        TOP,        /// <summary>        /// 下        /// </summary>        BOTTOM,        /// <summary>        /// 左        /// </summary>        LEFT,        /// <summary>        /// 右        /// </summary>        RIGHT,        /// <summary>        /// 前        /// </summary>        FRONT,        /// <summary>        /// 后        /// </summary>        BACK,    }

二、形态父类
设置成抽象类,须要必须要继承这个类并实现相干形象办法

 public abstract class Shape    {        #region protected members        protected MeshPivot _meshPivot = MeshPivot.CENTER;//轴心的地位        protected string _meshName;        protected Vector3 _verticeOffset;//顶点的偏移量        protected Vector3[] _vertices;//顶点数据        protected Vector3[] _normals;//法线数据        protected int[] _triangles;//三角面顶点的索引数据        protected Vector2[] _uvs;//uv坐标数据        protected Mesh _shapeMesh;//保留生成的mesh        #endregion        #region public properties        /// <summary>        /// 轴心的地位        /// </summary>        public MeshPivot MeshPivot        {            get { return _meshPivot; }        }        /// <summary>        /// 顶点数据        /// </summary>        public Vector3[] Vertices        {            get            {                if (_vertices == null) _vertices = GetVertices();                return _vertices;            }        }        /// <summary>        /// 法线数据        /// </summary>        public Vector3[] Normals        {            get            {                if (_normals == null) _normals = GetNormals();                return _normals;            }        }        /// <summary>        /// 三角面顶点的索引数据        /// </summary>        public int[] Triangles        {            get            {                if (_triangles == null) _triangles = GetTriangles();                return _triangles;            }        }        /// <summary>        /// uv坐标数据        /// </summary>        public Vector2[] UVs        {            get            {                if (_uvs == null) _uvs = GetUVs();                return _uvs;            }        }        /// <summary>        /// 生成的mesh数据        /// </summary>        public Mesh ShapeMesh        {            get            {                if (_shapeMesh == null) _shapeMesh = GenerateMesh();                return _shapeMesh;            }        }        #endregion        #region ctor        public Shape(MeshPivot meshPivot, string meshName)        {            _meshPivot = meshPivot;            _meshName = meshName;        }        #endregion        #region protected functions        /// <summary>        /// 生成mesh        /// </summary>        /// <returns></returns>        protected Mesh GenerateMesh()        {            var mesh = new Mesh();            mesh.name = _meshName;            _vertices = GetVertices();            _normals = GetNormals();            _triangles = GetTriangles();            _uvs = GetUVs();            mesh.vertices = _vertices;            mesh.normals = _normals;            mesh.triangles = _triangles;            mesh.uv = _uvs;            mesh.RecalculateTangents();            mesh.RecalculateBounds();            mesh.Optimize();            return mesh;        }        #endregion        #region abstract        /// <summary>        /// 依据mesh中心点的地位,取得顶点地位的偏移量        /// </summary>        /// <returns></returns>        protected abstract Vector3 GetVertexOffset();        /// <summary>        /// 取得顶点的数据汇合        /// </summary>        /// <returns></returns>        protected abstract Vector3[] GetVertices();        /// <summary>        /// 取得法线方向的数据汇合        /// </summary>        /// <returns></returns>        protected abstract Vector3[] GetNormals();        /// <summary>        /// 取得三角面顶点的索引        /// </summary>        /// <returns></returns>        protected abstract int[] GetTriangles();        /// <summary>        /// 取得UV坐标的数据汇合        /// </summary>        /// <returns></returns>        protected abstract Vector2[] GetUVs();        #endregion        #region protected static functions        /// <summary>        /// 取得圆心切割的边数(依照固定长度)        /// </summary>        /// <param name="radius">半径</param>        /// <param name="arcLen">弧度的长度</param>        /// <returns></returns>        protected static int GetCircularSideCount(float radius, float arcLen = 0.1f)        {            const int minSideCount = 3;            const int maxSideCount = 3000;            int sideCount = Mathf.RoundToInt(Mathf.PI * 2 * radius / arcLen);            sideCount = Mathf.Min(Mathf.Max(minSideCount, sideCount), maxSideCount);            Debug.Log("sideCount:" + sideCount);            return sideCount;        }        #endregion    }