https://github.com/zeroultra/excludefrombuild
Exclude From Build in Unity(打包时排除不要的资源)
https://github.com/zeroultra/excludefrombuild
unity3d-plugin
Last synced: 8 months ago
JSON representation
Exclude From Build in Unity(打包时排除不要的资源)
- Host: GitHub
- URL: https://github.com/zeroultra/excludefrombuild
- Owner: ZeroUltra
- License: mit
- Created: 2023-12-31T10:48:27.000Z (over 2 years ago)
- Default Branch: main
- Last Pushed: 2025-09-01T07:08:40.000Z (10 months ago)
- Last Synced: 2025-09-01T09:51:38.910Z (10 months ago)
- Topics: unity3d-plugin
- Language: C#
- Homepage:
- Size: 31.3 KB
- Stars: 10
- Watchers: 1
- Forks: 2
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# ExcludeFromBuild
作用:在Build Unity工程的时候排除不参与打包的资源
## 打包过程中经常遇到的问题
* 在打包过程中,是不允许运行时脚本有Editor的代码的(除非使用#if UNITY_EDITOR包裹),但是在开发中经常会写一些测试脚本,经常在Build的时候发生错误,例如下面代码
```c#
using System.Collections;
using UnityEditor;
using UnityEngine;
public class NewMonoBehaviour : MonoBehaviour
{
private void Start()
{
AssetDatabase.GetAssetPath(this.gameObject);
}
}
```
(这段代码没有单独创建Assembly Definition),那么打包的时候就会出现下面错误,错误也很明显,引用了Editor代码

当然Unity提供了一种特殊文件方式,用于忽略项目文件
[Unity - Manual: Special folder names (unity3d.com)](https://docs.unity3d.com/Manual/SpecialFolders.html)
- Hidden folders.
- Files and folders which start with ‘**.**’.
- Files and folders which end with ‘**~**’.
- Files and folders named **cvs**.
- Files with the extension **.tmp**.
利用这种方式可以规避某些不要的文件进入打包。
但是这种方式有两个麻烦点
1. 要手动修改文件(文件夹)格式(这个容易)
2. 第二就是如果把`文件`修改,如将`Test.cs`->`Test.cs~`,那么它的meta文件也会消失,就很蛋疼
## 解决方案
步骤:
1. 标记需要排除的资源
2. 在Build之前将资源和.meta移到`项目Assets之外`,并记录
3. 打包Build完成或者Build失败之后要还原
## 使用方法
1. 使用UnityPackageManager,添加git项目地址
2. 导入插件后,标记需要排除的资源(文件或文件夹)


**鼠标右键->Exclude From Build**,会将资源标记,如果已经标记了再次选择则会排除
*tips:如果你的projects视图也是`two column layout`,不要选左边目录栏,unity将不认*
OK已经完成了所有操作,接下来就可以打包了
## 注意事项
1. 只适用于内置Build,没有测试SBP
2. 打包时只能使用Unity自带得Build(也就是Build Setting窗口得`Build`和`Build And Run`),因为使用了`BuildPlayerWindow.RegisterBuildPlayerHandler`来获取打包失败回调,具体查看:[Unity - Scripting API: BuildPlayerWindow.RegisterBuildPlayerHandler (unity3d.com)](https://docs.unity3d.com/ScriptReference/BuildPlayerWindow.RegisterBuildPlayerHandler.html)
3. 如果使用自定义代码打包,先注释`ExcludeFormBuilder.cs`代码中`BackupExcludeAssetsBeforeBuild`,然后可以使用类似如下代码,需用`try finally` 防止过程出错

```c#
//先备份
ZeroUltra.ExcludeFormBuild.ExcludeFormBuilder.BackupExcludeAssetsBeforeBuild();
try
{
//模拟打app
var buildReports = BuildPipeline.BuildPlayer(buildPlayerOptions);
}
catch (Exception)
{
throw;
}
finally
{
//最后还原
ZeroUltra.ExcludeFormBuild.ExcludeFormBuilder.RestoreExcludeAssetsAfterBuild();
}
```
4. 由于使用了`IPreprocessBuildWithReport, IPostprocessBuildWithReport`,这两个接口,但是它们在打包AssetBundle不起作用,参考:
https://docs.unity3d.com/ScriptReference/Build.IPreprocessBuildWithReport.OnPreprocessBuild.html,
https://docs.unity3d.com/ScriptReference/Build.IPostprocessBuildWithReport.OnPostprocessBuild.html
所有在打包AssetBundle的时候,也做如下类似修改
```c#
ZeroUltra.ExcludeFormBuild.ExcludeFormBuilder.BackupExcludeAssetsBeforeBuild();
try
{
BuildPipeline.BuildAssetBundles(outPath, BuildAssetBundleOptions.None, BuildTarget.Android);
}
catch (Exception)
{
throw;
}
finally
{
ZeroUltra.ExcludeFormBuild.ExcludeFormBuilder.RestoreExcludeAssetsAfterBuild();
}
```
**有问题欢迎提issues**