记录环境
- Unity 2021.3.31f1
需求
加一个处理工具,让系统创建出来的模型不带碰撞体
背景
美术同学经常会在场景里创建面片Plane,默认创建的3D物体都是带有Collider的。FA中很多3D物体的点击是射线检测Collider实现的,场景中无用的Collider经常会导致点击失效,而美术也经常忽视这个问题,所以提出这个工具需求。
实现
private static void OnObjectChanged(ref ObjectChangeEventStream stream)
{
if(Application.isPlaying) return;
for (int i = 0; i < stream.length; ++i)
{
switch (stream.GetEventType(i))
{
case ObjectChangeKind.CreateGameObjectHierarchy:
stream.GetCreateGameObjectHierarchyEvent(i, out CreateGameObjectHierarchyEventArgs args);
GameObject addGo = (GameObject)EditorUtility.InstanceIDToObject(args.instanceId);
Collider collider = addGo.GetComponent<Collider>();
if (collider)
{
Object.DestroyImmediate(collider);
Debug.Log("主动删除创建物体的Collider:" + addGo.name, addGo);
}
break;
}
}
}
// 在工程初始化的时候注册事件:[InitializeOnLoad]
ObjectChangeEvents.changesPublished += OnObjectChanged;
这段代码实现的功能是,只要检测到Hierarchy有GameObject创建,就把它的Collider销毁掉。在FA能够满足需求,因为几乎没有什么地方会主动创建带Collider的物体。
如果项目中有主动创建带Collider物体的需要,可以加一些限定条件做过滤,比如:根据当前场景做区分、根据当前编辑状态做区分等。