Search Unity

  1. Welcome to the Unity Forums! Please take the time to read our Code of Conduct to familiarize yourself with the forum rules and how to post constructively.
  2. We have updated the language to the Editor Terms based on feedback from our employees and community. Learn more.
    Dismiss Notice

CombineMesh the UV has problem.

Discussion in 'Scripting' started by jikks, Jun 15, 2020.

  1. jikks

    jikks

    Joined:
    Nov 21, 2017
    Posts:
    15
    The man's rightLeg is black, is there anyone know the problem?

    wrongImg.png

    there are my core code bellow:


    for (int i = 0; i < targetParts.Length; i++)
    {
    SkinnedMeshRenderer pointSMR = targetParts.GetComponent<SkinnedMeshRenderer>();
    List_Matrials.Add(pointSMR.material);
    for (int sub = 0; sub < pointSMR.sharedMesh.subMeshCount; sub++)
    {
    CombineInstance ci = new CombineInstance();
    ci.mesh = pointSMR.sharedMesh;
    ci.subMeshIndex = sub;
    combineInstances.Add(ci);
    }

    uvList.Add(pointSMR.sharedMesh.uv);
    uvCount += pointSMR.sharedMesh.uv.Length;

    Renderer tempRD = pointSMR.GetComponent<Renderer>();

    if (tempRD.material.mainTexture != null)
    {
    textures.Add(tempRD.material.mainTexture as Texture2D);
    width += tempRD.material.mainTexture.width;
    height += tempRD.material.mainTexture.height;
    }

    for (int bi = 0; bi < pointSMR.bones.Length; bi++)
    {
    for (int ti = 0; ti < transforms.Length; ti++)
    {
    if (transforms[ti].name != pointSMR.bones[bi].name) continue;
    boneList.Add(transforms[ti]);
    break;
    }
    }
    }

    SkinnedMeshRenderer tempRenderer = root.gameObject.GetComponent<SkinnedMeshRenderer>();
    if (!tempRenderer)
    {
    tempRenderer = root.gameObject.AddComponent<SkinnedMeshRenderer>();
    }
    tempRenderer.sharedMesh = new Mesh();

    tempRenderer.sharedMesh.CombineMeshes(combineInstances.ToArray(), true, false);
    tempRenderer.bones = boneList.ToArray();

    Material newMaterial = new Material(List_Matrials[0].shader);
    newMaterial.CopyPropertiesFromMaterial(List_Matrials[0]);
    tempRenderer.material = newMaterial;

    Texture2D skinnedMeshAtlas = new Texture2D(1, 1);
    Rect[] packingResult = skinnedMeshAtlas.PackTextures(textures.ToArray(), 0)

    Vector2[] atlasUVs = new Vector2[uvCount];

    int UvIndex = 0;
    for (int i = 0; i < uvList.Count; i++)
    {
    for (int j = 0; j < uvList.Length; j++)
    {
    atlasUVs[UvIndex].x = packingResult.x + uvList[j].x * packingResult.width;
    atlasUVs[UvIndex].y = packingResult.y + uvList[j].y * packingResult.height;

    UvIndex++;
    }
    }

    tempRenderer.material.mainTexture = skinnedMeshAtlas;
    tempRenderer.sharedMesh.uv = atlasUVs;
     
  2. Kurt-Dekker

    Kurt-Dekker

    Joined:
    Mar 16, 2013
    Posts:
    36,971
  3. jikks

    jikks

    Joined:
    Nov 21, 2017
    Posts:
    15
    Thanks , i found it's the UV's problem. The modle's rightLeg UV are negative:(
     
    Kurt-Dekker likes this.