Unity3d防止材质贴图丢失解决办法

发表于2017-11-30
评论0 3.8k浏览

使用Unity引擎做开发时,如何防止材质贴图丢失这个问题?可能有些新手开发者还不知道,那下面我们就来看看防止材质贴图丢失解决办法,只需要两步即可。


第1步在project文件管理器中创建Editor文件夹,并在之下创建一个CreateAssetBundle.cs脚本,它可用来打包文件,防止在其他地方重新打开时,缺失材质而需要重新附加各种贴图。

第2步新建Resources文件用于存放各种材质资源,如FBX等模型文件、material等材质文件、各种格式文件如JPEG、PNG等图片文件等等。

如图: 


 

CreateAssetBundle.cs脚本如下,它规定了打包的文件格式以及生成版本号到version.txt文件中,可自定义添加需要的格式。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEditor;
using System.IO;
public class CreateAssetBundle : Editor
{
    static void FindDependencies(string strPath, List<string> strPathList)
    {
        if (strPathList.Contains(strPath))
        {
            return;
        }
        else
        {
            strPathList.Add(strPath);
            string[] strArrayDependencies = AssetDatabase.GetDependencies(strPathList[strPathList.Count - 1]);
            foreach (var m in strArrayDependencies)
            {
                FindDependencies(m, strPathList);
            }
            return;
        }
    }
    [MenuItem("Custom Editor/Create AssetBunldes Main")]
    static void CreateAssetBunldesMain()
    {
        WriteVersion();
        Caching.CleanCache();
        List<string> strPathList = new List<string>();
        Object[] SelectedAsset = Selection.GetFiltered(typeof(Object), SelectionMode.DeepAssets);
        foreach (var n in SelectedAsset)
        {
            Debug.Log(AssetDatabase.GetAssetOrScenePath(n));
            FindDependencies(AssetDatabase.GetAssetOrScenePath(n), strPathList);
        }
        string targetPath = Application.dataPath + "/StreamingAssets";
        if (!Directory.Exists(targetPath))
        {
            Directory.CreateDirectory(targetPath);
        }
        AssetBundleBuild[] abBuilds = new AssetBundleBuild[6];
        List<string> strPrefab = new List<string>();
        List<string> strModel = new List<string>();
        List<string> strImage = new List<string>();
        List<string> strShader = new List<string>();
        List<string> strOther = new List<string>();
        List<string> strMaterials = new List<string>();
        foreach (var p in strPathList)
        {
            string strCase = "null";
            if (p.Contains("."))
            {
                strCase = p.Split('.')[1];
            }
            switch (strCase.ToLower())
            {
                case "prefab":
                case "cs":
                    strPrefab.Add(p);
                    break;
                case "fbx":
                    strModel.Add(p);
                    break;
                case "shader":
                    strShader.Add(p);
                    break;
                case "mat":
                    strMaterials.Add(p);
                    break;
                case "png":
                case "jpg":
                case "tga":
                case "psd":
                    strImage.Add(p);
                    break;
                default:
                    strOther.Add(p);
                    break;
            }
        }
        abBuilds[0].assetNames = strPrefab.ToArray();
        abBuilds[0].assetBundleName = "assetBundlePrefab";
        abBuilds[1].assetNames = strModel.ToArray();
        abBuilds[1].assetBundleName = "assetBundleModel";
        abBuilds[2].assetNames = strImage.ToArray();
        abBuilds[2].assetBundleName = "assetBundleImage";
        abBuilds[3].assetNames = strShader.ToArray();
        abBuilds[3].assetBundleName = "assetBundleShader";
        abBuilds[4].assetNames = strMaterials.ToArray();
        abBuilds[4].assetBundleName = "assetBundleMaterials";
        abBuilds[5].assetNames = strOther.ToArray();
        abBuilds[5].assetBundleName = "assetBundleOther";
        BuildPipeline.BuildAssetBundles(targetPath, abBuilds, BuildAssetBundleOptions.CollectDependencies, BuildTarget.Android);
        AssetDatabase.Refresh();
    }
    static void WriteVersion()
    {
        StreamWriter sw = new StreamWriter(Application.streamingAssetsPath + "/version.txt");
        string w = "1";
        sw.Write(w);
        sw.Close();
    }
}

已经设置好的贴图文件最好再设置以便脚本记录生成版本号到version.txt文件,设置后保存。已经设置此步骤后,添加材质后,在加载资源时脚本会自动添加相应版本号。

再将工程发给小伙伴,重新打开加载资源时,就可以防止材质贴图丢失了。

如社区发表内容存在侵权行为,您可以点击这里查看侵权投诉指引

0个评论