Skip to content

Instantly share code, notes, and snippets.

@st0326s
Last active August 25, 2016 12:19
Show Gist options
  • Save st0326s/e714afca98890707ed47 to your computer and use it in GitHub Desktop.
Save st0326s/e714afca98890707ed47 to your computer and use it in GitHub Desktop.
アセットバンドルの作り方・ロード方法の色々メモ(ver5.4.0f3・ver5.3.0f4・ver5.0.1f・ver4.6.2) ref: http://qiita.com/satotin/items/7a481c69230e9393401b
using UnityEngine;
using System.Collections;
public class AssetBundleLoad_Unity5 : MonoBehaviour {
public void CreateFileAssetBundleFileLoad()
{
// マニフェストが入っているファイルをパスで指定
string path = Application.streamingAssetsPath + "/" + "BuildOutPut" + "/";
// マニフェストのアセットバンドルを作成
// (マニフェストのアセットバンドルの中にアセットバンドル化したデータ群が入っている)
AssetBundle NoCompress = AssetBundle.CreateFromFile(path + "BuildOutPut");
string[] AssetList = NoCompress.GetAllAssetNames();
// マニフェスト全アセットバンドルの中身をループ
foreach (string AssetNames in AssetList)
{
// マニフェストのアセットバンドルからマニフェストデータをロード
AssetBundleManifest manifest = NoCompress.LoadAsset<AssetBundleManifest>(AssetNames);
// マニフェストから全マニフェスト名を取得
string[] bundleNames = manifest.GetAllAssetBundles();
// 全マニフェスト内をループ
foreach (string bundleName in bundleNames)
{
// 指定パスのアセットバンドルを取得
AssetBundle inBundleName = AssetBundle.CreateFromFile(path + bundleName);
// 含まれるアセットバンドルリストを取得
string[] inBundleList = inBundleName.GetAllAssetNames();
// 指定パスの全アセットバンドル内をループ
foreach (string inBundleNameString in inBundleList)
{
GameObject prefab = inBundleName.LoadAsset<GameObject>(inBundleNameString);
Instantiate(prefab);
}
}
}
}
}
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using System.IO;
public class AssetBundleManager : MonoBehaviour {
/// <summary>
/// UnZip完了後にコールされる
/// </summary>
public void CreateFromMemoryLoad()
{
StartCoroutine("FromMemoryLoad");
}
/// <summary>
/// UnZipしたByte配列からAssetBundleを取り出す。
/// </summary>
/// <returns></returns>
IEnumerator FromMemoryLoad()
{
// Zipファイルリスト内をループ
foreach (DownLoadData downloaddata in SingletonDownLoadData.Instance.DownLoadDataList)
{
List<MemoryStream> UnZipDataList = downloaddata.UnZipDataList;
List<string> UnZipFileList = downloaddata.FileNameList;
int test = 0;
// 解凍したZipファイルリスト内をループ
foreach(MemoryStream m_stream in UnZipDataList )
{
Debug.Log("test=" + test.ToString());
AssetBundleCreateRequest assetBundleCreateRequest = AssetBundle.CreateFromMemory(m_stream.GetBuffer());
// AssetBundleCreateRequestの完了待ち
yield return StartCoroutine(WaitBundleRequest(assetBundleCreateRequest));
AssetBundle assetBundle = assetBundleCreateRequest.assetBundle;
if (assetBundle != null)
{
string[] AssetList = assetBundle.GetAllAssetNames();
// マニフェスト全アセットバンドルの中身をループ
foreach (string AssetNames in AssetList)
{
// マニフェストのアセットバンドルからマニフェストデータをロード
AssetBundleManifest manifest = assetBundle.LoadAsset<AssetBundleManifest>(AssetNames);
// マニフェストから全バンドル名を取得
string[] bundleNames = manifest.GetAllAssetBundles();
// 指定マニフェスト内をループ
foreach (string bundleName in bundleNames)
{
int i = 0;
AssetBundleCreateRequest TargetAssetBundleCreateRequest = new AssetBundleCreateRequest();
foreach (string filename in UnZipFileList)
{
if (bundleName == filename)
{
TargetAssetBundleCreateRequest = AssetBundle.CreateFromMemory(UnZipDataList.ToArray()[i].GetBuffer());
break;
}
i++;
}
// ターゲットとなるAssetBundleCreateRequestの完了待ち
yield return StartCoroutine(WaitBundleRequest(TargetAssetBundleCreateRequest));
// 指定データのアセットバンドルを取得
AssetBundle TargetAssetBundle = TargetAssetBundleCreateRequest.assetBundle;
// 含まれるアセットバンドルリストを取得
string[] inBundleList = TargetAssetBundle.GetAllAssetNames();
// 指定データの全アセットバンドル内をループ
foreach (string inBundleNameString in inBundleList)
{
GameObject prefab = TargetAssetBundle.LoadAsset<GameObject>(inBundleNameString);
Instantiate(prefab);
}
}
}
}
test++;
}
}
}
/// <summary>
/// AssetBundleCreateRequestのisDoneを待つ
/// </summary>
/// <returns></returns>
IEnumerator WaitBundleRequest(AssetBundleCreateRequest GetRequest)
{
while (GetRequest.isDone == false)
{
yield return 0;
}
}
}
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using System.IO;
public class AssetBundleManger : MonoBehaviour {
/// <summary>
/// UnZip完了後にコールされる
/// </summary>
public void CreateFromMemoryLoad()
{
StartCoroutine("FromMemoryLoad");
}
/// <summary>
/// UnZipしたByte配列からAssetBundleを取り出す。
/// </summary>
/// <returns></returns>
IEnumerator FromMemoryLoad()
{
// Zipファイルリスト内をループ
foreach (DownLoadData downloaddata in SingletonDownLoadData.Instance.DownLoadDataList)
{
List<MemoryStream> UnZipDataList = downloaddata.UnZipDataList;
List<string> UnZipFileList = downloaddata.FileNameList;
int test = 0;
// 解凍したZipファイルリスト内をループ
foreach(MemoryStream m_stream in UnZipDataList )
{
Debug.Log("test=" + test.ToString());
AssetBundleCreateRequest assetBundleCreateRequest = AssetBundle.CreateFromMemory(m_stream.GetBuffer());
// AssetBundleCreateRequestの完了待ち
yield return StartCoroutine(WaitBundleRequest(assetBundleCreateRequest));
AssetBundle assetBundle = assetBundleCreateRequest.assetBundle;
if (assetBundle != null)
{
string[] AssetList = assetBundle.GetAllAssetNames();
// マニフェスト全アセットバンドルの中身をループ
foreach (string AssetNames in AssetList)
{
// マニフェストのアセットバンドルからマニフェストデータをロード
AssetBundleManifest manifest = assetBundle.LoadAsset<AssetBundleManifest>(AssetNames);
// マニフェストから全バンドル名を取得
string[] bundleNames = manifest.GetAllAssetBundles();
// 指定マニフェスト内をループ
foreach (string bundleName in bundleNames)
{
int i = 0;
AssetBundleCreateRequest TargetAssetBundleCreateRequest = new AssetBundleCreateRequest();
foreach (string filename in UnZipFileList)
{
if (bundleName == filename)
{
TargetAssetBundleCreateRequest = AssetBundle.CreateFromMemory(UnZipDataList.ToArray()[i].GetBuffer());
break;
}
i++;
}
// ターゲットとなるAssetBundleCreateRequestの完了待ち
yield return StartCoroutine(WaitBundleRequest(TargetAssetBundleCreateRequest));
// 指定データのアセットバンドルを取得
AssetBundle TargetAssetBundle = TargetAssetBundleCreateRequest.assetBundle;
// 含まれるアセットバンドルリストを取得
string[] inBundleList = TargetAssetBundle.GetAllAssetNames();
// 指定データの全アセットバンドル内をループ
foreach (string inBundleNameString in inBundleList)
{
GameObject prefab = TargetAssetBundle.LoadAsset<GameObject>(inBundleNameString);
Instantiate(prefab);
}
}
}
}
test++;
}
}
}
/// <summary>
/// AssetBundleCreateRequestのisDoneを待つ
/// </summary>
/// <returns></returns>
IEnumerator WaitBundleRequest(AssetBundleCreateRequest GetRequest)
{
while (GetRequest.isDone == false)
{
yield return 0;
}
}
}
public void CreateMultiFileLoad()
{
// Prefabsフォルダ内からPrefab拡張子のみを取得
string[] fs = System.IO.Directory.GetFiles("C://AssetBundleTest/StreamingAssets", "*.unity3d");
List<string> BundleList = new List<string>();
List<Object> BundleObjectList = new List<Object>();
BundleList.AddRange(fs);
foreach (string pathname in BundleList)
{
AssetBundle NoCompress = AssetBundle.CreateFromFile(pathname);
//Object[] selection = NoCompress.LoadAll();
Instantiate(NoCompress.mainAsset);
NoCompress.Unload(false);
}
}
using UnityEngine;
using UnityEditor;
using System.Collections;
public class ExportAssetBundles : MonoBehaviour
{
[MenuItem("Assets/Unity 5.x Build AssetBundle")]
static void ExportResource_Unity5()
{
Debug.Log("Target=" + EditorUserBuildSettings.activeBuildTarget.ToString());
// PlatForm名をそのまま出力フォルダとして使用する。
string OutPutPath = Application.streamingAssetsPath + "/" + EditorUserBuildSettings.activeBuildTarget.ToString();
// 指定フォルダ存在チェック
if (Directory.Exists(OutPutPath) == false )
{
Directory.CreateDirectory(OutPutPath);
}
// プラットフォーム名(Android・iOS)のマニフェストのアセットバンドルが作られる。
BuildPipeline.BuildAssetBundles(OutPutPath, 0, EditorUserBuildSettings.activeBuildTarget);
Debug.Log("ComPress End");
}
}
:ExportAssetBundles.cs
[MenuItem("Assets/Build AssetBundle From Selection - Track dependencies")]
static void ExportResource()
{
string path = EditorUtility.SaveFilePanel("Save Resource", "", "New Resource", "unity3d");
{
// Build the resource file from the active selection.
Object[] selection = Selection.GetFiltered(typeof(Object), SelectionMode.DeepAssets);
BuildPipeline.BuildAssetBundle(Selection.activeObject, selection, path,
BuildAssetBundleOptions.CollectDependencies | BuildAssetBundleOptions.CompleteAssets); 
}
}
public List<Texture2D> TextureLists = new List<Texture2D> ();
public List<Material> MaterialLists = new List<Material> ();
public List<GameObject> GameObjectLists = new List<GameObject> ();
List<string> listMaster = new List<string> ();
public void TestLoc1_BundleLoadStreamingAssets ()
{
#if UNITY_IPHONE
AssetBundle manifestBundle = AssetBundle.LoadFromFile (Application.dataPath + "/Raw/iOS");
#elif UNITY_EDITOR
AssetBundle manifestBundle = AssetBundle.LoadFromFile (Application.streamingAssetsPath + "/iOS");
#endif
AssetBundleManifest manifest = manifestBundle.LoadAsset ("AssetBundleManifest") as AssetBundleManifest;
List<string> ListA = new List<string> ();
// シーンに必要なもの
ListA.Add (フォルダアセットバンドル名1);
ListA.Add (フォルダアセットバンドル名2);
ListA.Add (フォルダアセットバンドル名3);
ListA.Add (フォルダアセットバンドル名4);
ListA.Add (フォルダアセットバンドル名5);
ListA.Add (フォルダアセットバンドル名6);
// シーン
ListA.Add (シーンのアセットバンドル名);
listMaster.AddRange (ListA);
bool noDependenceFlg = false;
while ( noDependenceFlg == false ) {
List<string> ListB = new List<string> ();
// 1段階ネストされた依存関係リストを作成
foreach (string bundlename in ListA) {
// 直接の依存関係リストを取得
string[] dependenceArray = manifest.GetDirectDependencies (bundlename);
ListB.AddRange (dependenceArray);
}
// 重複排除
ListB = ListB.Distinct ().ToList ();
ListA.Sort ();
ListB.Sort ();
if ( (ListB.Count == 0) || (ListA.SequenceEqual (ListB) == true) ) {
noDependenceFlg = true;
} else {
// 1段階ネストされた依存関係リストを作成
foreach (string dependenceBundle in ListB) {
// すでに存在すれば削除して最後尾に追加
if ( listMaster.Contains (dependenceBundle) == true ) {
listMaster.Remove (dependenceBundle);
}
listMaster.Add (dependenceBundle);
}
ListA.Clear ();
ListA.AddRange (ListB);
}
}
listMaster.Reverse ();
Debug.Log ("Count=" + listMaster.Count.ToString ());
foreach (string bundleName in listMaster) {
string bundleString = bundleName;
Debug.Log ("bundleName=" + bundleName);
#if UNITY_IPHONE
AssetBundle bundleData = AssetBundle.LoadFromFile (Application.dataPath + "/Raw/" + bundleName);
#elif UNITY_EDITOR
AssetBundle bundleData = AssetBundle.LoadFromFile (Application.streamingAssetsPath + "/" + bundleName);
#endif
if ( bundleData.isStreamedSceneAssetBundle == true ) {
string[] sceneString = bundleData.GetAllScenePaths ();
Debug.Log ("scene=" + sceneString [0]);
string scenePath = Path.GetFileNameWithoutExtension (sceneString [0]);
SceneManager.LoadSceneAsync (scenePath, LoadSceneMode.Additive);
return;
}
UnityEngine.Object[] objects = bundleData.LoadAllAssets ();
foreach (UnityEngine.Object obj in objects) {
Debug.Log ("Name=" + obj.name + " Type=" + obj.GetType ().ToString ());
if ( obj.GetType () == typeof(GameObject) ) {
GameObjectLists.Add (obj as UnityEngine.GameObject);
Instantiate (obj);
} else if ( obj.GetType () == typeof(Texture2D) ) {
TextureDic.Add (obj as Texture2D);
} else if ( obj.GetType () == typeof(Material) ) {
Debug.Log ("<color=red>Main Material= " + obj.name + "</color>");
MaterialDic.Add (obj as Material);
}
}
// bundleData.Unload (false);
}
}
:ExportAssetBundles.cs
[MenuItem("Assets/Build AssetBundle From Selection - Track dependencies")]
static void ExportResource()
{
string path = EditorUtility.SaveFilePanel("Save Resource", "", "New Resource", "unity3d");
{
// Build the resource file from the active selection.
Object[] selection = Selection.GetFiltered(typeof(Object), SelectionMode.DeepAssets);
BuildPipeline.BuildAssetBundle(Selection.activeObject, selection, path,
BuildAssetBundleOptions.CollectDependencies
| BuildAssetBundleOptions.CompleteAssets
| BuildAssetBundleOptions.UncompressedAssetBundle); 
}
}
public List<Texture2D> TextureLists = new List<Texture2D> ();
public List<Material> MaterialLists = new List<Material> ();
public List<GameObject> GameObjectLists = new List<GameObject> ();
List<string> listMaster = new List<string> ();
public void TestLoc1_Android_BundleLoadStreamingAssets()
{
StartCoroutine(loadBundle_StreamingAssets());
}
IEnumerator loadBundle_StreamingAssets()
{
string loadPath = "jar:file://" + Application.dataPath + "!/assets/AssetBundle/";
string manifestPath = loadPath + "Android";
Debug.Log("manifestPath=" + manifestPath);
var www = WWW.LoadFromCacheOrDownload(manifestPath,1);
yield return www;
AssetBundle manifestBundle = www.assetBundle;
AssetBundleManifest manifest = manifestBundle.LoadAsset("AssetBundleManifest") as AssetBundleManifest;
List<string> ListA = new List<string>();
ListA.Add(アセットバンドル名1);
ListA.Add(アセットバンドル名2);
ListA.Add(アセットバンドル名3);
ListA.Add(アセットバンドル名4);
ListA.Add(アセットバンドル名5);
ListA.Add(アセットバンドル名6);
ListA.Add(シーンアセットバンドル名);
listMaster.AddRange(ListA);
bool noDependenceFlg = false;
while (noDependenceFlg == false)
{
List<string> ListB = new List<string>();
// 1段階ネストされた依存関係リストを作成
foreach (string bundlename in ListA)
{
// 直接の依存関係リストを取得
string[] dependenceArray = manifest.GetDirectDependencies(bundlename);
ListB.AddRange(dependenceArray);
}
// 重複排除
ListB = ListB.Distinct().ToList();
ListA.Sort();
ListB.Sort();
if ((ListB.Count == 0) || (ListA.SequenceEqual(ListB) == true))
{
noDependenceFlg = true;
}
else {
// 1段階ネストされた依存関係リストを作成
foreach (string dependenceBundle in ListB)
{
// すでに存在すれば削除して最後尾に追加
if (listMaster.Contains(dependenceBundle) == true)
{
listMaster.Remove(dependenceBundle);
}
listMaster.Add(dependenceBundle);
}
ListA.Clear();
ListA.AddRange(ListB);
}
}
listMaster.Reverse();
Debug.Log("Count=" + listMaster.Count.ToString());
foreach (string bundleName in listMaster)
{
string bundleString = bundleName;
Debug.Log("bundleName=" + "jar:file://" + Application.dataPath + "!/assets/AssetBundle/" + bundleName);
var wwwfile = WWW.LoadFromCacheOrDownload("jar:file://" + Application.dataPath + "!/assets/AssetBundle/" + bundleName, 1);
yield return wwwfile;
AssetBundle bundleData = wwwfile.assetBundle;
if ( bundleData.isStreamedSceneAssetBundle == true ) {
string[] sceneString = bundleData.GetAllScenePaths ();
string scenePath = Path.GetFileNameWithoutExtension (sceneString [0]);
SceneManager.LoadSceneAsync (scenePath, LoadSceneMode.Additive);
return;
}
UnityEngine.Object[] objects = bundleData.LoadAllAssets();
foreach (UnityEngine.Object obj in objects)
{
Debug.Log("Name=" + obj.name + " Type=" + obj.GetType().ToString());
if (obj.GetType() == typeof(GameObject))
{
GameObjectLists.Add(obj as UnityEngine.GameObject);
Instantiate(obj);
}
else if (obj.GetType() == typeof(Texture2D))
{
TextureDic.Add(obj as Texture2D);
}
else if (obj.GetType() == typeof(Material))
{
Debug.Log("<color=red>Main Material= " + obj.name + "</color>");
MaterialDic.Add(obj as Material);
}
}
// bundleData.Unload (false);
}
}
[MenuItem("Assets/AssetBundle/Export_Android")]
static void Export_Android_AssetBundle()
{
ExportAllAssetBundleIntoAllFile(BuildTarget.Android);
}
[MenuItem("Assets/AssetBundle/Export_iOS")]
static void Export_iPhone_AssetBundle()
{
ExportAllAssetBundleIntoAllFile(BuildTarget.iOS);
}
static void ExportAllAssetBundleIntoAllFile(BuildTarget Target)
{
Debug.Log("Target=" + Target.ToString());
// 親ディレクトリ+AssetBundleディレクトリ
string strCurrent = System.IO.Directory.GetCurrentDirectory() + "/" + "AssetBundle";
// PlatForm名をそのまま出力フォルダとして使用する。
string OutPutPath = strCurrent + "/" + Target;
DirectoryInfo di = new DirectoryInfo(OutPutPath);
// 指定フォルダ存在チェック
if (Directory.Exists(OutPutPath) == true)
{
//フォルダ以下のすべてのファイル、フォルダの属性を削除
RemoveReadonlyAttribute(di);
//フォルダを根こそぎ削除
di.Delete(true); // 存在すれば削除
}
// フォルダを作り直すか新規作成
Directory.CreateDirectory(OutPutPath);
// プラットフォーム名(Android・iOS)のマニフェストのアセットバンドルが作られる。
BuildPipeline.BuildAssetBundles(OutPutPath, BuildAssetBundleOptions.UncompressedAssetBundle, Target);
Debug.Log("Export End");
// 拡張子がマニフェストのものを削除
foreach (string file in Directory.GetFiles(OutPutPath, "*.manifest"))
{
File.Delete(file);
}
// Gzipフォルダを作成
Directory.CreateDirectory(OutPutPath + "/Gzip");
// HTTPリストの作成
Encoding sjisEnc = Encoding.GetEncoding("Shift_JIS");
// 全ファイルをGzip圧縮
foreach (string file in Directory.GetFiles(OutPutPath, "*.*"))
{
string filename = System.IO.Path.GetFileNameWithoutExtension(file);
// 出力ファイルの拡張子は「.gz」
string outFile = OutPutPath + "/Gzip/" + filename + ".gz";
int num;
byte[] buf = new byte[1024]; // 1Kbytesずつ処理する
FileStream inStream // 入力ストリーム
= new FileStream(file, FileMode.Open, FileAccess.Read);
// ファイルサイズをバイトに変換
byte[] filesizehedder = new byte[8];
filesizehedder = BitConverter.GetBytes(inStream.Length);
FileStream outStream // 出力ストリーム
= new FileStream(outFile, FileMode.Create);
GZipStream compStream // 圧縮ストリーム
= new GZipStream(
outStream, // 出力先となるストリームを指定
CompressionMode.Compress); // 圧縮を指定
using (inStream)
using (outStream)
using (compStream)
{
//compStream.Write(filesizehedder, 0, 8);
while ((num = inStream.Read(buf, 0, buf.Length)) > 0)
{
compStream.Write(buf, 0, num);
}
}
}
// Tarフォルダを作成
Directory.CreateDirectory(OutPutPath + "/Gzip/Tar");
StreamWriter writer =
new StreamWriter(OutPutPath + "/Gzip/Tar/httplist.txt", true, sjisEnc);
// 全ファイルGzipをTarアーカイブにする
foreach (string file in Directory.GetFiles(OutPutPath + "/Gzip", "*.*"))
{
string filename = System.IO.Path.GetFileNameWithoutExtension(file);
// 出力ファイルの拡張子は「.tar」
string outFile = OutPutPath + "/Gzip/Tar/" + filename + ".tar";
Debug.Log("filename=" + filename);
Debug.Log("outFile=" + outFile);
// Tarファイル作成
CreateTar(outFile, file);
// HTTPリストに書き込み
writer.WriteLine("DownLoadUrlAdd(" + "\"" + "http://999.99.99.999/Tar/" + Path.GetFileName(outFile) + "\"" + ");");
Debug.Log("WriteLine");
}
writer.Close();
Debug.Log("HttpList End");
}
/// <summary>
/// Tarファイル作成
/// </summary>
/// <param name="outputTarFilename">Output .tar.gz file</param>
/// <param name="sourceDirectory">Input directory containing files to be added to GZipped tar archive</param>
private static void CreateTar(string outputTarFilename, string readfilename)
{
using (FileStream fs = new FileStream(outputTarFilename, FileMode.Create, FileAccess.Write, FileShare.None))
using (TarArchive tarArchive = TarArchive.CreateOutputTarArchive(fs))
{
TarEntry tarEntry = TarEntry.CreateEntryFromFile(readfilename);
tarArchive.WriteEntry(tarEntry, true);
}
}
using UnityEngine;
using UnityEditor;
using System.Collections;
using System.Collections.Generic;
using Ionic.Zlib;
using System.IO;
using System.Text;
using System;
using ICSharpCode.SharpZipLib.Tar;
[MenuItem("Assets/AssetBundle/Export_Android")]
static void Export_Android_AssetBundle()
{
ExportAllAssetBundleIntoAllFile(BuildTarget.Android);
}
[MenuItem("Assets/AssetBundle/Export_iOS")]
static void Export_iPhone_AssetBundle()
{
ExportAllAssetBundleIntoAllFile(BuildTarget.iOS);
}
static void ExportAllAssetBundleIntoAllFile(BuildTarget Target)
{
Debug.Log("Target=" + Target.ToString());
// 親ディレクトリ+AssetBundleディレクトリ
string strCurrent = System.IO.Directory.GetCurrentDirectory() + "/" + "AssetBundle";
// PlatForm名をそのまま出力フォルダとして使用する。
string OutPutPath = strCurrent + "/" + Target;
DirectoryInfo di = new DirectoryInfo(OutPutPath);
// 指定フォルダ存在チェック
if (Directory.Exists(OutPutPath) == true)
{
//フォルダ以下のすべてのファイル、フォルダの属性を削除
RemoveReadonlyAttribute(di);
//フォルダを根こそぎ削除
di.Delete(true); // 存在すれば削除
}
// フォルダを作り直すか新規作成
Directory.CreateDirectory(OutPutPath);
// プラットフォーム名(Android・iOS)のマニフェストのアセットバンドルが作られる。
BuildPipeline.BuildAssetBundles(OutPutPath, BuildAssetBundleOptions.UncompressedAssetBundle, Target);
Debug.Log("Export End");
// 拡張子がマニフェストのものを削除
foreach (string file in Directory.GetFiles(OutPutPath, "*.manifest"))
{
File.Delete(file);
}
// Gzipフォルダを作成
Directory.CreateDirectory(OutPutPath + "/Gzip");
// HTTPリストの作成
Encoding sjisEnc = Encoding.GetEncoding("Shift_JIS");
// 全ファイルをGzip圧縮
foreach (string file in Directory.GetFiles(OutPutPath, "*.*"))
{
string filename = System.IO.Path.GetFileNameWithoutExtension(file);
// 出力ファイルの拡張子は「.gz」
string outFile = OutPutPath + "/Gzip/" + filename + ".gz";
int num;
byte[] buf = new byte[1024]; // 1Kbytesずつ処理する
FileStream inStream // 入力ストリーム
= new FileStream(file, FileMode.Open, FileAccess.Read);
// ファイルサイズをバイトに変換
byte[] filesizehedder = new byte[8];
filesizehedder = BitConverter.GetBytes(inStream.Length);
FileStream outStream // 出力ストリーム
= new FileStream(outFile, FileMode.Create);
GZipStream compStream // 圧縮ストリーム
= new GZipStream(
outStream, // 出力先となるストリームを指定
CompressionMode.Compress); // 圧縮を指定
using (inStream)
using (outStream)
using (compStream)
{
//compStream.Write(filesizehedder, 0, 8);
while ((num = inStream.Read(buf, 0, buf.Length)) > 0)
{
compStream.Write(buf, 0, num);
}
}
}
// Tarフォルダを作成
Directory.CreateDirectory(OutPutPath + "/Gzip/Tar");
StreamWriter writer =
new StreamWriter(OutPutPath + "/Gzip/Tar/httplist.txt", true, sjisEnc);
// 全ファイルGzipをTarアーカイブにする
foreach (string file in Directory.GetFiles(OutPutPath + "/Gzip", "*.*"))
{
string filename = System.IO.Path.GetFileNameWithoutExtension(file);
// 出力ファイルの拡張子は「.tar」
string outFile = OutPutPath + "/Gzip/Tar/" + filename + ".tar";
Debug.Log("filename=" + filename);
Debug.Log("outFile=" + outFile);
// Tarファイル作成
CreateTar(outFile, file);
// HTTPリストに書き込み
writer.WriteLine("DownLoadUrlAdd(" + "\"" + "http://999.99.99.999/Tar/" + Path.GetFileName(outFile) + "\"" + ");");
Debug.Log("WriteLine");
}
writer.Close();
Debug.Log("HttpList End");
}
/// <summary>
/// Tarファイル作成
/// </summary>
/// <param name="outputTarFilename">Output .tar.gz file</param>
/// <param name="sourceDirectory">Input directory containing files to be added to GZipped tar archive</param>
private static void CreateTar(string outputTarFilename, string readfilename)
{
using (FileStream fs = new FileStream(outputTarFilename, FileMode.Create, FileAccess.Write, FileShare.None))
using (TarArchive tarArchive = TarArchive.CreateOutputTarArchive(fs))
{
TarEntry tarEntry = TarEntry.CreateEntryFromFile(readfilename);
tarArchive.WriteEntry(tarEntry, true);
}
}
using UnityEngine;
using UnityEditor;
using System.Collections;
using System.Collections.Generic;
using Ionic.Zlib;
using System.IO;
using System.Text;
using System;
using ICSharpCode.SharpZipLib.Tar;
using UnityEngine;
using UnityEditor;
using System.Collections;
using System.Collections.Generic;
using Ionic.Zlib;
using System.IO;
using System.Text;
using System;
using ICSharpCode.SharpZipLib.Tar;
using UnityEngine;
using UnityEditor;
using System.Collections;
using System.Collections.Generic;
using Ionic.Zlib;
using System.IO;
using System.Text;
using System;
using ICSharpCode.SharpZipLib.Tar;
:AssetBundleTestLoader.cs
public void CreateSingleFileLoad()
{
string path = "C://AssetBundleTest/StreamingAssets/myAssetBundle.unity3d";
AssetBundle NoCompress = AssetBundle.CreateFromFile(path);
Object[] selection = NoCompress.LoadAll();
Instantiate(NoCompress.mainAsset);
NoCompress.Unload(false);
Debug.Log("Asset End");
}
BuildPipeline.BuildAssetBundles(出力先, BuildAssetBundleOptions.UncompressedAssetBundle, プラットフォーム);
[MenuItem("Assets/AssetBundle/Export_Android")]
static void Export_Android_AssetBundle()
{
ExportAllAssetBundleIntoAllFile(BuildTarget.Android);
}
[MenuItem("Assets/AssetBundle/Export_iOS")]
static void Export_iPhone_AssetBundle()
{
ExportAllAssetBundleIntoAllFile(BuildTarget.iOS);
}
static void ExportAllAssetBundleIntoAllFile(BuildTarget Target)
{
Debug.Log("Target=" + Target.ToString());
// 親ディレクトリ+AssetBundleディレクトリ
string strCurrent = System.IO.Directory.GetCurrentDirectory() + "/" + "AssetBundle";
// PlatForm名をそのまま出力フォルダとして使用する。
string OutPutPath = strCurrent + "/" + Target;
DirectoryInfo di = new DirectoryInfo(OutPutPath);
// 指定フォルダ存在チェック
if (Directory.Exists(OutPutPath) == true)
{
//フォルダ以下のすべてのファイル、フォルダの属性を削除
RemoveReadonlyAttribute(di);
//フォルダを根こそぎ削除
di.Delete(true); // 存在すれば削除
}
// フォルダを作り直すか新規作成
Directory.CreateDirectory(OutPutPath);
// プラットフォーム名(Android・iOS)のマニフェストのアセットバンドルが作られる。
BuildPipeline.BuildAssetBundles(OutPutPath, BuildAssetBundleOptions.UncompressedAssetBundle, Target);
Debug.Log("Export End");
// 拡張子がマニフェストのものを削除
foreach (string file in Directory.GetFiles(OutPutPath, "*.manifest"))
{
File.Delete(file);
}
// Gzipフォルダを作成
Directory.CreateDirectory(OutPutPath + "/Gzip");
// HTTPリストの作成
Encoding sjisEnc = Encoding.GetEncoding("Shift_JIS");
// 全ファイルをGzip圧縮
foreach (string file in Directory.GetFiles(OutPutPath, "*.*"))
{
string filename = System.IO.Path.GetFileNameWithoutExtension(file);
// 出力ファイルの拡張子は「.gz」
string outFile = OutPutPath + "/Gzip/" + filename + ".gz";
int num;
byte[] buf = new byte[1024]; // 1Kbytesずつ処理する
FileStream inStream // 入力ストリーム
= new FileStream(file, FileMode.Open, FileAccess.Read);
// ファイルサイズをバイトに変換
byte[] filesizehedder = new byte[8];
filesizehedder = BitConverter.GetBytes(inStream.Length);
FileStream outStream // 出力ストリーム
= new FileStream(outFile, FileMode.Create);
GZipStream compStream // 圧縮ストリーム
= new GZipStream(
outStream, // 出力先となるストリームを指定
CompressionMode.Compress); // 圧縮を指定
using (inStream)
using (outStream)
using (compStream)
{
//compStream.Write(filesizehedder, 0, 8);
while ((num = inStream.Read(buf, 0, buf.Length)) > 0)
{
compStream.Write(buf, 0, num);
}
}
}
// Tarフォルダを作成
Directory.CreateDirectory(OutPutPath + "/Gzip/Tar");
StreamWriter writer =
new StreamWriter(OutPutPath + "/Gzip/Tar/httplist.txt", true, sjisEnc);
// 全ファイルGzipをTarアーカイブにする
foreach (string file in Directory.GetFiles(OutPutPath + "/Gzip", "*.*"))
{
string filename = System.IO.Path.GetFileNameWithoutExtension(file);
// 出力ファイルの拡張子は「.tar」
string outFile = OutPutPath + "/Gzip/Tar/" + filename + ".tar";
Debug.Log("filename=" + filename);
Debug.Log("outFile=" + outFile);
// Tarファイル作成
CreateTar(outFile, file);
// HTTPリストに書き込み
writer.WriteLine("DownLoadUrlAdd(" + "\"" + "http://999.99.99.999/Tar/" + Path.GetFileName(outFile) + "\"" + ");");
Debug.Log("WriteLine");
}
writer.Close();
Debug.Log("HttpList End");
}
/// <summary>
/// Tarファイル作成
/// </summary>
/// <param name="outputTarFilename">Output .tar.gz file</param>
/// <param name="sourceDirectory">Input directory containing files to be added to GZipped tar archive</param>
private static void CreateTar(string outputTarFilename, string readfilename)
{
using (FileStream fs = new FileStream(outputTarFilename, FileMode.Create, FileAccess.Write, FileShare.None))
using (TarArchive tarArchive = TarArchive.CreateOutputTarArchive(fs))
{
TarEntry tarEntry = TarEntry.CreateEntryFromFile(readfilename);
tarArchive.WriteEntry(tarEntry, true);
}
}
:ExportAssetBundles.cs
[MenuItem("Assets/Build MultiFolder")]
static void ExportMultiResource()
{
// 保存先のフルパス(Assetsからのパスではない)
string path = "C://AssetBundleTest/StreamingAssets/";
string filename = "myAssetBundle";
string afterpath = ".unity3d";
// Prefabsフォルダ内からPrefab拡張子のみのファイルを取得
string[] fs = System.IO.Directory.GetFiles(Application.dataPath + "/Prefabs", "*.prefab");
List<string> BundleList = new List<string>();
List<Object> BundleObjectList = new List<Object>();
BundleList.AddRange(fs);
int index = 0;
foreach(string pathname in BundleList)
{
// パスから拡張子ありファイル名のみを抽出
string fileNameLong = System.IO.Path.GetFileName(pathname);
Debug.Log("fileNameLong=" + fileNameLong);
// 指定パスよりPrefabを取得
GameObject BundleObject = Resources.LoadAssetAtPath<GameObject>("Assets/Prefabs/" + fileNameLong);
// Objectリストに追加
BundleObjectList.Add(BundleObject);
// アセットバンドル出力先パス
string exportfilename = path + filename + index.ToString() + afterpath;
Debug.Log("BundleName=" + exportfilename);
// アセットバンドル作成
BuildPipeline.BuildAssetBundle(BundleObject, BundleObjectList.ToArray(), exportfilename,
BuildAssetBundleOptions.CollectDependencies
| BuildAssetBundleOptions.CompleteAssets
| BuildAssetBundleOptions.UncompressedAssetBundle);
// 拡張子ありファイル名からファイル名のみを抽出
string fileName = System.IO.Path.GetFileNameWithoutExtension(fileNameLong);
Debug.Log("fileName=" + fileName);
index++;
}
BuildPipeline.BuildAssetBundles(出力先, BuildAssetBundleOptions.None, プラットフォーム);
:AssetBundleTestLoader.cs
public void CreateMultiFileLoad()
{
// Prefabsフォルダ内からPrefab拡張子のみを取得
string[] fs = System.IO.Directory.GetFiles("C://AssetBundleTest/StreamingAssets", "*.unity3d");
List<string> BundleList = new List<string>();
List<Object> BundleObjectList = new List<Object>();
BundleList.AddRange(fs);
foreach (string pathname in BundleList)
{
AssetBundle NoCompress = AssetBundle.CreateFromFile(pathname);
//Object[] selection = NoCompress.LoadAll();
Instantiate(NoCompress.mainAsset);
NoCompress.Unload(false);
}
}
BuildPipeline.BuildAssetBundles(出力先, BuildAssetBundleOptions.ChunkBasedCompression, プラットフォーム);
public List<Object> publicObjectList = new List<Object>();
IEnumerator LoadAssetBundle()
{
//****************************
// WWWを使用してStreamingAssetsからアセットバンドルロード
WWW baseCommonWww = new WWW(Application.streamingAssetsPath + アセットバンドル名);
yield return baseCommonWww;
AssetBundle baseCommonBundle = baseCommonWww.assetBundle;
//****************************
Object[] baseCommonObjects = baseCommonBundle.LoadAllAssets();
foreach (Object obj in baseCommonObjects)
{
Debug.Log("obj=" + obj.name);
Debug.Log("objtype=" + obj.GetType().ToString());
publicObjectList.Add(obj);
}
}
public List<Object> publicObjectList = new List<Object>();
メソッド名()
{
//****************************
// LoadFromFile LZMA圧縮
//AssetBundle baseCommonBundle = AssetBundle.LoadFromFile(Application.streamingAssetsPath + アセットバンドル名);
// LoadFromFile 圧縮なし
//AssetBundle baseCommonBundle = AssetBundle.LoadFromFile(Application.streamingAssetsPath + アセットバンドル名);
// LoadFromFile LZ4圧縮
//AssetBundle baseCommonBundle = AssetBundle.LoadFromFile(Application.streamingAssetsPath + アセットバンドル名);
//****************************
Object[] baseCommonObjects = baseCommonBundle.LoadAllAssets();
foreach (Object obj in baseCommonObjects)
{
Debug.Log("obj=" + obj.name);
Debug.Log("objtype=" + obj.GetType().ToString());
publicObjectList.Add(obj);
}
}
public List<Object> publicObjectList = new List<Object>();
IEnumerator LoadAssetBundle()
{
//****************************
// LoadFromFileAsync LZMA圧縮
//AssetBundleCreateRequest baseCommonRequest = AssetBundle.LoadFromFileAsync(Application.streamingAssetsPath + アセットバンドル名);
// LoadFromFileAsync 圧縮なし
//AssetBundleCreateRequest baseCommonRequest = AssetBundle.LoadFromFileAsync(Application.streamingAssetsPath + アセットバンドル名);
// LoadFromFileAsync LZ4圧縮
//AssetBundleCreateRequest baseCommonRequest = AssetBundle.LoadFromFileAsync(Application.streamingAssetsPath + アセットバンドル名);
//yield return StartCoroutine(BundleRequestWait(baseCommonRequest));
//AssetBundle baseCommonBundle = baseCommonRequest.assetBundle;
//****************************
Object[] baseCommonObjects = baseCommonBundle.LoadAllAssets();
foreach (Object obj in baseCommonObjects)
{
Debug.Log("obj=" + obj.name);
Debug.Log("objtype=" + obj.GetType().ToString());
publicObjectList.Add(obj);
}
}
IEnumerator BundleRequestWait(AssetBundleCreateRequest assetBundleCreateRequest)
{
while(assetBundleCreateRequest.isDone == false)
{
Debug.Log("wait");
yield return 0;
}
}
public List<Object> publicObjectList = new List<Object>();
メソッド名()
{
//****************************
// LoadFromMemory LZMA圧縮
//byte[] bundleData = System.IO.File.ReadAllBytes(Application.streamingAssetsPath + アセットバンドル名); // 読み込み
// LoadFromMemory 圧縮なし
//byte[] bundleData = System.IO.File.ReadAllBytes(Application.streamingAssetsPath + アセットバンドル名); // 読み込み
// LoadFromMemory LZ4圧縮
//byte[] bundleData = System.IO.File.ReadAllBytes(Application.streamingAssetsPath + アセットバンドル名); // 読み込み
//AssetBundle baseCommonBundle = AssetBundle.LoadFromMemory(bundleData);
//****************************
Object[] baseCommonObjects = baseCommonBundle.LoadAllAssets();
foreach (Object obj in baseCommonObjects)
{
Debug.Log("obj=" + obj.name);
Debug.Log("objtype=" + obj.GetType().ToString());
publicObjectList.Add(obj);
}
}
public List<Object> publicObjectList = new List<Object>();
IEnumerator LoadAssetBundle()
{
//****************************
// LoadFromMemoryAsync LZMA圧縮
//byte[] bundleData = System.IO.File.ReadAllBytes(Application.streamingAssetsPath + アセットバンドル名); // 読み込み
// LoadFromMemoryAsync 圧縮なし
//byte[] bundleData = System.IO.File.ReadAllBytes(Application.streamingAssetsPath + アセットバンドル名); // 読み込み
// LoadFromMemoryAsync LZ4圧縮
byte[] bundleData = System.IO.File.ReadAllBytes(Application.streamingAssetsPath + アセットバンドル名); // 読み込み
AssetBundleCreateRequest baseCommonRequest = AssetBundle.LoadFromMemoryAsync(bundleData);
yield return StartCoroutine(BundleRequestWait(baseCommonRequest));
AssetBundle baseCommonBundle = baseCommonRequest.assetBundle;
//****************************
Object[] baseCommonObjects = baseCommonBundle.LoadAllAssets();
foreach (Object obj in baseCommonObjects)
{
Debug.Log("obj=" + obj.name);
Debug.Log("objtype=" + obj.GetType().ToString());
publicObjectList.Add(obj);
}
}
IEnumerator BundleRequestWait(AssetBundleCreateRequest assetBundleCreateRequest)
{
while(assetBundleCreateRequest.isDone == false)
{
Debug.Log("wait");
yield return 0;
}
}
public void OnLoadAssetBundle()
{
StartCoroutine(LoadAssetBundle_CreateMemory());
}
IEnumerator LoadAssetBundle_CreateMemory()
{
// Application.dataPathはAssetsの直下のフォルダの事
string path = Application.dataPath + "/StreamingAssets/myAssetBundle.unity3d";
WWW www = new WWW("file://" + path);
yield return www;
var assetBundleCreateRequest = AssetBundle.CreateFromMemory(www.bytes);
yield return assetBundleCreateRequest;
AssetBundle assetBundle = assetBundleCreateRequest.assetBundle;
Object[] objectArray = assetBundle.LoadAll();
List<Object> myList = new List<Object>();
myList.AddRange(objectArray);
foreach(Object obj in myList)
{
Instantiate(obj);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment