コンテンツの保護
アセットバンドルへのスクリプトを含める

アセット依存関係の管理

Suggest a change

Success!

Thank you for helping us improve the quality of Unity Documentation. Although we cannot accept all submissions, we do read each suggested change from our users and will make updates where applicable.

Close

Sumbission failed

For some reason your suggested change could not be submitted. Please try again in a few minutes. And thank you for taking the time to help us improve the quality of Unity Documentation.

Close

Cancel

バンドルの任意のアセットは他のアセットに依存するかもしれません。例えば,モデルはマテリアルを利用するかもしれず,テクスチャやシェーダを使用するかもしれません。アセットの依存関係をバンドルとともに全て含めることは可能です。しかし,異なるバンドルからのいくつかのアセットは他のアセットの共通セットに依存するかもしれません(例えば,ビルの複数のモデルがあった場合に共通の煉瓦のテクスチャを使用するかもしれません)。もし共通の依存関係の別の複製がオブジェクトに使用されるそれぞれのバンドルに含まれると,バンドルがロードされたときにアセットの余剰なインスタンスが作成されます。これはメモリの浪費につながります。

そのような浪費をさけるため,共有の依存関係を別のバンドルに分けることが出来て,必要とするアセットとともに,どんなバンドルからでも参照することが出来ます。最初に,BuildPipeline.PushAssetDependencies をコールして参照機能を有効化する必要があります。次に参照の依存関係を含むバンドルはビルドされる必要があります。次に,PushAssetDependenciesへの別のコールを,最初のバンドルからアセットを参照するバンドルをビルドを行う前に,行う必要があります。追加の依存関係のレベルはPushAssetDependenciesに対する更なるコールにより実現することが出来ます。参照のレベルはスタックに格納されるため,ひとつレベルを戻るのに対応する BuildPipeline.PopAssetDependencies 関数を使用することが出来ます。push および pop コールは,ビルド前に起きる最初のプッシュを含め,バランスをとる必要があります。

ランタイムでは,他のバンドルが参照する前に,依存関係を含むバンドルをロードする必要があります。例えば,共有テクスチャのバンドルを,そのテクスチャを参照するマテリアルの別のバンドルをロードする前にロードする必要があります。

Asset IDs

もし依存関係のつながりの一部分であるアセットバンドルの再ビルドが必要であると考えた場合, BuildAssetBundleOptions.DeterministicAssetBundle のオプションを有効化してビルドする必要があることに留意して下さい。これによりアセットを識別する内部IDの値は,バンドルが再ビルドされるたびに同じであることを保証します。

When building the asset bundle with this method, the objects in it are assigned a 32 bit hash code that is calculated using the name of the asset bundle file, the GUID of the asset and the local id of the object in the asset. For that reason make sure to use the same file name when rebuilding. Also note that having a lot of objects might cause hash collisions preventing Unity from building the asset bundle.

Shaders dependencies

Whenever shaders are directly referenced as parameters in BuildPipeline.BuildAssetBundle, or indirectly with the option BuildAssetBundleOptions.CollectDependencies the shader’s code is included with the asset bundle. This could cause a problem if you use BuildAssetBundle alone to create several asset bundles, since referenced shaders will be included in every generated bundle. There could be conflicts, i.e. when you mix different versions of a shader, so you will have to rebuild all your bundles after modifying the shaders. The shader’s code will also increase the size of bundles. To avoid these problems you can use BuildPipeline.PushAssetDependencies to separate shaders in a single bundle, and that will allow you to update the shader bundle only. As an example of how to achieve this workflow, you can create a prefab that includes references to the required shaders:

C

using UnityEngine;

public class ShadersList : MonoBehaviour {
    public Shader[] list;
}


Create an empty object, assign the script, add the shaders to the list and create the prefab, i.e. “ShadersList”. Then you can create an exporter that generates all the bundles and updates the bundle of shaders:

C

using UnityEngine;
using UnityEditor;

public class Exporter : MonoBehaviour {
    
    [MenuItem("Assets/Export all asset bundles")]
    static void Export() {
        BuildAssetBundleOptions options = 
            BuildAssetBundleOptions.CollectDependencies | 
            BuildAssetBundleOptions.CompleteAssets | 
            BuildAssetBundleOptions.DeterministicAssetBundle;
        
        BuildPipeline.PushAssetDependencies();
        BuildPipeline.BuildAssetBundle(AssetDatabase.LoadMainAssetAtPath("Assets/ShadersList.prefab"), null, "WebPlayer/ShadersList.unity3d", options);
            
        BuildPipeline.PushAssetDependencies();
        BuildPipeline.BuildAssetBundle(AssetDatabase.LoadMainAssetAtPath("Assets/Scene1.prefab"), null, "WebPlayer/Scene1.unity3d", options);
        BuildPipeline.BuildAssetBundle(AssetDatabase.LoadMainAssetAtPath("Assets/Scene2.prefab"), null, "WebPlayer/Scene2.unity3d", options);       
        
        BuildPipeline.PopAssetDependencies();
        BuildPipeline.PopAssetDependencies();
    }
    
    [MenuItem("Assets/Update shader bundle")]
    static void ExportShaders() {
        BuildAssetBundleOptions options = 
            BuildAssetBundleOptions.CollectDependencies | 
            BuildAssetBundleOptions.CompleteAssets | 
            BuildAssetBundleOptions.DeterministicAssetBundle;
        
        BuildPipeline.PushAssetDependencies();
        BuildPipeline.BuildAssetBundle(AssetDatabase.LoadMainAssetAtPath("Assets/ShadersList.prefab"), null, "WebPlayer/ShadersList.unity3d", options);
        
        BuildPipeline.PopAssetDependencies();
    }
}


Bear in mind that you must load the shader bundle first. One drawback of this method is that the option BuildAssetBundleOptions.DeterministicAssetBundle can produce conflicts due to colliding hashes when the amount of objects is too large. In this case the build will fail, and it won’t be possible to update the shader bundle alone. In this case you will have to remove that option and rebuild all the asset bundles.

コンテンツの保護
アセットバンドルへのスクリプトを含める