Unity多场景构建配置方案
构建配置文件设计
通过ScriptableObject实现多场景打包配置管理,支持独立设置或共享全局参数。
[System.Serializable]
public sealed class PackageTask
{
public bool UseGlobalSettings = true;
public string BundleName;
public Texture2D AppIcon;
public string AppVersion;
public string BundleIdentifier;
public string ApplicationName;
public BuildTarget TargetPlatform;
public string OutputPath;
public List<SceneAsset> Scenes = new List<SceneAsset>();
}
[CreateAssetMenu(menuName = "构建配置/新建配置方案")]
public sealed class PackageProfile : ScriptableObject
{
public string GlobalOutputPath;
public string GlobalVersion;
public List<PackageTask> Tasks = new List<PackageTask>();
}
配置编辑器实现
自定义编辑器界面提供任务管理和参数批量设置功能。
[CustomEditor(typeof(PackageProfile))]
public sealed class PackageEditor : Editor
{
private Dictionary<PackageTask, bool> _taskFoldStates = new Dictionary<PackageTask, bool>();
private Vector2 _scrollPosition;
private PackageProfile _config;
private void OnEnable()
{
_config = target as PackageProfile;
}
public override void OnInspectorGUI()
{
EditorGUILayout.LabelField("全局参数", EditorStyles.boldLabel);
EditorGUILayout.BeginHorizontal();
EditorGUILayout.LabelField("输出路径:", GUILayout.Width(70));
_config.GlobalOutputPath = EditorGUILayout.TextField(_config.GlobalOutputPath);
if (GUILayout.Button("浏览", GUILayout.Width(50)))
{
_config.GlobalOutputPath = EditorUtility.SaveFolderPanel("选择路径", _config.GlobalOutputPath, "");
}
EditorGUILayout.EndHorizontal();
EditorGUILayout.BeginHorizontal();
EditorGUILayout.LabelField("版本号:", GUILayout.Width(70));
_config.GlobalVersion = EditorGUILayout.TextField(_config.GlobalVersion);
EditorGUILayout.EndHorizontal();
EditorGUILayout.Space(10);
EditorGUILayout.BeginHorizontal();
if (GUILayout.Button("添加任务"))
{
var newTask = new PackageTask()
{
ApplicationName = "应用名称",
AppVersion = "1.0.0",
TargetPlatform = BuildTarget.Android,
OutputPath = Directory.GetParent(Application.dataPath).FullName
};
_config.Tasks.Add(newTask);
}
if (GUILayout.Button("全部展开"))
{
foreach (var task in _config.Tasks)
{
_taskFoldStates[task] = true;
}
}
if (GUILayout.Button("全部折叠"))
{
foreach (var task in _config.Tasks)
{
_taskFoldStates[task] = false;
}
}
EditorGUILayout.EndHorizontal();
}
}