unity代码创建草和模拟风的效果

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
void Start()
{
    Test4();
}
 
//草
private Vector3[] grassArray = new Vector3[7];
private GameObject grassobj;
void Test4()
{
    GameObject obj = new GameObject();
    obj.name = "grass";
    grassobj = obj;
    MeshFilter meshFilter = obj.AddComponent<MeshFilter>();
    //mesh的顶点,按照图的我们顺时针写就行
    Vector3[] newVertices =
    {
        new Vector3(0, 0, 0), new Vector3(0 ,1 ,0) , new Vector3(0, 2, 0), new Vector3(0, 3, 0),
        new Vector3(0.3f, 2 ,0 ), new Vector3(0.6f, 1 , 0), new Vector3(0.9f, 0 ,0)
    };
    grassArray = newVertices;
    //uV坐标,照抄上面的,去除z
    Vector2[] newUV =
    {
        new Vector2(0, 0), new Vector2(0, 1), new Vector2(0, 2), new Vector2(0, 3),
        new Vector2(0.3f, 2), new Vector2(0.6f, 1), new Vector2(0.9f,0)
    };
    int[] newTriangles =
    {
        2,3,4,1,2,4,1,4,5,0,1,5,0,5,6,//顺时针渲染正面
        2,4,3,1,4,2,1,5,4,0,5,1,0,6,5//逆时针渲染背面
    };
    Mesh mesh = new Mesh();
    meshFilter.mesh = mesh;
    //顶点 三角面 uv
    mesh.vertices = grassArray;
    mesh.uv = newUV;
    mesh.triangles = newTriangles;
    //渲染
    MeshRenderer renderer = obj.AddComponent<MeshRenderer>();
    Material mat = new Material (Shader.Find("Standard"));
    mat.color = Color.green;
    renderer.material = mat;
}
 
public float wind;
Vector3[] baseVertices =
{
    new Vector3(0, 0, 0), new Vector3(0 ,1 ,0) , new Vector3(0, 2, 0), new Vector3(0, 3, 0),
    new Vector3(0.3f, 2 ,0 ), new Vector3(0.6f, 1 , 0), new Vector3(0.9f, 0 ,0)
};
// Update is called once per frame
void Update()
{
    //模拟草被风影响
    //顶点高度越高的草越容易被影响
    wind = Mathf.Sin(Time.time);//sin波
    for (int i = 0; i < grassArray.Length; i++)
    {
        if (grassArray[i].y == 3)
        {
            //高度为3的草
            grassArray[i].x = baseVertices[i].x + (wind * baseVertices[i].y * 0.2f);
        }
        else if (grassArray[i].y == 2)
        {
            //高度为2的草
            grassArray[i].x = baseVertices[i].x + (wind * baseVertices[i].y * 0.15f);
        }
        else if (grassArray[i].y == 1)
        {
            //高度为1的草
            grassArray[i].x = baseVertices[i].x + (wind * baseVertices[i].y * 0.1f);
        }
    }
 
    grassobj.GetComponent<MeshFilter>().mesh.vertices = grassArray;
}

  

通过代码创建的草的mesh

y轴单位是1

0到6的距离是0.9

 

一棵草左右摇摆

写法比较粗糙,后面再研究下更好的写法

posted @   三页菌  阅读(2185)  评论(0编辑  收藏  举报
编辑推荐:
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~
历史上的今天:
2018-01-08 adb调试安卓
点击右上角即可分享
微信分享提示