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

Unity中基于原点的无限平面纹理实现问题咨询

Unity无限平面+纹理相对原点固定实现方案

关于mainTextureOffset与平面尺寸的关系

mainTextureOffset本身和平面尺寸没有直接关联——它作用于UV坐标空间(默认范围0-1,对应纹理的一次完整平铺)。但平面尺寸会通过纹理平铺设置(mainTextureScale)间接影响偏移的视觉效果:

  • 如果平面的UV是默认适配的(比如Unity自带的Quad),平面尺寸越大,纹理会被拉伸得越厉害,此时调整mainTextureOffset的视觉移动距离会看起来更大。
  • 本质上是UV映射的比例问题,而非mainTextureOffset属性本身和平面尺寸绑定。

正确实现纹理相对原点固定的无限平面

你之前尝试的纹理滚动、跟随相机移动平面的思路都无法达到目标,正确的做法是让纹理偏移量跟随相机位置实时计算,让纹理始终与世界原点对齐:

步骤1:设置纹理平铺参数

假设你的平面尺寸是10x10米,想要纹理每1米重复一次:

  • 选中平面的材质,设置Main Texture Scale为(10,10)——这样UV坐标的1单位对应世界空间的1米。

步骤2:编写偏移控制脚本

将以下脚本挂载到平面上:

using UnityEngine;

public class FixedOriginGroundTexture : MonoBehaviour
{
    [Tooltip("纹理在世界空间中每重复一次的尺寸(米)")]
    public float textureWorldRepeatSize = 1f;
    private Renderer _groundRenderer;

    void Start()
    {
        _groundRenderer = GetComponent<Renderer>();
        // 根据平面尺寸和纹理重复尺寸,自动计算平铺参数
        Vector2 scale = new Vector2(
            transform.localScale.x / textureWorldRepeatSize,
            transform.localScale.z / textureWorldRepeatSize
        );
        _groundRenderer.material.mainTextureScale = scale;
    }

    void LateUpdate()
    {
        // 获取相机在XZ平面的位置
        Vector3 cameraPos = Camera.main.transform.position;
        // 计算反向偏移:相机移动时,纹理反向偏移以保持与原点固定
        Vector2 offset = new Vector2(
            -cameraPos.x / textureWorldRepeatSize,
            -cameraPos.z / textureWorldRepeatSize
        );
        _groundRenderer.material.mainTextureOffset = offset;
    }
}

关键原理

相机在世界空间移动时,通过反向调整纹理偏移量,让纹理的坐标始终与世界原点对齐——视觉上就像纹理固定在原点,平面无限延伸(只要平面足够大,或者你用多个平面拼接实现真正的无限)。

注意事项

  • 如果使用URP/HDRP管线,部分材质的纹理偏移属性是_BaseMapOffset而非mainTextureOffset,需要将脚本中的对应属性名替换。
  • 若使用自定义平面模型,确保UV是均匀平铺的,不要用拉伸适配的UV,否则纹理会出现扭曲。
  • 为了避免平面边缘被相机看到,可以创建多个平面拼接,或者在相机移动时动态生成/销毁平面区块(真正的无限平面)。

内容的提问来源于stack exchange,提问作者Filipe Delgado

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 05:17:06