web-dev-qa-db-ja.com

UnityでAssetbundleをビルドしてロードする

IOSビルドでUnity Assetbundleを動作させることができません。

Unityで、アセットバンドルを作成します。

using UnityEditor;

public class CreateAssetBundles
{
    [MenuItem("Assets/Build AssetBundles")]
    static void BuildAllAssetBundles()
    {
        BuildPipeline.BuildAssetBundles("Assets/AssetBundles", BuildAssetBundleOptions.None, BuildTarget.iOS);
    }
 }

そして、それらはUnityで正常に動作します。一緒に使う

AssetBundle bundleLoadRequest = AssetBundle.LoadFromFile("file://" + Application.dataPath + "/AssetBundles/iOS/" + myassetbundlename.ToString());

および/または

WWW wwww = WWW.LoadFromCacheOrDownload("file://" + Application.dataPath + "/AssetBundles/iOS/" + myassetbundlename.ToString(), 4); 

(「file://」接頭辞がないと、バンドルはUnityでもXcodeでも機能しません)

プロジェクトをXcodeにビルドしてXcodeで実行すると、次のエラーが発生します。

アーカイブファイルを開けません:/ Users/user/Documents/Workspaces/unityproject/Assets/AssetBundles/iOS/lchairanimations

どういうわけか正しいパスの設定に関連している可能性がありますが、後でassetbundleフォルダーをXcodeプロジェクトにコピーしたため、問題は解決しません。

7
Gideons

以下のこの例では、 "dog"という新しいアセットを "animalsという名前のAssetBundleに追加する方法を示します"ビルドして、実行時にロードします。

ビルドフォルダーのセットアップ:

1。画像ファイルなどのアセットを選択します。この場合、これは "dog.jpeg"ファイルです。 「インスペクタ」タブのメニューをご覧ください。 AssetBundleオプションが非表示になっている場合は、上にドラッグして表示します。これを行う方法については、以下のアニメーションgifを参照してください。 デフォルトのAssetBundleは「なし」です。 「なし」オプションをクリックして、「新規」に移動しますオプションを使用して新しいAssetBundleを作成し、「animals」という名前を付けます

enter image description here

2。 AssetsフォルダーにStreamingAssetsという名前のフォルダーを作成します。これは、AssetBundleを作成するフォルダーです。スペルは重要であり、大文字と小文字が区別されるため、正しく名前を付けてください。

enter image description here

3StreamingAssetsフォルダーにAssetBundleを保持するサブフォルダーを作成します。この例では、このフォルダーにAssetBundlesという名前を付けて、その中にあるものを認識できるようにします。

enter image description here


Building AssetBundle:

4。以下はビルドスクリプトです。

[〜#〜] a [〜#〜]ExportAssetBundlesという名前のスクリプトを作成し、Assetsフォルダー内の "Editor"という名前のフォルダーに入れてから、その下のコードをコピーします。

using System.IO;
using UnityEditor;
using UnityEngine;

public class ExportAssetBundles
{
    [MenuItem("Assets/Build AssetBundle")]
    static void ExportResource()
    {
        string folderName = "AssetBundles";
        string filePath = Path.Combine(Application.streamingAssetsPath, folderName);

        //Build for Windows platform
        BuildPipeline.BuildAssetBundles(filePath, BuildAssetBundleOptions.None, BuildTarget.StandaloneWindows64);

        //Uncomment to build for other platforms
        //BuildPipeline.BuildAssetBundles(filePath, BuildAssetBundleOptions.None, BuildTarget.iOS);
        //BuildPipeline.BuildAssetBundles(filePath, BuildAssetBundleOptions.None, BuildTarget.Android);
        //BuildPipeline.BuildAssetBundles(filePath, BuildAssetBundleOptions.None, BuildTarget.WebGL);
        //BuildPipeline.BuildAssetBundles(filePath, BuildAssetBundleOptions.None, BuildTarget.StandaloneOSX);

        //Refresh the Project folder
        AssetDatabase.Refresh();
    }
}

enter image description here

[〜#〜] b [〜#〜]Assets->Build AssetBundleメニューに移動してAssetBudleをビルドします。

ビルドされたAssetBundlesがAssets/StreamingAssets/AssetBundlesディレクトリ内に表示されます。そうでない場合は、[プロジェクト]タブを更新します。

enter image description here


実行時にAssetBundleをロードしています

5。それをロードするときは、StreamingAssetsフォルダーにアクセスするためにApplication.streamingAssetsPathを使用する必要があります。すべてのフォルダにアクセスするには、Application.streamingAssetsPath + "/AssetBundle/" + assetbunlenameWithoutExtension;を使用します。 AssetBundleおよびAssetBundleRequest AP​​Iは、AssetBundleをロードするために使用されます。これは画像なので、Texture2Dが渡されます。プレハブを使用する場合は、代わりにGameObjectを渡してインスタンス化します。これらの変更を行う場所については、コード内のコメントを参照してください。パス名を組み合わせるにはPath.Combineを使用することをお勧めします。そのため、以下のコードでは代わりにそれを使用する必要があります。

以下は単純なロード関数です:

IEnumerator LoadAsset(string assetBundleName, string objectNameToLoad)
{
    string filePath = System.IO.Path.Combine(Application.streamingAssetsPath, "AssetBundles");
    filePath = System.IO.Path.Combine(filePath, assetBundleName);

    //Load "animals" AssetBundle
    var assetBundleCreateRequest = AssetBundle.LoadFromFileAsync(filePath);
    yield return assetBundleCreateRequest;

    AssetBundle asseBundle = assetBundleCreateRequest.assetBundle;

    //Load the "dog" Asset (Use Texture2D since it's a Texture. Use GameObject if prefab)
    AssetBundleRequest asset = asseBundle.LoadAssetAsync<Texture2D>(objectNameToLoad);
    yield return asset;

    //Retrieve the object (Use Texture2D since it's a Texture. Use GameObject if prefab)
    Texture2D loadedAsset = asset.asset as Texture2D;

    //Do something with the loaded loadedAsset  object (Load to RawImage for example) 
    image.texture = loadedAsset;
}

ノートをロードする前の注意事項:

[〜#〜] a [〜#〜]。 Assetbundleの名前はanimalsです。

[〜#〜] b [〜#〜]。動物からロードするアセット/オブジェクトの名前Assetbundleはdog犬の単純なjpgです。

enter image description here

[〜#〜] c [〜#〜]。読み込みは次のように簡単です:

string nameOfAssetBundle = "animals";
string nameOfObjectToLoad = "dog";

public RawImage image; 

void Start()
{
    StartCoroutine(LoadAsset(nameOfAssetBundle, nameOfObjectToLoad));
}
21
Programmer

.Netベースのものがもっと欲しい私のような開発者にとって、より融通が利くかもしれないという提案もあります。 Unityを使用して「ランチャー」を構築することを検討するかもしれません。 Unityを使用してビルドするので、クロスプラットフォームのままです。次に、更新をDLLにバンドルすることを検討してください。Unityは.Netフレームワークをサポートしているため、またはWebフォルダーにイメージとして保存します。Webclientを使用してデータを取得できます。こちらの記事:

https://docs.Microsoft.com/en-us/dotnet/api/system.net.webclient.downloadfile?view=netframework-4.8#System_Net_WebClient_DownloadFile_System_Uri_System_String_

ランチャーは、コンテンツを取得または更新するためのより良い方法かもしれません。ロードオブザリングをオンラインでプレイして以来、私はそのアイデアをいじくり続けており、ランチャーが好きです。自分のゲーム用に作りたかったんです。コードでは、「DownloadFile(Uri、String)」を使用してデータを取得します。私はまずAPIまたは何かを使用して、ゲームの現在のバージョンまたはDLLなど)を確認します。次に、最新バージョンのデータベースを確認します。最後に、APIまたは何かで新しいファイルのリストを作成できます必要または更新されたファイルが必要であり、ファイルのリクエストをループして、必要なファイルをダウンロードします。

0
mholmes