Unity打包客户端/服务端,隐藏/删除场景中部分内容

前言

最近在学习制作联网游戏,发现了一个很难受的问题。我在编辑器下编辑一个只在服务端运行的物体,打包客户端的时候需要把这个删除掉,不然会有脚本丢失的问题。为了解决这个问题,在网上找一些资料,试过很多方法,最后找到这篇文章:Unity打包时隐藏/删除场景中部分内容 - dewxin - 博客园

根据帖主的方法,使用IProcessSceneWithReport接口,会在构建场景时调用这个接口函数,场景构建结束之后,会恢复到编辑器构建前的状态,部分解决了我目前的问题,有些糟糕的是,我需要将一些服务端的代码移动到公共程序集,这个程序集会被打包到客户端,可能会造成一定的安全隐患问题,所以我在构建场景时,直接将所有丢失引用的组件直接删除掉就好了。

不过这样又会造成新的问题,如果直接删除全部丢失引用的脚本,在开发过程中,可能会将本来应该是bug的丢失引用给忽视掉,造成一定的排查问题的困难,所以还是不能直接删除这个组件。

我们换种思路,将那些不打包到客户端的服务端物体删除,在预处理阶段给组件添加宏组件过滤掉,不让他打包出去,后处理阶段还原,如此,既解决了脚本丢失问题,又解决了脚本错误打包的问题。

最后,特别需要注意的一点是,IProcessSceneWithReport只有在场景物体版本不一致时才会触发这个回调,不然会使用缓存的构建文件,造成结果可能不是预期效果,所以在使用这个方法打包前,请务必确认,scene的版本是否不一致

为了方便使用,我通过属性实现了这一功能,其中使用到了反射,所以在构建大型项目时请慎用!

这个属性,目前只能一个文件定义一个,在类头上,一般来说MonoBehaviour也不会同一个文件多个定义吧。

(我也不确定会造成多大的性能损耗,打包太久就不美了)最后附上我的代码,以及测试结果:

主要的构建接口实现:

#if UNITY_EDITOR

public static class BuildProcessorHelper
{
    public static void ProcessSceneComponents(bool isServerBuild, Action<MonoBehaviour, ComponentMode> componentAction = null)
    {
        for (int i =0; i < SceneManager.sceneCount; i++)
        {
            foreach (var rootObj in SceneManager.GetSceneAt(i).GetRootGameObjects())
            {
                ProcessRootObject(rootObj, isServerBuild, componentAction);
            }
        }
    }

    private static void ProcessRootObject(GameObject rootObj, bool isServerBuild, Action<MonoBehaviour, ComponentMode> componentAction)
    {
        var attributeType = isServer
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值