将.obj模型导入Unity3D

时间:2017-05-03 20:41:42

标签: c# unity3d

我发现了其他一些有类似问题的帖子,以及一个应该使用ObjLoader类(Loading a .OBJ into Unity at runtime)的代码(http://wiki.unity3d.com/index.php?title=ObjImporter

不幸的是,由于我实际上收到了错误,而其他人不知道,这对我没有用。

我得到" IndexOutOfRangeException",这通常是使用数组的简单初学者错误,但由于代码似乎适用于其他人,我猜这是误导性的,问题更深层次。

我想问题是,我想将网格物体附加到实际的游戏物体上,但我无法弄清楚,如何正确地做到这一点。

任何建议表示赞赏。

我的代码

        // 1. Create an controller (this will be the pivot point later)
        GameObject controller = new GameObject(bo.objectName + " Controller");

        // 2. Create an primitive object, and set it as child
        GameObject sphere = GameObject.CreatePrimitive(PrimitiveType.Sphere);
        sphere.transform.position = new Vector3(0, 0, 0);
        sphere.transform.SetParent(controller.transform);
        sphere.name = bo.objectName;

        // 3. Give it a custom mesh
        Mesh holderMesh = sphere.GetComponent<Mesh>();
        ObjImporter newMesh = new ObjImporter();
        holderMesh = newMesh.ImportFile(bo.modelPath);//"C:/Users/Fuby/Desktop/Test Object.obj"
        sphere.GetComponent<MeshFilter>().mesh = holderMesh;

ObjImporter代码

List<int> intArray = new List<int>();

while (j < brokenString.Length && ("" + brokenString[j]).Length > 0)
{
  Vector3 temp = new Vector3();
  brokenBrokenString = brokenString[j].Split(splitIdentifier2, 3); //Separate the face into individual components (vert, uv, normal)
  temp.x = System.Convert.ToInt32(brokenBrokenString[0]);
  if (brokenBrokenString.Length > 1)                                  //Some .obj files skip UV and normal
  {
    if (brokenBrokenString[1] != "")                                    //Some .obj files skip the uv and not the normal
    {
      temp.y = System.Convert.ToInt32(brokenBrokenString[1]);
    }
    temp.z = System.Convert.ToInt32(brokenBrokenString[2]); //IndexOutOfRangeException
  }
  j++;

  mesh.faceData[f2] = temp;
  intArray.Add(f2);
  f2++;
}

1 个答案:

答案 0 :(得分:0)

解决。上面的代码有效。就像古斯曼说的那样,.objs需要一张紫外线地图。但问题是.objs的C4D导出。只需使用Blender进行导出即可。它将添加.mtl文件,它将起作用!

感谢Gusman的支持。