[Build] 빌드 시, Builtin 되는 AssetBundle 중 현재 Platform의 AssetBundle만 빌트인 되도록 하기
Unity3D/Script / 2023. 1. 18. 18:43
[수정] Rename 방식으로 변경(2024-07-04]
----
[빌드 시, Builtin AssetBundles에서 해당 Platform 에셋번들만 빌드 되도록 하기 위한 PreProcessor 추가]
기본적으로 에셋번들은 플랫폼 별로 모두 가지고 있는데 해당 플랫폼에 맞는 에셋번들만 빌드 되도록 하기 위해서
빌드 전(Preprocessor) 해당 안되는 AssetBundle을 Hidden 폴더(예:.Android or .iOS)로 Rename 했다가, 빌드 후(Postprocessor) 되돌려 놓음.
using System;
using UnityEngine;
using UnityEditor;
using UnityEditor.Build;
using System.IO;
#if UNITY_2018_1_OR_NEWER
using UnityEditor.Build.Reporting;
#endif
using UnityEditor.Callbacks;
namespace blueasa
{
/// <summary>
/// 빌드 시, Built-in AssetBundle에서 해당 Platform AssetBundle만 빌드 되도록 하기 위한 Preprocessor
/// 빌드 전(Preprocessor) 해당 안되는 AssetBundle을 Hidden 폴더(예:.Android or .iOS)로 Rename 했다가, 빌드 후(Postprocessor) 되돌려 놓음
/// [Hidden(./~) 참조] https://docs.unity3d.com/kr/2021.3/Manual/SpecialFolders.html
/// </summary>
#if UNITY_2018_1_OR_NEWER
public class BuildPreprocessor_BuiltinAssetBundle : IPreprocessBuildWithReport, IPostprocessBuildWithReport
#else
public class BuildPreprocessor_BuiltinAssetBundle : IPreprocessBuild, IPostprocessBuild
#endif
{
private static readonly string m_strAndroid = "Android";
private static readonly string m_strDotAndroid = ".Android";
private static readonly string m_striOS = "iOS";
private static readonly string m_strDotiOS = ".iOS";
private static readonly string m_strDotMeta = ".meta";
private static readonly string m_strAssetBundles = "AssetBundles";
private static readonly string m_strDataPath = Application.dataPath;
private static readonly string m_strStreamingAssetsPath = Application.streamingAssetsPath;
private static readonly string m_strAssetBundlesPath_Builtin_FullPath = string.Format("{0}/{1}", m_strStreamingAssetsPath, m_strAssetBundles);
private static readonly string m_strAssetBundlesPath_Builtin_Android_FullPath = string.Format("{0}/{1}", m_strAssetBundlesPath_Builtin_FullPath, m_strAndroid);
private static readonly string m_strAssetBundlesPath_Builtin_DotAndroid_FullPath = string.Format("{0}/{1}", m_strAssetBundlesPath_Builtin_FullPath, m_strDotAndroid);
private static readonly string m_strAssetBundlesPath_Builtin_iOS_FullPath = string.Format("{0}/{1}", m_strAssetBundlesPath_Builtin_FullPath, m_striOS);
private static readonly string m_strAssetBundlesPath_Builtin_DotiOS_FullPath = string.Format("{0}/{1}", m_strAssetBundlesPath_Builtin_FullPath, m_strDotiOS);
public int callbackOrder { get { return 0; } }
private static void Refresh()
{
System.Threading.Thread.Sleep(100);
AssetDatabase.Refresh();
System.Threading.Thread.Sleep(100);
}
#if UNITY_2018_1_OR_NEWER
public void OnPreprocessBuild(BuildReport report)
#else
public void OnPreprocessBuild(BuildTarget target, string path)
#endif
{
Debug.LogWarning($"[OnPreprocessBuild] {this}");
// 빌드 전, 다른 플랫폼 AssetBundle 폴더 임시 제외
#if UNITY_ANDROID
// [Rename]
if (true == Directory.Exists(m_strAssetBundlesPath_Builtin_iOS_FullPath)
&& false == Directory.Exists(m_strAssetBundlesPath_Builtin_DotiOS_FullPath))
{
Debug.LogWarning("[OnPreprocessBuild] Rename 'iOS' Folder to '.iOS'");
Directory.Move(m_strAssetBundlesPath_Builtin_iOS_FullPath, m_strAssetBundlesPath_Builtin_DotiOS_FullPath);
// 빈(Empty) 폴더 생성을 방지하기 위해서 폴더의 meta 파일도 함께 삭제
if (true == File.Exists(m_strAssetBundlesPath_Builtin_iOS_FullPath + m_strDotMeta))
{
File.Delete(m_strAssetBundlesPath_Builtin_iOS_FullPath + m_strDotMeta);
}
Refresh();
}
#elif UNITY_IOS
// [Rename]
if (true == Directory.Exists(m_strAssetBundlesPath_Builtin_Android_FullPath)
&& false == Directory.Exists(m_strAssetBundlesPath_Builtin_DotAndroid_FullPath))
{
Debug.LogWarning("[OnPreprocessBuild] Rename 'Android' Folder to '.Android'");
Directory.Move(m_strAssetBundlesPath_Builtin_Android_FullPath, m_strAssetBundlesPath_Builtin_DotAndroid_FullPath);
// 빈(Empty) 폴더 생성을 방지하기 위해서 폴더의 meta 파일도 함께 삭제
if (true == File.Exists(m_strAssetBundlesPath_Builtin_Android_FullPath + m_strDotMeta))
{
File.Delete(m_strAssetBundlesPath_Builtin_Android_FullPath + m_strDotMeta);
}
Refresh();
}
#endif
// Start listening for errors when build starts
Application.logMessageReceived += OnBuildError;
}
// CALLED DURING BUILD TO CHECK FOR ERRORS
private void OnBuildError(string condition, string stacktrace, LogType type)
{
Debug.LogWarning($"[OnBuildError] {condition} {stacktrace} {type}");
if (type == LogType.Error)
{
// FAILED TO BUILD, STOP LISTENING FOR ERRORS
Application.logMessageReceived -= OnBuildError;
// 빌드 에러 시에도 이동된 파일 되돌리기
RestoreTemporarilyMovedAssetbundles();
}
}
#if UNITY_2018_1_OR_NEWER
public void OnPostprocessBuild(BuildReport report)
#else
public void OnPostprocessBuild(BuildTarget target, string path)
#endif
{
Debug.LogWarning($"[OnPostprocessBuild] {this}");
// [빌드 후] 제외 됐던 다른 플랫폼 AssetBundle 폴더 되돌리기
RestoreTemporarilyMovedAssetbundles();
// IF BUILD FINISHED AND SUCCEEDED, STOP LOOKING FOR ERRORS
Application.logMessageReceived -= OnBuildError;
}
public static void RestoreTemporarilyMovedAssetbundles()
{
Debug.LogWarning($"[RestoreTemporarilyMovedAssetbundles]");
// [빌드 후] 제외 됐던 다른 플랫폼 AssetBundle 폴더 되돌리기
#if UNITY_ANDROID
// [Rename]
if (true == Directory.Exists(m_strAssetBundlesPath_Builtin_DotiOS_FullPath)
&& false == Directory.Exists(m_strAssetBundlesPath_Builtin_iOS_FullPath))
{
Debug.LogWarning("[OnPreprocessBuild] Rename '.iOS' Folder to 'iOS'");
Directory.Move(m_strAssetBundlesPath_Builtin_DotiOS_FullPath, m_strAssetBundlesPath_Builtin_iOS_FullPath);
Refresh();
}
#elif UNITY_IOS
// [Rename]
if (true == Directory.Exists(m_strAssetBundlesPath_Builtin_DotAndroid_FullPath)
&& false == Directory.Exists(m_strAssetBundlesPath_Builtin_Android_FullPath))
{
Debug.LogWarning("[OnPreprocessBuild] Rename '.Android' Folder to 'Android'");
Directory.Move(m_strAssetBundlesPath_Builtin_DotAndroid_FullPath, m_strAssetBundlesPath_Builtin_Android_FullPath);
Refresh();
}
#endif
}
}
}
반응형
'Unity3D > Script' 카테고리의 다른 글
[최적화] Automatic quality settings (0) | 2024.01.19 |
---|---|
[ChatGPT] Multi-Key Dictionary in Unity? (0) | 2023.08.07 |
[링크] 유니티 - Scripting Define Symbol 스크립트로 제어하기 (0) | 2022.07.20 |
[펌] 유니티 MonoBehaviour 상속 안 받고 코루틴 사용하기 (0) | 2022.05.18 |
[링크] Well512 알고리즘 예제, 난수 생성기, 랜덤 포레스트(Random Forest) (0) | 2021.10.25 |