【问题标题】:Loading a .OBJ into Unity at runtime在运行时将 .OBJ 加载到 Unity
【发布时间】:2015-10-13 16:32:36
【问题描述】:

我的工作是编写代码,在运行时将 .OBJ 加载到 Unity 中。 Unity 在其wiki 页面中提供了示例代码。我使用以下代码来使用链接中给出的类:

public class Main : MonoBehaviour {

    // Use this for initialization
    void Start () {
        Mesh holderMesh = new Mesh ();
        ObjImporter newMesh = new ObjImporter();
        holderMesh = newMesh.ImportFile("C:/Users/cvpa2/Desktop/ng/output.obj");
    }

我在 Unity Monodevelop 中没有收到任何错误,但模型也没有加载。 可能的解决方案是什么?

【问题讨论】:

  • 你试过调试吗?
  • 首先尝试导入一个简单的多维数据集并隔离,如果不是您的 obj 文件具有此类未提供的不常见的东西,但我认为您无法逃避调试它以查看它在哪里迷路

标签: c# unity3d


【解决方案1】:

仅仅创建一个 Mesh 对象是不够的。您至少还需要做两件事:

  • 创建 MeshRenderer 组件
  • 创建一个 MeshFilter 组件

因此,如果您将代码更改为以下内容,您至少应该看到您的网格是否已成功创建。

using UnityEngine;
using System.Collections;

public class Main : MonoBehaviour
{

    // Use this for initialization
    void Start()
    {
        Mesh holderMesh = new Mesh();
        ObjImporter newMesh = new ObjImporter();
        holderMesh = newMesh.ImportFile("C:/Users/cvpa2/Desktop/ng/output.obj");

        MeshRenderer renderer = gameObject.AddComponent<MeshRenderer>();
        MeshFilter filter = gameObject.AddComponent<MeshFilter>();
        filter.mesh = holderMesh;
    }
}

从那时起,您仍然需要分配材质(如果已加载/创建)和其他类似的东西,但这将是一个开始。

【讨论】:

  • 谢谢@Bart,我也试过了。物体仍然没有出现在主相机中。 (不过,我可以在“网格过滤器”选项卡中看到它)
  • 上面的确切代码适用于我通过导出 Blender 的默认场景创建的简单立方体 .obj 文件(当然路径不同)。如果您要加载更复杂的内容,请返回简单的内容。看看这是否可行。如果是这样,请检查网格的情况。如果没有,您必须确保自己的代码和设置正常。
  • 看来ObjImporter是错的。那里有一些似乎没有意义的代码,它肯定会在大文件上中断。它使用面数来定义顶点数组的大小(应该明显更小),所以 Unity 会在实际低于 65000 时抱怨顶点数超过 65000。
  • @Everts 你真的尝试过直接导入网格吗?如果你这样做,Unity 不会抱怨吗?考虑到网格数据的布局方式,我认为它实际上可能。
  • 导入 30k 顶点网格会导致顶点过多异常。查看代码,这是有道理的,因为顶点数组长度由 faceData.length (?!) 定义。因此,即使顶点数是 30k,数组也是 120k,所以它会中断。该进口商只会处理小件商品,因为利润仍将低于 65k 的限制。例如,立方体或茶壶仍然可以使用。例如,相同的网格在 ObjReader 资产中运行良好。
猜你喜欢
  • 2014-04-11
  • 2016-12-19
  • 1970-01-01
  • 1970-01-01
  • 2021-01-10
  • 2019-01-13
  • 1970-01-01
  • 2018-03-16
  • 1970-01-01
相关资源
最近更新 更多