Unity如何获取网格最低Y轴顶点以在该点生成对象
Unity网格Y轴最低点生成对象实现方案
你现有代码存在几处逻辑和语法错误,修正后即可实现需求,具体问题点和实现方式如下:
现有代码问题
- 初始最小值赋值错误:
float minY = float.MinValue是取float类型能存储的最小负数,后续比较无法正确更新最小值,初始值应设为float.MaxValue(float类型最大正数,保证第一个顶点的Y值一定小于初始值) - 最小值计算逻辑错误:
Mathf.Min(pos.y,-pos.y)是取顶点本地Y坐标和其相反数的更小值,并非全局顶点的最小Y;且比较时混用本地坐标Y和世界坐标Y,坐标系不匹配会导致判断完全失效 - 执行顺序错误:边遍历边更新最小值边判断生成,会导致遍历过程中遇到比之前值小的Y就生成对象,最终会在多个非全局最低点生成实例
- 语法错误:
Start()方法后缺少方法体包裹的花括号,会直接编译报错
正确实现代码
public Mesh terrain; public GameObject agents; void Start() { // 获取当前物体的网格 Mesh terrain = GetComponent<MeshFilter>().mesh; List<Vector3> vertices = new List<Vector3>(); terrain.GetVertices(vertices); float minY = float.MaxValue; List<Vector3> worldMinPoints = new List<Vector3>(); // 第一遍遍历:找到全局最小的世界坐标Y值 for (int i = 0; i < vertices.Count; i++) { // 顶点默认是本地坐标,必须转成世界坐标才是场景内实际位置 Vector3 worldPos = transform.TransformPoint(vertices[i]); if (worldPos.y < minY) { minY = worldPos.y; } } // 第二遍遍历:收集所有Y值等于最小值的顶点位置 for (int i = 0; i < vertices.Count; i++) { Vector3 worldPos = transform.TransformPoint(vertices[i]); // 浮点数比较不要直接用==,加极小值容错,避免精度问题导致判断失败 if (Mathf.Abs(worldPos.y - minY) < 0.001f) { worldMinPoints.Add(worldPos); } } // 在所有最低点生成对象,如果只需要生成1个,取第一个点实例化后跳出即可 foreach (Vector3 spawnPos in worldMinPoints) { Instantiate(agents, spawnPos, Quaternion.identity); } terrain.RecalculateBounds(); }
补充说明
- 浮点数相等判断不要直接用
==,因为Unity坐标计算存在浮点精度误差,用差值小于0.001的方式判断容错性更高 - 如果你不需要精准落在顶点位置,只是要生成在网格最低处,可以直接用
terrain.bounds.min获取网格包围盒的最低点,不需要遍历所有顶点,性能更好 - 如果网格后续有动态变形,每次变形后需要重新获取顶点计算最低点
内容的提问来源于stack exchange,提问作者Tedtedted
相关产品推荐
相关产品推荐

