用了那个dynamic bone插件,很牛逼。。啥时候我弄出个这个也发了。
image.png
里面有一根白线,这个尾巴的网格完全跟随白线晃动
image.png
但是我自己做的这个圆柱体不会跟着白线一起扭动;询问了一下,可能是因为我这个东西网格太少的缘故。
image.png
然后想给我这个东西添加网格,先从最简单的画网格学起吧。
https://blog.csdn.net/qq_29579137/article/details/77369734
今天是八月20号,这破玩意画了一天。一堆点,一堆三角形,画蒙圈了。。
万事开头难,而且这玩意确实繁琐。我接受我的低效率,毕竟也是弄出来了对吧
image.png
上代码:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
[AddComponentMenu("WxjTest/AddMesh")]
[RequireComponent(typeof(MeshFilter), typeof(MeshRenderer))]
public class CreateSelfMesh : MonoBehaviour {
[ContextMenu("WenDebug")]
public void WenDebug()
{
Debug.Log(000);
}
public int xSize, ySize;
public float Radius;
private Mesh mesh;
private void Awake()
{
xSize = 10;
ySize = 10;
Radius = 1;
StartCoroutine(Generate());
}
//顶点
private Vector3[] vertexs;
//三角形连线顺序
private int[] triangles;
private IEnumerator Generate()
{
WaitForSeconds wait = new WaitForSeconds(2f);
GetComponent<MeshFilter>().mesh = mesh = new Mesh();
mesh.name = "TestMesh";
//网格数
vertexs = new Vector3[(xSize) * (ySize + 1) + 2]; //要画一个圆柱体的顶点
//第一个和最后一个点
vertexs[0] = Vector3.zero;
vertexs[vertexs.Length - 1] = new Vector3(0, ySize, 0);
//先画第一圈
//计算x,z坐标
//x个点平分一张饼
float Angle = 2 * Mathf.PI / xSize;
for(int i = 1; i <= xSize; i ++)
{
vertexs[i] = new Vector3(Radius * Mathf.Cos(Angle * i), 0, Radius * Mathf.Sin(Angle * i));
}
//后面的点根据饼形状增加y
for(int i = xSize + 1;i < vertexs.Length - 1;i ++)
{
int yIndex = i / xSize;
int xIndex = i % xSize;
if(xIndex == 0)
{
//正常来说是刚好整除,但是需要的是 yInxex - 1 余 xSize
yIndex = yIndex - 1;
xIndex = xSize;
}
vertexs[i] = new Vector3(vertexs[xIndex].x, yIndex, vertexs[xIndex].z);
}
mesh.vertices = vertexs;
//查看点位置
for (int i = 0; i < vertexs.Length; i++)
{
GameObject obj = new GameObject(i.ToString());
obj.transform.position = vertexs[i];
}
//顶点顺序(绘制三角形)
int updownCount = 3 * xSize * 2;
int roundCount = ySize * xSize * 6;
int[] triangles = new int[updownCount + roundCount];
//画三角形
//先画上下面,下面逆时针,上面顺时针
//下面(0-29)
for (int i = 0; i < xSize * 3; i++)
{
int yu = i % 3;
int chu = i / 3;
if (yu == 0)
{
triangles[i] = 0;
}
if (yu == 1)
{
triangles[i] = chu + 1;
}
if (yu == 2)
{
if (chu != xSize - 1)
{
triangles[i] = chu + 2;
}
else
{
triangles[i] = 1;
}
}
}
int curTriangleIndex = xSize * 3; //第31个点
//中间
for(int i = 1;i <= ySize * xSize;i ++ )
{
triangles[curTriangleIndex + 3] = triangles[curTriangleIndex] = i;
triangles[curTriangleIndex + 5] = triangles[curTriangleIndex + 1] = i + xSize + 1;
triangles[curTriangleIndex + 2] = i + 1;
triangles[curTriangleIndex + 4] = i + xSize;
if(i % 10 == 0)
{
triangles[curTriangleIndex + 1] -= 10;
triangles[curTriangleIndex + 5] -= 10;
triangles[curTriangleIndex + 2] -= 10;
}
curTriangleIndex += 6;
}
//Debug.Log(triangles.Length - curTriangleIndex);
int vertexIndexAdd = xSize * ySize;
//上面
for (int i = 0; i < xSize * 3; i++)
{
int yu = i % 3;
int chu = i / 3;
if (yu == 0)
{
triangles[i + curTriangleIndex] = vertexs.Length - 1;
}
if (yu == 1)
{
triangles[i + curTriangleIndex] = chu + 1 + vertexIndexAdd;
}
if (yu == 2)
{
if (chu != 0)
{
triangles[i + curTriangleIndex] = chu + vertexIndexAdd;
}
else
{
triangles[i + curTriangleIndex] = xSize + vertexIndexAdd;
}
}
}
mesh.triangles = triangles;
// 网格自动计算法线向量
mesh.RecalculateNormals();
yield return wait;
}
//画半径为0.1的小圆球
private void OnDrawGizmos()
{
Gizmos.color = Color.black;
if (vertexs == null) return;
for(int i = 0;i < vertexs.Length;i ++)
{
Gizmos.DrawSphere(vertexs[i], 0.1f);
}
}
}
保存mesh到磁盘最简单的方法(using UnityEditor,打包时没用)
https://blog.csdn.net/tinyhum3d/article/details/24009909