using System;
using System.Collections.Generic;
using UnityEngine;
namespace StansAssets.SceneManagement.Build
{
///
/// Build settings for a separate configuration
///
[Serializable]
public class BuildConfiguration
{
public string Name = string.Empty;
public bool DefaultScenesFirst = false;
public List DefaultScenes = new List();
public List Platforms = new List();
public bool IsEmpty
{
get
{
foreach (var platform in Platforms)
{
if (platform.IsEmpty == false)
{
return false;
}
}
return DefaultScenes.Count == 0;
}
}
internal bool UseAddressablesInEditor
{
get
{
#if UNITY_EDITOR
return UnityEditor.EditorPrefs.GetBool($"{Name}_user-addressables-in-editor", false);
#else
return false;
#endif
}
set
{
#if UNITY_EDITOR
UnityEditor.EditorPrefs.SetBool($"{Name}_user-addressables-in-editor", value);
#endif
}
}
internal BuildConfiguration Copy()
{
var copy = new BuildConfiguration();
copy.Name = Name + " Copy";
foreach (var scene in DefaultScenes)
{
copy.DefaultScenes.Add(scene);
}
foreach (var platformsConfiguration in Platforms)
{
var p = new PlatformsConfiguration();
foreach (var target in platformsConfiguration.BuildTargets)
{
p.BuildTargets.Add(target);
}
foreach (var scene in platformsConfiguration.Scenes)
{
p.Scenes.Add(scene);
}
copy.Platforms.Add(p);
}
return copy;
}
// TODO we might need to cache this data once
internal bool IsSceneAddressable(string sceneName)
{
foreach (var scene in DefaultScenes)
{
if (sceneName.Equals(scene.Name))
{
return scene.Addressable;
}
}
// TODO should come from another runtime settings
var buildTarget = ConvertRuntimePlatformToBuildTarget(Application.platform);
var platform = GetConfigurationFroBuildTarget(buildTarget);
if (platform != null)
{
foreach (var sceneAssetInfo in platform.Scenes)
{
if (sceneName.Equals(sceneAssetInfo.Name))
{
return sceneAssetInfo.Addressable;
}
}
}
return false;
}
PlatformsConfiguration GetConfigurationFroBuildTarget(BuildTargetRuntime buildTarget)
{
foreach (var platform in Platforms)
{
if (platform.BuildTargets.Contains(buildTarget))
{
return platform;
}
}
return null;
}
BuildTargetRuntime ConvertRuntimePlatformToBuildTarget(RuntimePlatform platform)
{
switch (platform)
{
#if UNITY_EDITOR
case RuntimePlatform.OSXEditor:
case RuntimePlatform.WindowsEditor:
case RuntimePlatform.LinuxEditor:
return (BuildTargetRuntime)(int)UnityEditor.EditorUserBuildSettings.activeBuildTarget;
#endif
case RuntimePlatform.Android:
return BuildTargetRuntime.Android;
case RuntimePlatform.IPhonePlayer:
return BuildTargetRuntime.iOS;
case RuntimePlatform.WebGLPlayer:
return BuildTargetRuntime.WebGL;
default:
throw new ArgumentOutOfRangeException(nameof(platform), platform, null);
}
}
}
}