当第一人称在场景里漫游时应避免穿模问题,这就需要给第一人称和周边环境模型都添加碰撞器。当场景很大,且形状不规则时,一个个给周边模型手动添加碰撞器很慢且不精准,以下方式能实现一键给场景内所有模型添加精准碰撞MeshCollider。
1.新建脚本AddMeshCollider.cs,代码如下
//EditorWindow类无法打包,注意添加这个判断
#if UNITY_EDITOR
using UnityEngine;
using UnityEditor;
public class AddMeshCollider : EditorWindow
{
[MenuItem("Tools/添加移除碰撞体")]
public static void Open()
{
EditorWindow.GetWindow(typeof(AddMeshCollider));
}
void OnGUI()
{
if (GUILayout.Button("添加碰撞体"))
{
Add();
}
if (GUILayout.Button("移除碰撞体"))
{
Remove();
}
}
public static void Remove()
{
//寻找Hierarchy面板下所有的MeshRenderer
var tArray = Resources.FindObjectsOfTypeAll(typeof(MeshRenderer));
for (int i = 0; i < tArray.Length; i++)
{
MeshRenderer t = tArray[i] as MeshRenderer;
//保存场景修改,或者执行完手动Ctrl+s保存
Undo.RecordObject(t, t.gameObject.name);
MeshCollider meshCollider = t.gameObject.GetComponent<MeshCollider>();
if (meshCollider != null)
{
DestroyImmediate(meshCollider);
}
//刷新场景
EditorUtility.SetDirty(t);
}
Debug.Log("remove Succed");
}
public static void Add()
{
//寻找Hierarchy面板下所有的MeshRenderer
var tArray = Resources.FindObjectsOfTypeAll(typeof(MeshRenderer));
for (int i = 0; i < tArray.Length; i++)
{
MeshRenderer t = tArray[i] as MeshRenderer;
//保存场景修改,或者执行完手动Ctrl+s保存
Undo.RecordObject(t, t.gameObject.name);
MeshCollider meshCollider = t.gameObject.GetComponent<MeshCollider>();
if (meshCollider == null)
{
t.gameObject.AddComponent<MeshCollider>();
}
//刷新场景
EditorUtility.SetDirty(t);
}
Debug.Log("Add Succed");
}
}
#endif
2.脚本保存后(不用挂载),导航栏出现Tools选项
点击Tools,出现“添加移除碰撞体”按钮,
点击“添加移除碰撞体”按钮,出现“添加碰撞体”“移除碰撞体”选择面版,根据需求操作。
3.点击“添加碰撞器”按钮
可看到输出“Add Succed”,场景里的物体已经全部都挂载了MeshCollider。
4.注意点
1.MeshCollider十分消耗性能。
2.此操作只会改变当前场景物体,每个场景都要操作一次。文章来源:https://www.toymoban.com/news/detail-858577.html
3.此操作会给场景内所有带MeshRrnderer的物体都挂载MeshCollider组件,不需要MeshCollider组件的需要手动删除。或者将不需要/需要挂载MeshCollider的物体通过tag或者其他方法分类,在脚本里添加判断。文章来源地址https://www.toymoban.com/news/detail-858577.html
到了这里,关于unity一键给所有模型添加MeshCollider的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!