各位对项目感兴趣的看官请移步,这里没有各位需要的代码,本内容仅做阶段记录用。
基类PrimitiveBase
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
/*
* #AuthorName#
* #UpdateTime#
*/
//要求组件
[RequireComponent(typeof(MeshFilter), typeof(MeshRenderer))]
[ExecuteInEditMode]
public class PrimitiveBase : MonoBehaviour {
//定义平面的初始化位置
public Vector3 offset;
//MeshFilter
protected MeshFilter meshFilter;
//定义mesh网格的纹理坐标数组
protected Vector2[] uvs;
//定义mesh网格的三角形顶点索引数组
protected int[] triangles;
//定义mesh网格的顶点数据数组
protected Vector3[] vertices;
//唤醒
private void Awake()
{
//创建对象其他相关属性
Init();
}
void Init()
{
//需要对象的MeshFilter
meshFilter = GetComponent<MeshFilter>();
//需要对象空Mesh
meshFilter.sharedMesh = new Mesh();
}
protected virtual void InitMesh() { }
protected virtual void UpdateShape() { }
protected void UpdateMesh()
{
if (meshFilter.sharedMesh == null)
{
meshFilter.sharedMesh = new Mesh();
}
meshFilter.sharedMesh.vertices = vertices;
meshFilter.sharedMesh.triangles = triangles;
meshFilter.sharedMesh.uv = uvs;
}
//当面板内容改动时,就会自动调用这个方法
private void OnValidate()
{
InitMesh();
}
}
矩形线条RectMesh
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
/*
* #AuthorName#
* #UpdateTime#
*/
public class RectMesh : PrimitiveBase
{
//定义平面的宽和长
public float m_Width;
public float m_Length;
//锚点类型枚举
public enum PirotAlign
{
Left,
Center,
Right
}
//初始化锚点
public PirotAlign widthAlign = PirotAlign.Center;
public PirotAlign lengthAlign = PirotAlign.Center;
//创建Mesh
protected override void InitMesh()
{
uvs = new Vector2[4];
uvs[0].x = 0;
uvs[0].y = 0;
uvs[1].x = 1;
uvs[1].y = 0;
uvs[2].x = 0;
uvs[2].y = 1;
uvs[3].x = 1;
uvs[3].y = 1;
triangles = new int[] { 0, 2, 3, 0, 3, 1 };
UpdateShape();
}
protected override void UpdateShape()
{
vertices = new Vector3[4];
Vector3 localPos = offset;
float w2 = m_Width * 0.5f;
float l2 = m_Length * 0.5f;
switch (widthAlign)
{
case PirotAlign.Left:
vertices[0].x = localPos.x;
vertices[1].x = localPos.x + w2;
vertices[2].x = localPos.x;
vertices[3].x = localPos.x + w2;
break;
case PirotAlign.Center:
vertices[0].x = localPos.x - w2;
vertices[1].x = localPos.x + w2;
vertices[2].x = localPos.x - w2;
vertices[3].x = localPos.x + w2;
break;
case PirotAlign.Right:
vertices[0].x = localPos.x - w2;
vertices[1].x = localPos.x ;
vertices[2].x = localPos.x - w2;
vertices[3].x = localPos.x ;
break;
}
switch (lengthAlign)
{
case PirotAlign.Left:
vertices[0].z = localPos.z;
vertices[1].z = localPos.z;
vertices[2].z = localPos.z + l2;
vertices[3].z = localPos.z + l2;
break;
case PirotAlign.Center:
vertices[0].z = localPos.z - l2;
vertices[1].z = localPos.z - l2;
vertices[2].z = localPos.z + l2;
vertices[3].z = localPos.z + l2;
break;
case PirotAlign.Right:
vertices[0].z = localPos.z - l2;
vertices[1].z = localPos.z - l2;
vertices[2].z = localPos.z;
vertices[3].z = localPos.z;
break;
}
vertices[0].y = vertices[1].y = vertices[2].y = vertices[3].y = localPos.y;
UpdateMesh();
}
}
弧形线条
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
/*
* #AuthorName#
* #UpdateTime#
*/
/// <summary>
/// 我们在这里先设计圆环的mesh,注意继承PrimitiveBase
/// </summary>
public class RingMesh : PrimitiveBase {
//我们先来看绘制的基本概念,我们想要的是圆环,首先要确定分割面
public int segment = 1;
//创建Mesh
protected override void InitMesh()
{
//确保分割面数量大于0
segment = segment > 0 ? segment : 1;
//然后是uv顶点
//如果是我们刚才的分割方式,应该有多少顶点,分割面数
int vertexCount = segment * 2 + 2;
uvs = new Vector2[vertexCount];
//然后是顶点二维坐标
//假设我们分割了segment数量的面,那么我们的uv顶点如下
float singleUV = 1f / segment;
float uvY = 0f;
for (int i = 0; i < vertexCount; i+=2)
{
uvs[i].x = 0f;
uvs[i + 1].x = 0f;
uvs[i].y = uvY;
uvs[i+1].y = uvY;
uvY += singleUV;
}
//然后是三角形顶点
//从矩形思考triangles = new int[] { 0, 2, 3, 0, 3, 1 };
triangles = new int[segment * 2 * 3];
//我们需要创建若干顶点序列
for (int i = 0; i < segment; i++)
{
int k = i * 6;
int j = i * 2;
triangles[k] = j;
triangles[k+1] = j + 2;
triangles[k+2] = j + 3;
triangles[k+3] = j;
triangles[k+4] = j + 3;
triangles[k+5] = j + 1;
}
UpdateShape();
}
网友评论