| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101 |
- using UnityEngine;
- [ExecuteInEditMode] // 编辑器下也能直接运行
- public class CloudPlaneGenerator : MonoBehaviour
- {
- [Header("细分度(推荐 80~150,手机别超200)")]
- public int subdivisions = 120;
- [Header("平面大小(世界单位)")]
- public float size = 200f; // 最终平面宽高 200×200 米
- [Header("一键生成(Play模式或编辑器都行)")]
- public bool generateNow = false;
- private void Update()
- {
- if (generateNow)
- {
- generateNow = false; // 防止连续生成
- Generate();
- }
- }
- [ContextMenu("手动生成云海平面")] // 右键组件 → 手动生成云海平面
- public void Generate()
- {
- // 确保有组件
- var filter = GetComponent<MeshFilter>();
- if (filter == null) filter = gameObject.AddComponent<MeshFilter>();
- var renderer = GetComponent<MeshRenderer>();
- if (renderer == null) renderer = gameObject.AddComponent<MeshRenderer>();
- Mesh mesh = new Mesh();
- mesh.name = "CloudSea_Plane";
- int vertsX = subdivisions + 1;
- int vertsZ = subdivisions + 1;
- Vector3[] vertices = new Vector3[vertsX * vertsZ];
- Vector2[] uv = new Vector2[vertsX * vertsZ];
- int[] triangles = new int[subdivisions * subdivisions * 6];
- float uvStep = 1f / subdivisions;
- float posStep = size / subdivisions;
- for (int z = 0; z < vertsZ; z++)
- {
- for (int x = 0; x < vertsX; x++)
- {
- int i = x + z * vertsX;
- // 位置:从 -size/2 到 +size/2
- vertices[i] = new Vector3(
- x * posStep - size * 0.5f,
- 0,
- z * posStep - size * 0.5f
- );
- // UV 仍然是 0~1,方便后面 Tiling 参数控制
- uv[i] = new Vector2(x * uvStep, z * uvStep);
- }
- }
- // 生成三角形
- int tri = 0;
- for (int z = 0; z < subdivisions; z++)
- {
- for (int x = 0; x < subdivisions; x++)
- {
- int i = x + z * vertsX;
- triangles[tri++] = i;
- triangles[tri++] = i + vertsX;
- triangles[tri++] = i + 1;
- triangles[tri++] = i + 1;
- triangles[tri++] = i + vertsX;
- triangles[tri++] = i + vertsX + 1;
- }
- }
- mesh.vertices = vertices;
- mesh.uv = uv;
- mesh.triangles = triangles;
- mesh.RecalculateNormals();
- mesh.RecalculateBounds();
- filter.sharedMesh = mesh;
- // 自动放大(很多人忘记这一步!)
- transform.localScale = Vector3.one;
- // 如果没有材质,给一个默认的防止粉红
- if (renderer.sharedMaterial == null)
- {
- renderer.sharedMaterial = new Material(Shader.Find("Universal Render Pipeline/Unlit"));
- }
- Debug.Log($"云海平面生成完成!顶点数:{vertices.Length} 三角形:{triangles.Length / 3}");
- }
- }
|