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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 08:47:00