无需实例化 Mesh。它是一个组件,我不确定您是否可以实例化它。只需将其分配给材质即可。
代码中的主要问题是您没有创建材质和着色器。您需要创建一个材质,然后创建一个“标准”着色器并将该着色器分配给该材质。
我注意到FastObjImporter
脚本很旧,决定尝试一下以确保其正常运行。我遇到了一个索引异常错误,然后修复了它。您可以获取修复版本的副本here https://pastebin.com/mCVbgabp。见线#57对于我所做的实际修复。
要创建的函数MeshFilder
, 材料和MeshRenderer
:
void attachMeshFilter(GameObject target, Mesh mesh)
{
MeshFilter mF = target.AddComponent<MeshFilter>();
mF.mesh = mesh;
}
Material createMaterial()
{
Material mat = new Material(Shader.Find("Standard"));
return mat;
}
void attachMeshRenderer(GameObject target, Material mat)
{
MeshRenderer mR = target.AddComponent<MeshRenderer>();
mR.material = mat;
}
创建新游戏对象、加载模型并将所有必要的组件附加到其上以显示它的函数:
GameObject loadAndDisplayMesh(string path)
{
//Create new GameObject to hold it
GameObject meshHolder = new GameObject("Loaded Mesh");
//Load Mesh
Mesh mesh = FastObjImporter.Instance.ImportFile(path);
//return null;
//Attach Mesh Filter
attachMeshFilter(meshHolder, mesh);
//Create Material
Material mat = createMaterial();
//Attach Mesh Renderer
attachMeshRenderer(meshHolder, mat);
return meshHolder;
}
Usage:
void Start()
{
string objPath = Application.persistentDataPath + "/testObj.obj";
GameObject obj = loadAndDisplayMesh(objPath);
//Position it in front od=f the camera. Your ZOffset may be different
Camera cam = Camera.main;
float zOffset = 40f;
obj.transform.position = cam.ViewportToWorldPoint(new Vector3(0.5f, 0.5f, cam.nearClipPlane + zOffset));
}
EDIT:
在极少数情况下,Unity 在 Android 上找不到着色器Shader.Find("Standard")
用来。发生这种情况时,您会收到错误消息。
解决此问题的方法是在编辑器中创建材质并为其分配“标准”着色器。默认情况下它应该使用“标准”着色器。
1.创建一个材质,名称为“StandardMat”。
2.将该材料放入名为“Resources”的文件夹中。如果不存在则创建它。你必须正确拼写这个。同样,该文件夹必须命名为“Resources”并放置在“Asset”文件夹中。
3.您可以加载材料Resources.Load("StandardMat") as Material
.
In the createMaterial
上面的函数,
Change
Material mat = new Material(Shader.Find("Standard"));
to
Material mat = Resources.Load("StandardMat") as Material;