我设计了一个复杂的城市,有数千个物体,如道路,侧面,建筑物,树木等,并导入Unity3d
我想把碰撞器放在它们上面,这样当玩家击中它们时,它应该面对碰撞并且不应该通过它们
虽然它有很多物体,但是如果我将一个一个碰撞物放在每个物体上,那么它将花费很多时间。有没有其他方法我可以选择所有这些并放置对撞机。
另外,如果我选择所有对象并放置对撞机(Mesh Collider)。它没有添加到对象
请帮忙
答案 0 :(得分:2)
编辑脚本进行救援。我会写一个类似于这个例子的工具。它使用Menu Item,可以通过 Window - >选择。碰撞工具。然后它运行我们的自定义方法来查找我们想要添加一个对撞机的所有网格,然后添加一个并记录哪些GameObjects被更改。
using UnityEditor;
using UnityEngine;
using System.Collections.Generic;
public static class ColliderTool
{
[MenuItem("Window/Collider Tool")]
public static void RunTool()
{
List<MeshFilter> meshes = findObjectsThatNeedColliders();
for (int i = 0; i < meshes.Count; i++)
{
GameObject go = meshes[i].gameObject;
// Add a collider to each mesh and record the undo step.
MeshCollider collider = Undo.AddComponent<MeshCollider>(go);
// Use the existing mesh as the collider mesh.
collider.sharedMesh = meshes[i].sharedMesh;
Debug.Log("Added a new collider on: " + go.name, go);
}
Debug.Log("Done");
}
private static List<MeshFilter> findObjectsThatNeedColliders()
{
// This list will be filled with all meshes, which require a collider.
List<MeshFilter> meshesWithoutCollider = new List<MeshFilter>();
// Get all meshes in the scene. This only returns active ones.
// Maybe we also need inactive ones, which we can get via GetRootGameObjects and GetComponent.
MeshFilter[] allMeshes = GameObject.FindObjectsOfType<MeshFilter>();
foreach(MeshFilter mesh in allMeshes)
{
if(mesh.GetComponent<Collider>() == null)
meshesWithoutCollider.Add(mesh);
}
return meshesWithoutCollider;
}
}
您可能需要更复杂的规则来确定哪些对象需要对撞机以及它应该是哪种类型,但是一个简单的工具仍然可以在手动调整所有内容之前为您节省大量时间。
您还应该考虑进行此选择。 Selection类可以为您提供所有选定对象的列表。一些想法:
我的解决方案基于您关于如何将对撞机添加到大型场景中的许多对象的问题。但是,这可能不是整体最佳解决方案。也许太多的MeshColliders伤害了物理性能。你很可能想要用盒子和球体来近似大多数碰撞器,但当然你仍然可以编写一个工具来帮助你。