using System; using System.Collections.Generic; using UnityEditor; using UnityEngine; namespace Ubisoft.Hotel.Package.Editor { public class BuildSuite : PackagePropertyComposite { public static BuildSuite CreateInstanceWithParams(string name) { BuildSuite returnValue = CreateInstance(); returnValue.name = name; return returnValue; } [SerializeField] private List m_order; [SerializeField] private UnityBuildProperty m_unityBuildProperty; [SerializeField] private UpmBuildProperty m_upmBuildProperty; [SerializeField] private PlatformBuildProperty_iOS m_platformBuildProperty_iOS; [SerializeField] private PlatformBuildProperty_Android m_platformBuildProperty_Android; [SerializeField] private AssetBuildProperty m_assetBuildProperty; [SerializeField] private FirebaseBuildProperty m_firebaseBuildProperty; [SerializeField] private SocialCoreBuildProperty m_socialCoreBuildProperty; [SerializeField] private AddressablesBuildProperty m_addressablesBuildProperty; [SerializeField] private EPlatform m_platform; [SerializeField] private Version m_gameVersion; public UnityBuildProperty UnityBuildProperty { get { return m_unityBuildProperty; } } public UpmBuildProperty UpmBuildProperty { get { return m_upmBuildProperty; } } public PlatformBuildProperty_iOS PlatformBuildProperty_iOS { get { return m_platformBuildProperty_iOS; } } public PlatformBuildProperty_Android PlatformBuildProperty_Android { get { return m_platformBuildProperty_Android; } } public FirebaseBuildProperty FirebaseBuildProperty { get { return m_firebaseBuildProperty; } } public SocialCoreBuildProperty SocialCoreBuildProperty { get { return m_socialCoreBuildProperty; } } public AddressablesBuildProperty AddressablesBuildProperty { get { return m_addressablesBuildProperty; } } public EPlatform Platform { get { return m_platform; } } public Version GameVersion { get { return m_gameVersion; } } public void Clear() { if (m_order != null) { m_order.Clear(); } ClearBuildProperties(); } public void Setup(EPlatform platform, Version gameVersion) { m_platform = platform; m_gameVersion = gameVersion; } private void ClearBuildProperties() { m_unityBuildProperty.Clear(); m_upmBuildProperty.Clear(); m_platformBuildProperty_iOS.Clear(); m_platformBuildProperty_Android.Clear(); m_assetBuildProperty.Clear(); m_firebaseBuildProperty.Clear(); m_socialCoreBuildProperty.Clear(); m_addressablesBuildProperty.Clear(); } protected override void ExtendedSerialize(UnityEngine.Object parent) { if (m_unityBuildProperty == null) { string name = GetPropertyName(typeof(UnityBuildProperty)); m_unityBuildProperty = UnityBuildProperty.CreateInstanceWithParams(name); } m_unityBuildProperty.Serialize(parent); if (m_upmBuildProperty == null) { string name = GetPropertyName(typeof(UpmBuildProperty)); m_upmBuildProperty = UpmBuildProperty.CreateInstanceWithParams(name); } m_upmBuildProperty.Serialize(parent); if (m_platformBuildProperty_iOS == null) { string name = GetPropertyName(typeof(PlatformBuildProperty_iOS)); m_platformBuildProperty_iOS = PlatformBuildProperty_iOS.CreateInstanceWithParams(name); } m_platformBuildProperty_iOS.Serialize(parent); if (m_platformBuildProperty_Android == null) { string name = GetPropertyName(typeof(PlatformBuildProperty_Android)); m_platformBuildProperty_Android = PlatformBuildProperty_Android.CreateInstanceWithParams(name); } m_platformBuildProperty_Android.Serialize(parent); if (m_assetBuildProperty == null) { string name = GetPropertyName(typeof(AssetBuildProperty)); m_assetBuildProperty = AssetBuildProperty.CreateInstanceWithParams(name); } m_assetBuildProperty.Serialize(parent); if (m_firebaseBuildProperty == null) { string name = GetPropertyName(typeof(FirebaseBuildProperty)); m_firebaseBuildProperty = FirebaseBuildProperty.CreateInstanceWithParams(name); } m_firebaseBuildProperty.Serialize(parent); if (m_socialCoreBuildProperty == null) { string name = GetPropertyName(typeof(SocialCoreBuildProperty)); m_socialCoreBuildProperty = SocialCoreBuildProperty.CreateInstanceWithParams(name); } m_socialCoreBuildProperty.Serialize(parent); if (m_addressablesBuildProperty == null) { string name = GetPropertyName(typeof(AddressablesBuildProperty)); m_addressablesBuildProperty = AddressablesBuildProperty.CreateInstanceWithParams(name); } m_addressablesBuildProperty.Serialize(parent); } private string GetPropertyName(Type type) { return $"{name}:{HtTypes.GetTypeShortName(type)}"; } public void OrderProperty(PackageProperty property) { if (property != null) { if (m_order == null) { m_order = new List(); } m_order.Add(property); } } public void OrderBuildSuite(BuildSuite buildSuite) { if (buildSuite != null) { OrderProperty(buildSuite.m_unityBuildProperty); // Do not order m_upmBuildProperty because only AppSpaceBuildSuite needs to modify manifest.json // and it is done by BuildStep_ApplyBuildSuite //OrderProperty(buildSuite.m_upmBuildProperty); OrderProperty(buildSuite.m_platformBuildProperty_iOS); OrderProperty(buildSuite.m_platformBuildProperty_Android); OrderProperty(buildSuite.m_assetBuildProperty); OrderProperty(buildSuite.m_firebaseBuildProperty); OrderProperty(buildSuite.m_socialCoreBuildProperty); OrderProperty(buildSuite.m_addressablesBuildProperty); } } public List Order => m_order; public List GetBuildProperties() { List returnValue = new List(); if (m_unityBuildProperty != null) { returnValue.Add(m_unityBuildProperty); } if (m_upmBuildProperty != null) { returnValue.Add(m_upmBuildProperty); } if (m_platformBuildProperty_iOS != null) { returnValue.Add(m_platformBuildProperty_iOS); } if (m_platformBuildProperty_Android != null) { returnValue.Add(m_platformBuildProperty_Android); } if (m_assetBuildProperty != null) { returnValue.Add(m_assetBuildProperty); } if (m_firebaseBuildProperty != null) { returnValue.Add(m_firebaseBuildProperty); } if (m_socialCoreBuildProperty != null) { returnValue.Add(m_socialCoreBuildProperty); } if (m_addressablesBuildProperty != null) { returnValue.Add(m_addressablesBuildProperty); } return returnValue; } public void CompileBuildProperties() { JoinBuildProperties(m_order); } public void JoinBuildSuite(BuildSuite value) { if (value != null) { JoinBuildProperties(value.GetBuildProperties()); } } private void JoinBuildProperties(List properties) { if (properties != null) { ClearBuildProperties(); foreach (PackageProperty property in properties) { if (property != null) { if (property is UnityBuildProperty unityProperty) { m_unityBuildProperty.Join(unityProperty); } else if (property is UpmBuildProperty upmProperty) { m_upmBuildProperty.Join(upmProperty); } else if (property is PlatformBuildProperty_iOS iosProperty) { m_platformBuildProperty_iOS.Join(iosProperty); } else if (property is PlatformBuildProperty_Android androidProperty) { m_platformBuildProperty_Android.Join(androidProperty); } else if (property is AssetBuildProperty assetProperty) { m_assetBuildProperty.Join(assetProperty); } else if (property is FirebaseBuildProperty firebaseProperty) { m_firebaseBuildProperty.Join(firebaseProperty); } else if (property is SocialCoreBuildProperty socialCoreProperty) { m_socialCoreBuildProperty.Join(socialCoreProperty); } else if (property is AddressablesBuildProperty addressablesProperty) { m_addressablesBuildProperty.Join(addressablesProperty); } } } } } public void PreBuild(EPlatform platform) { m_firebaseBuildProperty.OrderAsset(m_assetBuildProperty); m_assetBuildProperty.PreBuild(platform); // unity build property needs to be applied before firebase build property to make sure // that the correct bundle id is applied before processing firebase manifest. m_unityBuildProperty.PreBuild(); m_firebaseBuildProperty.PreBuild(); m_platformBuildProperty_iOS.PreBuild(); m_platformBuildProperty_Android.PreBuild(); m_socialCoreBuildProperty.PreBuild(); m_addressablesBuildProperty.PreBuild(); } public void PostBuild(BuildTarget buildTarget, string pathToBuiltProject) { // Upm if (m_upmBuildProperty != null) { m_upmBuildProperty.PostBuild(); } // Unity if (m_unityBuildProperty != null) { m_unityBuildProperty.PostBuild(); } // PlatformProperty. Only the platformProperty object corresponding to buildTarget is applied switch (buildTarget) { case BuildTarget.iOS: if (m_platformBuildProperty_iOS != null) { m_platformBuildProperty_iOS.PostBuild(pathToBuiltProject); } break; case BuildTarget.Android: if (m_platformBuildProperty_Android != null) { m_platformBuildProperty_Android.PostBuild(pathToBuiltProject); } break; } // Asset if (m_assetBuildProperty != null) { m_assetBuildProperty.PostBuild(); } // Firebase if (m_firebaseBuildProperty != null) { m_firebaseBuildProperty.PostBuild(); } if (m_socialCoreBuildProperty != null) { m_socialCoreBuildProperty.PostBuild(); } if (m_addressablesBuildProperty != null) { m_addressablesBuildProperty.PostBuild(); } } } }