public static void Build( string strPath, BuildTarget target ) { if ( !System.IO.Directory.Exists( strPath ) ) System.IO.Directory.CreateDirectory( strPath ); AssetBundleBuild[] existingBundles = AssetDatabase.GetAllAssetBundleNames().Select( x => new AssetBundleBuild() { assetBundleName = x, assetBundleVariant = "", assetNames = AssetDatabase.GetAssetPathsFromAssetBundle( x ) } ).ToArray(); EditorUtility.DisplayProgressBar( "SplitContent", "", 0 ); var newBundles = SplitContent( existingBundles ); BuildPipeline.BuildAssetBundles( strPath, newBundles, BuildAssetBundleOptions.UncompressedAssetBundle | BuildAssetBundleOptions.DeterministicAssetBundle, target ); EditorUtility.ClearProgressBar(); } static AssetBundleBuild[] SplitContent( AssetBundleBuild[] existingBundles ) { EditorUtility.DisplayProgressBar( "SplitContent", "Get Explicitly Included Content", 0 ); var explicitlyIncluded = existingBundles.SelectMany( x => x.assetNames ).ToArray(); EditorUtility.DisplayProgressBar( "SplitContent", "Find All Included Files", 0 ); var allIncludes = explicitlyIncluded.SelectMany( x => { if ( System.IO.Directory.Exists( x ) ) { return AssetDatabase.FindAssets( "", new[] { x } ).Select( y => AssetDatabase.GUIDToAssetPath( y ) ); } else { return new[] { x }; } } ).Distinct().ToArray(); EditorUtility.DisplayProgressBar( "SplitContent", "GetDependencies", 0 ); var allDependancies = AssetDatabase.GetDependencies( allIncludes ) // Get all dependencies .Where( x => !allIncludes.Contains( x ) ) // that aren't included explicitly .Distinct(); var extraIncludes = new List<AssetBundleBuild>(); EditorUtility.DisplayProgressBar( "SplitContent", "Textures", 0 ); { var allContent = allDependancies.Where( x => { return x.EndsWith( ".tga", System.StringComparison.CurrentCultureIgnoreCase ) || x.EndsWith( ".tif", System.StringComparison.CurrentCultureIgnoreCase ) || x.EndsWith( ".png", System.StringComparison.CurrentCultureIgnoreCase ) || x.EndsWith( ".jpg", System.StringComparison.CurrentCultureIgnoreCase ) || x.EndsWith( ".psd", System.StringComparison.CurrentCultureIgnoreCase ) ; } ); foreach ( var group in allContent.GroupBy( x => Mathf.Abs( x.GetHashCode() % 128 ) ) ) { extraIncludes.Add( new AssetBundleBuild() { assetNames = group.ToArray(), assetBundleVariant = "", assetBundleName = "content/textures/" + group.Key.ToString( "000" ) + ".content" } ); } } EditorUtility.DisplayProgressBar( "SplitContent", "Audio", 0 ); { var allContent = allDependancies.Where( x => { return x.EndsWith( ".wav", System.StringComparison.CurrentCultureIgnoreCase ) || x.EndsWith( ".mp3", System.StringComparison.CurrentCultureIgnoreCase ) || x.EndsWith( ".ogg", System.StringComparison.CurrentCultureIgnoreCase ) ; } ); foreach ( var group in allContent.GroupBy( x => Mathf.Abs( x.GetHashCode() % 128 ) ) ) { extraIncludes.Add( new AssetBundleBuild() { assetNames = group.ToArray(), assetBundleVariant = "", assetBundleName = "content/audio/" + group.Key.ToString( "000" ) + ".content" } ); } } extraIncludes.AddRange( existingBundles ); return extraIncludes.ToArray(); }