You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.31 23:36:38