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

Unity技术问题:获取鼠标对应Heightmap高度值结果异常

问题排查与修复方案

1. 鼠标Y轴坐标反转问题

Unity的Input.mousePosition的y轴原点在屏幕左下角,但你的Heightmap(以及噪声图)的y轴大概率是从左上角开始计算的,这会导致点击位置的y坐标完全颠倒,取到的是镜像位置的高度值。

修复代码:

float y = (1 - mousePos.y / Screen.height) * mapHeight;

2. 每次点击重新生成噪声图导致参数不一致

你在Update里每次点击都调用Noise.GenerateNoiseMap,如果生成地图时的参数(比如offset、seed)和最初生成Heightmap时的参数有变化,就会拿到完全不同的噪声数据,自然对应不上。

解决办法:

  • 把噪声图在地图生成时就保存为全局变量,不要每次点击都重新生成:
// 全局变量存储已生成的噪声图
private float[,] generatedNoiseMap;

// 在地图生成的方法里赋值
void GenerateMap()
{
    generatedNoiseMap = Noise.GenerateNoiseMap(mapWidth, mapHeight, seed, noiseScale, octaves, persistance, lacunarity, offset);
    // 后续生成地形/Heightmap的逻辑
}

// 点击时直接用保存好的噪声图
void Update()
{
    if (Input.GetMouseButtonDown(0))
    {
        Vector3 mousePos = Input.mousePosition;
        float x = (mousePos.x / Screen.width) * mapWidth;
        // 修正Y轴
        float y = (1 - mousePos.y / Screen.height) * mapHeight;
        
        // 边界检查,避免数组越界
        if(x >=0 && x < mapWidth && y >=0 && y < mapHeight)
        {
            float height = generatedNoiseMap[(int)x, (int)y];
            Debug.Log(height);
        }
    }
}

3. 噪声值与Heightmap颜色的映射关系不匹配

你的Heightmap显示的颜色是经过映射处理的(比如把噪声值归一化到0-1后转灰度,或者做了曲线调整),而你直接读取的是原始噪声值,自然和视觉上的深浅对应不上。

解决办法:

  • 确保读取高度值时,使用和生成Heightmap时完全相同的映射逻辑。比如如果生成时用了:
// 生成Heightmap时的颜色映射
float normalizedHeight = Mathf.InverseLerp(minNoiseValue, maxNoiseValue, noiseValue);
Color color = Color.Lerp(Color.black, Color.white, normalizedHeight);

那读取后也需要用同样的minNoiseValue和maxNoiseValue做归一化,才能和视觉上的深浅对应。


内容的提问来源于stack exchange,提问作者Fab boy

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 02:15:34