Пример #1
0
    //CreatePartAssetBundle
    //Example:
    //    bundle: female_face-1.assetbundle
    //        - a: GameObject
    //            name: PartAssetGameObjectName(renderobject),
    //            type: GameObject(as Prefab)
    //        - a: Materials
    //            name: material name
    //            type: material
    //        - a: Bones
    //            name: PartAssetBonesName(bonesname)
    //            type: StringHolder
    static void CreatePartAssetBundles(GameObject fbx, string name)
    {
        List <Material> materials = EditorHelpers.CollectAll <Material>(MeterialsPath(fbx));

        foreach (var skinnedMeshRender in fbx.GetComponentsInChildren <SkinnedMeshRenderer>(true))          // get all children with SkinnedMeshRender, even they are disabled
        {
            List <Object> assets = new List <Object>();

            //Prefab for children with skinnedMeshRender
            GameObject rendererClone = (GameObject)PrefabUtility.InstantiatePrefab(skinnedMeshRender.gameObject);
            //delete cloned parent object by side effect
            GameObject rendererCloneParent = rendererClone.transform.parent.gameObject;
            rendererClone.transform.parent = null;
            Object.DestroyImmediate(rendererCloneParent);

            //create prefab for GameObject
            Object rendererPrefab = CreatePrefab(rendererClone, CharacterElement.PartAssetGameObjectName);
            Object.DestroyImmediate(rendererClone);

            assets.Add(rendererPrefab);

            //Materials
            foreach (var material in materials)
            {
                if (material.name.Contains(skinnedMeshRender.name.ToLower()))
                {
                    assets.Add(material);
                }
            }

            //Bones
            List <string> boneNames = new List <string>();
            foreach (var transform in skinnedMeshRender.bones)              //???
            {
                boneNames.Add(transform.name);
            }
            string       boneNameAssetPath = AssetPath + CharacterElement.AssetFileName(CharacterElement.PartAssetBonenames);
            StringHolder holder            = ScriptableObject.CreateInstance <StringHolder>();
            holder.content = boneNames.ToArray();
            AssetDatabase.CreateAsset(holder, boneNameAssetPath);

            // Create bone asset
            Object boneAsset = AssetDatabase.LoadAssetAtPath(boneNameAssetPath, typeof(StringHolder));
            assets.Add(boneAsset);

            //Create bundl by assets
            string bundlePath = AssetBundlePath + name + "_" + skinnedMeshRender.name.ToLower() + ".assetbundle";
            BuildPipeline.BuildAssetBundle(null, assets.ToArray(), bundlePath);

            //Cleanup
            AssetDatabase.DeleteAsset(AssetDatabase.GetAssetPath(rendererPrefab));
            AssetDatabase.DeleteAsset(boneNameAssetPath);
        }
    }
Пример #2
0
    //create map material name -> bundle
    //example: female_face-1 --> female_face-1.assetbundle
    static void CreateElementDataBaseBundle()
    {
        List <CharacterElement> characterElements = new List <CharacterElement>();

        string[] assetBundles = Directory.GetFiles(AssetBundlePath);
        string[] materials    = Directory.GetFiles("Assets/CharacterCustomization/characters", "*.mat", SearchOption.AllDirectories);       //search materials recursively
        foreach (var material in materials)
        {
            foreach (var bundle in assetBundles)
            {
                FileInfo bundleFI   = new FileInfo(bundle);
                FileInfo materialFI = new FileInfo(material);
                string   bundleName = bundleFI.Name.Replace(CharacterElement.BundlePostfix, "");

                if (!materialFI.Name.StartsWith(bundleName) ||
                    !material.Contains("Per Texture Materials"))
                {
                    continue;
                }

                string name = materialFI.Name.Replace(".mat", "");
                characterElements.Add(new CharacterElement(name, bundleName));
                break;
            }
        }

        CharacterElementHolder holder = ScriptableObject.CreateInstance <CharacterElementHolder>();

        holder.content = characterElements;
        string path = AssetPath + CharacterElement.AssetFileName(CharacterElement.DataBaseName);

        AssetDatabase.CreateAsset(holder, path);
        Object asset = AssetDatabase.LoadAssetAtPath(path, typeof(CharacterElementHolder));

        BuildPipeline.BuildAssetBundle(asset, null, AssetBundlePath + CharacterElement.BundleFileName(CharacterElement.DataBaseName));
    }