Keep UVs the same when removing tris

I’m trying to remove the body from a model and leave only the arms for a FPS. This works fine except the UVs get messed up. Any ideas?

Here’s the code:

public static void StripArmsQuick(GameObject target) {
        if (target == null) {
            Debug.Log("No GameObject selected");
        }

//        SetTPose(target);

        Vector3 size = new Vector3(0.45f, 5f, 0.45f);

        Bounds bounds = new Bounds(Vector3.up, size);
        SkinnedMeshRenderer[] skinnedMeshRenderers = target.GetComponentsInChildren<SkinnedMeshRenderer>();
//        Debug.LogError("Stripping arms from " + skinnedMeshRenderers.Length + " meshRends. I aint a real error");
        foreach (SkinnedMeshRenderer skinnedMeshRenderer in skinnedMeshRenderers) {
            List<int> triangleList = new List<int>();
            List<Vector3> vertList = new List<Vector3>();
            List<Vector2> uvList = new List<Vector2>();
            List<Vector3> normalsList = new List<Vector3>();

            Mesh mesh = new Mesh();
            mesh.vertices = skinnedMeshRenderer.sharedMesh.vertices;
            mesh.normals = skinnedMeshRenderer.sharedMesh.normals;
            mesh.uv = skinnedMeshRenderer.sharedMesh.uv;
            mesh.boneWeights = skinnedMeshRenderer.sharedMesh.boneWeights;
            mesh.bindposes = skinnedMeshRenderer.sharedMesh.bindposes;

            Vector3[] vertices = mesh.vertices;

            for (int i = 0; i < vertices.Length; i++) {
                vertList.Add (vertices*);* 

uvList.Add (mesh.uv*);*
normalsList.Add (mesh.normals*);*
}

int[] triangles = mesh.triangles;
for (int i = 0; i < triangles.Length; i += 3) {
if (bounds.Contains(vertices[triangles*]) && bounds.Contains(vertices[triangles[i + 1]]) && bounds.Contains(vertices[triangles[i + 2]])) {*
//In selection
}
else {
triangleList.Add(triangles*);*
triangleList.Add(triangles[i + 1]);
triangleList.Add(triangles[i + 2]);
}
}
mesh.triangles = triangleList.ToArray();

mesh.RecalculateNormals();
mesh.RecalculateBounds();

skinnedMeshRenderer.sharedMesh = mesh;
}
}

I don’t know the answer. Maybe your model is using second UV? (any picture we can see?)

but it feel that…

for (int i = 0; i < vertices.Length; i++) {
              vertList.Add (vertices*);* 

uvList.Add (mesh.uv*);*
normalsList.Add (mesh.normals*);*
}
this part is slow and unnecessary . Every time yo call mesh.uv/mesh.vertices/mesh.normals, it creates a new array

I gave up and did it a different way:

    public static void HideBody(GameObject target) {
        Shader cutoutShader = Shader.Find("Legacy Shaders/Transparent/Cutout/Bumped Diffuse");
        if (cutoutShader == null)
            Debug.LogError("Cutout shader not found");

        Vector3 size = new Vector3(0.45f, 6f, 0.45f);

        Bounds bounds = new Bounds(Vector3.up, size);
        SkinnedMeshRenderer[] skinnedMeshRenderers = target.GetComponentsInChildren<SkinnedMeshRenderer>();
        foreach (SkinnedMeshRenderer skinnedMeshRenderer in skinnedMeshRenderers) {
            Material[] mats = skinnedMeshRenderer.materials;

            foreach (Material mat in mats)
            {
                if (mat.shader != cutoutShader)
                {
                    Texture diffuse = mat.GetTexture("_DiffuseMap");
                    Texture normal = mat.GetTexture("_NormalsMap");

                    mat.shader = cutoutShader;
                    mat.mainTexture = diffuse;
                    mat.SetTexture("_BumpMap", normal);
                    mat.SetFloat("_Cutoff", 1f);
                }
                Texture2D texture = Instantiate(mat.mainTexture) as Texture2D;
                int width = 10, height = 10;
                Color32[] newColors = new Color32[width*height];
                for (int i = 0; i < newColors.Length; i++)
                {
                    newColors *= new Color32(0, 255, 0, 0);*

}
texture.SetPixels32(0, 0, width, height, newColors);
texture.Apply();
mat.mainTexture = texture;
}

Mesh mesh = skinnedMeshRenderer.sharedMesh;
Vector3[] vertices = mesh.vertices;

int[] triangles = mesh.triangles;
Vector2[] uvs = mesh.uv;
for (int i = 0; i < triangles.Length; i += 3) {
if (bounds.Contains(vertices[triangles*]) && bounds.Contains(vertices[triangles[i + 1]]) && bounds.Contains(vertices[triangles[i + 2]])) {*
uvs[triangles*] = new Vector2(0f, 0f);*
uvs[triangles[i+1]] = new Vector2(0.001f, 0f);
uvs[triangles[i+2]] = new Vector2(0f, 0.001f);
}
else {
//In selection
}
}
mesh.uv = uvs;
skinnedMeshRenderer.sharedMesh = mesh;
}
}