我发现了其他一些有类似问题的帖子,以及一个应该使用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++;
}
答案 0 :(得分:0)
解决。上面的代码有效。就像古斯曼说的那样,.objs需要一张紫外线地图。但问题是.objs的C4D导出。只需使用Blender进行导出即可。它将添加.mtl文件,它将起作用!
感谢Gusman的支持。