[关闭]
@daaoling 2017-01-17T15:00:52.000000Z 字数 5102 阅读 2462

AssetBundle Unity

Unity 4 AssetBundle 踩坑记录

editor 下选择什么平台的 ab 加载

Material doesn't have a color property '_Color'
UnityEditor.DockArea:OnGUI()

Material doesn't have a float or range property 'PixelSnap'
UnityEditor.DockArea:OnGUI()

因为editor模式下所有的 platform ab 都是可以用的 并且打 android ab 包必须要把platform转换为android
但是自己写的cg shader 如果打成 android ab 在editor 模式下没有OpenGL 2.0 环境会报错
只有打成windows包

但是好像其他 surface shader 是可以的

参考如下

关于打包shader丢失参数的问题

Material doesn't have a color property '_Color'
UnityEditor.DockArea:OnGUI()

Material doesn't have a float or range property 'PixelSnap'
UnityEditor.DockArea:OnGUI()
http://forum.china.unity3d.com/thread-460-2-1.html

The asset bundle '' can't be loaded because another asset bundle with the same files are already loaded

   create scene assetbundle Scenes/battle/MapEditor/53.unityin _LoadImmediate failed

可能的原因
* 相同名字 bundle load 加载后
http://forum.unity3d.com/threads/asset-bundle-cant-be-the-same-name.190275
这里经过测试过 发现相同名字不同后缀的单个资源 bundle 是可以的
但是相同名字相同后缀即使路径不同也是不可以的
* Unity3d资源管理分析
你加载了ab重复加载
后期使用 asset guid 来给ab命名 ab的asset name path 随意 guid 也行 相对于 asset path 也行

不同机子打包的ab md5 值不同 无语了

打 ab 最好把脚本打进去 有概率会出现看不见的情况

如果在同一个场景对ab做清理对话 会对当时的场景造成当时就材质丢失的情况 最好就是弄个东西挡一下 比如ui 或者 弄一个单独加载场景的场景 在挡着的时候进行卸载

load sprite from ab

======================================

    [MenuItem("Build/Tools/Test")]
    public static void TestSceneAssets()
    {
        UnityEngine.Object[] assets = new UnityEngine.Object[] { AssetDatabase.LoadAssetAtPath("Assets/Resources/Icon/ectype_chapter/1.png", typeof(UnityEngine.Object)) };
        UnityEngine.Object mainAsset = assets[0];

        string savePath =
            "f:/assetbundles/windows/"
                + "d4fe2a6e186849f4086398d2ceeb0510"
                    + ResourceCommon.assetbundleFileSuffix;
        BuildPipeline.BuildAssetBundle(
            mainAsset, assets, savePath,
                BuildAssetBundleOptions.CollectDependencies 
                    | BuildAssetBundleOptions.CompleteAssets
                        | BuildAssetBundleOptions.DeterministicAssetBundle, 
                            BuildTarget.StandaloneWindows);
    }


    mTest6.cs

    void OnGUI()
    {
        if (GUI.Button(new Rect(10, 10, 150, 100), "I am a button")) Test();
    }


    void Test() 
    {
        TextAsset bundleFile = Resources.Load("d4fe2a6e186849f4086398d2ceeb0510") as TextAsset;
        AssetBundle assetBundle = AssetBundle.CreateFromMemoryImmediate(bundleFile.bytes);
        Object[] assets = assetBundle.LoadAll();
        foreach (Object asset in assets)
        {
            Debug.Log("loaded asset " + asset.name + " of type " + asset.GetType());
        }
    }

    //loaded asset 1 of type UnityEngine.Texture2D
    //loaded asset 1 of type UnityEngine.Sprite

======================================

    string path = "Assets/NGUI/Examples/Models/Orc/FBX.FBX";
    UnityEngine.Object[] assets = new UnityEngine.Object[] {
        AssetDatabase.LoadAssetAtPath(path, typeof(UnityEngine.Object)) };
    string[] depends = AssetDatabase.GetDependencies(new string[] { path });
    foreach (string str in depends)
    {
        Debug.Log("depency: " + str);
    } 
    //depency: Assets/NGUI/Examples/Models/Orc/FBX@idle.FBX
    //depency: Assets/NGUI/Examples/Models/Orc/FBX@idleBreaks.FBX
    //depency: Assets/NGUI/Examples/Models/Orc/FBX.FBX


    List<string> tmp = new List<string>();
    int index = 0;
    foreach (Object asset in assets){
        Debug.Log("loaded asset " + asset.name + " of type " + asset.GetType());
        index++;
        tmp.Add(index+"");
    }
    UnityEngine.Object mainAsset = assets[0];

    string savePath =
        "f:/assetbundles/windows/"
            + "d4fe2a6e186849f4086398d2ceeb0510"
                + ResourceCommon.assetbundleFileSuffix;
 -----1   
    BuildPipeline.BuildAssetBundle(
        mainAsset, assets, savePath,
           BuildAssetBundleOptions.CollectDependencies
              | BuildAssetBundleOptions.CompleteAssets
                   | BuildAssetBundleOptions.DeterministicAssetBundle,
                      BuildTarget.StandaloneWindows); 会收集依赖  比如 fbx@idle 等等

-----2   
    BuildPipeline.BuildAssetBundleExplicitAssetNames(
         assets, tmp.ToArray(), savePath,
            BuildAssetBundleOptions.CollectDependencies
                | BuildAssetBundleOptions.CompleteAssets
                    | BuildAssetBundleOptions.DeterministicAssetBundle,
                        BuildTarget.StandaloneWindows); ///不会收集依赖  比如 fbx@idle 等等



    void Test() 
    {
        TextAsset bundleFile = Resources.Load("d4fe2a6e186849f4086398d2ceeb0510") as TextAsset;
        AssetBundle assetBundle = AssetBundle.CreateFromMemoryImmediate(bundleFile.bytes);
        Object[] assets = assetBundle.LoadAll();
        foreach (Object asset in assets)
        {
            Debug.Log("loaded asset " + asset.name + " of type " + asset.GetType());
        }
    }

-----1
    //loaded asset FBX of type UnityEngine.GameObject
    //loaded asset FBX of type UnityEngine.Transform
    //loaded asset Orc of type UnityEngine.Mesh
    //loaded asset FBX@idle of type UnityEngine.GameObject
    //loaded asset FBX@idle of type UnityEngine.Transform
    //loaded asset Orc of type UnityEngine.Mesh
    //loaded asset idle of type UnityEngine.AnimationClip  .etc
-----2
    //loaded asset FBX of type UnityEngine.GameObject
    //loaded asset FBX of type UnityEngine.Transform

从上述实验看 BuildPipeline.BuildAssetBundle 和 BuildPipeline.BuildAssetBundleExplicitAssetNames 不同之处 就在于后者只打包你当前指定的资源,比如 fix 或者 texture2d 下面的 mesh 和 sprite 不会打包进去 ,并且依赖比如 fbx@idle 也不会打包进去 , 不过这个还好,正好是我们当前的打包策略,依赖由我们自己掌握

这样我们考虑 texture2d 的打包策略和 prefab 的打包策略不一样了 或者 内存中动态生成sprite

参考
http://answers.unity3d.com/questions/586313/load-unity-43-sprites-with-assetbundles.html
- [ ] Object already in stack
- [ ] 菊花问题
- [ ] 字体替换

考虑 新手引导阶段 短线的情况

Resources/battle/Hero
Resources/battle/Solider

Unity3D asset bundle 格式简析 http://blog.codingnow.com/2014/08/unity3d_asset_bundle.html

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注