Unity打包时隐藏/删除场景中部分内容
背景
使用Unity编辑器时,我们有时候会将服务端的一些信息通过Unity编辑,但由于这部分内容属于服务端,客户端仅限于编辑器中的编辑,我们并不希望将这部分内容打包出去。因此我们需要在打包时将其隐藏或者删除,但是又不影响编辑器的编辑。
打包相关的回调接口 IPreprocessBuildWithReport 和 IPostprocessBuildWithReport
网上搜索Unity打包的回调,首先可以找到的是IPreprocessBuildWithReport
和IPostprocessBuildWithReport
两个接口。
那么首先想到的方法是在打包前通过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);
}
}
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)