[FA] 在场景里创建物体时,自动移除Collider【工具】

2024-02-26  本文已影响0人  _Walker__

记录环境

需求

加一个处理工具,让系统创建出来的模型不带碰撞体

背景

美术同学经常会在场景里创建面片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物体的需要,可以加一些限定条件做过滤,比如:根据当前场景做区分、根据当前编辑状态做区分等。

上一篇 下一篇

猜你喜欢

热点阅读