首页 > 其他分享 >Unity打包时隐藏/删除场景中部分内容

Unity打包时隐藏/删除场景中部分内容

时间:2024-06-10 20:34:58浏览次数:8  
标签:场景 scene 接口 Unity var 回调 打包

背景

使用Unity编辑器时,我们有时候会将服务端的一些信息通过Unity编辑,但由于这部分内容属于服务端,客户端仅限于编辑器中的编辑,我们并不希望将这部分内容打包出去。因此我们需要在打包时将其隐藏或者删除,但是又不影响编辑器的编辑。

打包相关的回调接口 IPreprocessBuildWithReport 和 IPostprocessBuildWithReport

网上搜索Unity打包的回调,首先可以找到的是IPreprocessBuildWithReportIPostprocessBuildWithReport两个接口。

那么首先想到的方法是在打包前通过IPreprocessBuildWithReport.PreprocessBuild回调将需要的GameObject隐藏,然后在打包结束后通过IPostprocessBuildWithReport.PostprocessBuild将隐藏的GameObject恢复。

中间会遇到的问题有重新打开Scene会导致之前保存的GameObject引用失效。

并且最后会遇到一个问题无法解决。。那就是打包前的回调IPreprocessBuildWithReport.PreprocessBuild中的操作会被Unity保留,但是打包后的回调IPostprocessBuildWithReport.PostprocessBuild中的操作会被Unity丢弃。

也就是Unity会将Scene文件返回到打包前的状态。。。

另一个回调接口 IProcessSceneWithReport

那么为什么Unity会将Scene文件返回到打包之前的状态呢。。。是不是Unity自己也会在打包时对scene文件进行修改,所以需要在打包结束将其还原。
如果有一个接口,在里面修改的内容能够影响打包后的结果,也会被还原就好了。
通过反复查看Unity的文档,此时 IProcessSceneWithReport接口进入我们的眼帘,有没有可能,这个接口里面的操作会影响打包的结果,并且期间的操作会在打包结束后还原。

结果真如我们所料。这个回调里面的操作会影响打包结果,并且会在打包结束后还原。

也有一点出乎我们的意料。这个回调会在编辑器进入PlayMode时被调用。

Gif中的Prefab会在打包时被删除。

最终代码

internal class BuildOperationProcessor :  IProcessSceneWithReport
{
    public int callbackOrder => int.MaxValue;


    public void OnProcessScene(Scene scene, BuildReport report)
    {
        foreach (var rootObj in scene.GetRootGameObjects())
        {
            var iDeleteOperations = rootObj.GetComponentsInChildren<IBuildOperationDelete>(true);

            foreach (var iDeleteOperation in iDeleteOperations)
            {
                var deleteOperation = iDeleteOperation as MonoBehaviour;
                MonoBehaviour.DestroyImmediate(deleteOperation.gameObject);
            }

        }


        foreach (var rootObj in scene.GetRootGameObjects())
        {

            var iHideOperations = rootObj.GetComponentsInChildren<IBuildOperationHide>();

            foreach (var iHideOperation in iHideOperations)
            {
                var hideOperation = iHideOperation as MonoBehaviour;

                //var objName = hideOperation.gameObject.GetFullName();
                //Debug.Log($" add hide obj {objName}");
                hideOperation.gameObject.SetActive(false);

            }
        }
    }

}

标签:场景,scene,接口,Unity,var,回调,打包
From: https://www.cnblogs.com/dewxin/p/18240921

相关文章

  • Ubuntu 24.04 LTS 安装配置 MySQL Community Server 8.4.0 LTS
    1安装 AptRepository​​​​​​​地址MySQL::DownloadMySQLAPTRepositorysudodpkg-imysql-apt-config_0.8.30-1_all.deb #安装mysql8.4ltssudoaptupdatesudoapt-getinstallmysql-server#修改mysqlroot密码策略 2查看版本test@test:~$my......
  • 【机器学习】原理与应用场景 Python代码展现
    机器学习:原理、应用与实例深度解析引言一、机器学习的基本原理二、机器学习的应用范围三、机器学习实例解析四、机器学习部分讲解五、机器学习的挑战与未来引言随着大数据和计算能力的飞速发展,==机器学习(MachineLearning,ML)==已成为现代科技领域的热门话题。本文......
  • Webpack等打包工具是怎么实现启动本地服务器,并且实时预览并更新的
    在代码中使用webpack来作为构建工具,使用npmrunserver也就是webpackserver的时候,会启动一个开发服务器,会运行类似于打包的行为(在这里我们比喻成打包),转换成可以直接运行的代码,这写代码不会生成文件,而是会运行在内存中,然后webpack会给你一个本地的地址,可以直接在浏览......
  • NetLimiter使用教程,并掌握其基本的网络管理和流量控制能力;NetLimiter的各种高级功能和
    NetLimiter的初级使用教程大纲,可以帮助用户快速了解和上手这个网络管理工具:安装和配置下载和安装NetLimiter启动NetLimiter,进行基本配置界面介绍熟悉NetLimiter的用户界面主要功能区域的介绍和作用限制应用程序的网络访问如何设置应用程序的上传和下载限速如......
  • C++缺省参数、缺省参数的概念、缺省参数的分类、函数重载、函数重载的概念、C++支持函
    文章目录前言一、缺省参数1.缺省参数的概念2.缺省参数的分类二、函数重载1.函数重载的概念2.C++支持函数重载的原理三、引用1.引用的概念2.引用的特性3.常引用4.引用的使用场景5.传值和传引用效率比较6.引用和指针的区别总结前言C++缺省参数、缺省参数......
  • Kali Linux 2024.2 发布 (t64, GNOME 46 & Community Packages) - 领先的渗透测试发行
    KaliLinux2024.2发布(t64,GNOME46&CommunityPackages)-领先的渗透测试发行版ThemostadvancedPenetrationTestingDistribution请访问原文链接:https://sysin.org/blog/kali-linux/,查看最新版。原创作品,转载请保留出处。作者主页:sysin.orgKaliLinux2024.2已......
  • Spring Boot入坑-11-打包和发布
    准备环境Java运行环境Java的应用多发布于Linux环境,如CentOS7部署应用前,在远程Linux主机或虚拟机上,需要安装JDK或JRE,使用如下命令安装一个OpenJDKyum-yinstalljava-1.8.0-openjdk数据库环境一般应用都需要有数据库支持,像MySQL,但一般在企业中会由运维或DBA提供......
  • Unity Tips
    1:DebugMode:对于只在一个类中访问的变量设置为private,但是在调试的时候会看不到这些值,可以插入一些调试日志语句,将变量改为公共变量,同时将inspector设置为Debug模式,此时私有变量就将变得可见。2:range属性在变量使用之前使用range属性来给它一个最小值和最大值,这将在inspecto......
  • CMake:构建、打包和测试的跨平台工具系列软件
    介绍CMake是一个开源、跨平台的构建系统,旨在管理软件构建过程。它通过使用简洁的脚本语言描述项目的构建规则,自动生成适用于各种平台的构建文件,如UnixMakefiles、VisualStudio项目和Xcode项目。CMake不仅支持多种编译器和操作系统,还提供了丰富的功能,用于软件的构建、打包和......
  • SQL语句的使用规范、应用场景和常见错误
    SQL语句的使用规范和应用场景在编写SQL语句时,应注意以下几点:使用规范:SQL语句的书写应有一定的规范,例如关键字的大小写、空格的使用、注释的添加等。应用场景:不同的SQL语句适用于不同的场景,例如SELECT用于查询数据,INSERT用于插入数据,UPDATE用于更新数据,DELETE用于删除数据,CREA......