Unity:根据平面缩放比例自动重复纹理的实现难题
平面纹理自动重复修复方案
核心问题分析
Unity默认平面的Mesh结构(顶点数量、UV索引布局)和立方体完全不同,且平面默认尺寸为10x10(X/Z轴),直接复用立方体的UV设置逻辑会导致纹理破碎。
修复步骤
1. 调整默认尺寸检测
修改CheckForDefaultSize()函数,适配平面的默认参数:
private void CheckForDefaultSize() { // 创建临时平面获取默认尺寸 GameObject tempPlane = GameObject.CreatePrimitive(PrimitiveType.Plane); // 平面默认X/Z轴尺寸为10,Y轴厚度可忽略 defaultSizeX = tempPlane.transform.localScale.x * 10f; defaultSizeZ = tempPlane.transform.localScale.z * 10f; DestroyImmediate(tempPlane); }
2. 重写UV设置逻辑
替换原立方体的UV赋值代码,针对平面的Mesh结构处理:
private void UpdateUVs() { Mesh mesh = GetComponent<MeshFilter>().mesh; Vector2[] meshUVs = new Vector2[mesh.vertices.Length]; // 获取当前缩放比例,对应纹理重复次数 float scaleX = transform.localScale.x; float scaleZ = transform.localScale.z; // 遍历所有顶点,根据本地位置计算UV for (int i = 0; i < mesh.vertices.Length; i++) { Vector3 localPos = mesh.vertices[i]; // 平面默认X范围是-5到5,归一化后乘以缩放比例得到UV重复次数 float uvX = (localPos.x / 5f) * scaleX; // 平面默认Z范围是-5到5,同理处理UV Y轴 float uvY = (localPos.z / 5f) * scaleZ; meshUVs[i] = new Vector2(uvX, uvY); } mesh.uv = meshUVs; mesh.RecalculateBounds(); }
3. 确保纹理设置正确
- 选中平面的材质,将纹理的Wrap Mode设置为
Repeat(否则UV超过1的部分会被截断) - 若使用SRP材质,需确认纹理的重复属性已启用
效果验证
- 当平面缩放为3x1x1时,X轴纹理重复3次,Z轴保持1次
- 缩放为2x1x2时,X/Z轴纹理各重复2次
内容的提问来源于stack exchange,提问作者Meowing
相关产品推荐
相关产品推荐

