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
相关产品推荐
相关产品推荐

