合并在 运行 次导入的网格物体?
Combine meshes imported at run time?
Unity 中的网格最大为 65k 个顶点。我在 运行 时间导入了超过此限制的高水平细节(说高质量的奇特方式)模型。因此,我经常需要为单个模型创建多个网格。这些网格中的每一个都放在自己的游戏对象中(Unity 只允许给定游戏对象上有一个网格)。然后,我将所有这些单独的游戏对象作为一个空父游戏对象的父级。
我想做的是与所有网格交互,就好像它们在单个网格碰撞器下一样。这可能吗?
Link 一个似乎不是我真正想要的,link 两个,当我尝试手动导入时,没有按照我想要的方式工作。它以与 AddComponent 相同的方式创建网格,但它为每个网格分别创建了碰撞器。
相反,我希望它为表示单个模型所需的所有网格创建一个统一的网格碰撞器。
白日梦还是可能?
试试 Mesh.CombineMeshes :
public void CombineMeshes(CombineInstance[] combine, bool mergeSubMeshes = true, bool useMatrices = true, bool hasLightmapData = false);
Combines several Meshes into this Mesh.
来自文档:
[RequireComponent(typeof(MeshFilter))]
[RequireComponent(typeof(MeshRenderer))]
public class ExampleClass : MonoBehaviour {
void Start() {
MeshFilter[] meshFilters = GetComponentsInChildren<MeshFilter>();
CombineInstance[] combine = new CombineInstance[meshFilters.Length];
int i = 0;
while (i < meshFilters.Length) {
combine[i].mesh = meshFilters[i].sharedMesh;
combine[i].transform = meshFilters[i].transform.localToWorldMatrix;
meshFilters[i].gameObject.active = false;
i++;
}
transform.GetComponent<MeshFilter>().mesh = new Mesh();
transform.GetComponent<MeshFilter>().mesh.CombineMeshes(combine);
transform.gameObject.active = true;
}
}
Unity 中的网格最大为 65k 个顶点。我在 运行 时间导入了超过此限制的高水平细节(说高质量的奇特方式)模型。因此,我经常需要为单个模型创建多个网格。这些网格中的每一个都放在自己的游戏对象中(Unity 只允许给定游戏对象上有一个网格)。然后,我将所有这些单独的游戏对象作为一个空父游戏对象的父级。
我想做的是与所有网格交互,就好像它们在单个网格碰撞器下一样。这可能吗?
Link 一个似乎不是我真正想要的,link 两个,当我尝试手动导入时,没有按照我想要的方式工作。它以与 AddComponent 相同的方式创建网格,但它为每个网格分别创建了碰撞器。
相反,我希望它为表示单个模型所需的所有网格创建一个统一的网格碰撞器。
白日梦还是可能?
试试 Mesh.CombineMeshes :
public void CombineMeshes(CombineInstance[] combine, bool mergeSubMeshes = true, bool useMatrices = true, bool hasLightmapData = false);
Combines several Meshes into this Mesh.
来自文档:
[RequireComponent(typeof(MeshFilter))]
[RequireComponent(typeof(MeshRenderer))]
public class ExampleClass : MonoBehaviour {
void Start() {
MeshFilter[] meshFilters = GetComponentsInChildren<MeshFilter>();
CombineInstance[] combine = new CombineInstance[meshFilters.Length];
int i = 0;
while (i < meshFilters.Length) {
combine[i].mesh = meshFilters[i].sharedMesh;
combine[i].transform = meshFilters[i].transform.localToWorldMatrix;
meshFilters[i].gameObject.active = false;
i++;
}
transform.GetComponent<MeshFilter>().mesh = new Mesh();
transform.GetComponent<MeshFilter>().mesh.CombineMeshes(combine);
transform.gameObject.active = true;
}
}