Unity3d防止材质贴图丢失解决办法
发表于2017-11-30
使用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文件,设置后保存。已经设置此步骤后,添加材质后,在加载资源时脚本会自动添加相应版本号。
再将工程发给小伙伴,重新打开加载资源时,就可以防止材质贴图丢失了。
如社区发表内容存在侵权行为,您可以点击这里查看侵权投诉指引