unity3.5+打包的资源在4.3上是不被识别的,别的版本我没试,应该也一样的情况,程序工程经过多年维护,数据的积累,升级到高版本的unity(4.3)导致之前打包的资源都不能使用,源文件也找不到了,所以只能去利用旧资源解包,unity3.5.6打包的资源可以解包成.obj格式,做模型的都知道,.obj也是模型的一种格式,只是不支持骨骼动画的格式,我之前找到一个软件可以讲打包资源解包成.obj,是java写的,但只支持4.0以上的,所以不能用(disunity_v0.2.1)这个软件现在到了0.2.1版本了,直接用命令行操作即可,先cd导这个文件夹,然后把资源准备好,java -jar disunity.jar /Users/dilitech/Downloads/disunity_v0.2.1/unity3d/*.* 直接指向这个即可,就会把你的资源解包,java -jar disunity.jar 是java执行命令,当然也可以用 bat命令(window下)sh命令(mac下)比如mac下:sh disunity.sh (然后接上你的资源文件夹路径就行我用的是: /Users/dilitech/Downloads/disunity_v0.2.1/unity3d/)
下面说说我3.5.6解包方式
using UnityEngine; using System.Collections; using System.IO; using System.Text; public class ObjExporterScript { private static int StartIndex = 0; public static void Start() { StartIndex = 0; } public static void End() { StartIndex = 0; } public static string MeshToString(MeshFilter mf, Transform t) { Vector3 s = t.localScale; Vector3 p = t.localPosition; Quaternion r = t.localRotation; int numVertices = 0; Mesh m = mf.sharedMesh; if (!m) { return "####Error####"; } Material[] mats = mf.renderer.sharedMaterials; StringBuilder sb = new StringBuilder(); foreach(Vector3 vv in m.vertices) { Vector3 v = t.TransformPoint(vv); numVertices++; sb.Append(string.Format("v {0} {1} {2}\n",v.x,v.y,v.z)); } sb.Append("\n"); foreach(Vector3 nn in m.normals) { Vector3 v = r * nn; sb.Append(string.Format("vn {0} {1} {2}\n",v.x,v.y,v.z)); } sb.Append("\n"); foreach(Vector3 v in m.uv) { sb.Append(string.Format("vt {0} {1}\n",v.x,v.y)); } for (int material=0; material < m.subMeshCount; material ++) { sb.Append("\n"); sb.Append("usemtl ").Append(mats[material].name).Append("\n"); sb.Append("usemap ").Append(mats[material].name).Append("\n"); int[] triangles = m.GetTriangles(material); for (int i=0;i<triangles.Length;i+=3) { sb.Append(string.Format("f {0}/{0}/{0} {1}/{1}/{1} {2}/{2}/{2}\n", triangles[i]+1+StartIndex, triangles[i+1]+1+StartIndex, triangles[i+2]+1+StartIndex)); } } StartIndex += numVertices; return sb.ToString(); } } public class ObjExporter : ScriptableObject { public static void DoExport(GameObject obj) { if (obj == null) { return; } string meshName = obj.name; //string fileName = EditorUtility.SaveFilePanel("Export .obj file", "", meshName, "obj"); string filePath = "Test/" + meshName + ".obj"; ObjExporterScript.Start(); StringBuilder meshString = new StringBuilder(); meshString.Append("#" + meshName + ".obj" + "\n#" + System.DateTime.Now.ToLongDateString() + "\n#" + System.DateTime.Now.ToLongTimeString() + "\n#-------" + "\n\n"); Transform t = obj.transform; Vector3 originalPosition = t.position; t.position = Vector3.zero; meshString.Append("g ").Append(t.name).Append("\n"); meshString.Append(processTransform(t, true)); WriteToFile(meshString.ToString(),filePath); t.position = originalPosition; ObjExporterScript.End(); //Debug.Log("Exported Mesh: " + filePath); } static string processTransform(Transform t, bool makeSubmeshes) { StringBuilder meshString = new StringBuilder(); meshString.Append("#" + t.name + "\n#-------" + "\n"); if (makeSubmeshes) { meshString.Append("g ").Append(t.name).Append("\n"); } MeshFilter mf = t.GetComponent<MeshFilter>(); if (mf) { meshString.Append(ObjExporterScript.MeshToString(mf, t)); } for(int i = 0; i < t.childCount; i++) { meshString.Append(processTransform(t.GetChild(i), makeSubmeshes)); } return meshString.ToString(); } static void WriteToFile(string s, string filename) { using (StreamWriter sw = new StreamWriter(filename)) { sw.Write(s); } } }
然后我测试使用
using UnityEngine; using System.Collections; using System.IO; public class Test : MonoBehaviour { public GameObject parentObj; void Start () { GetFiles("/Users/dilitech/Downloads/test"); } // Update is called once per frame void Update () { } private void GetFiles(string folder) { string[] files = Directory.GetFiles(folder, "*.unity3d*", SearchOption.AllDirectories); for (int i = 0; i < files.Length; i++) { string path = "file://"+files[i]; StartCoroutine_Auto( loadSingle(path)); //files[i] = Path.GetFileNameWithoutExtension(files[i]); } } GameObject obj = null; IEnumerator loadSingle(string path){ WWW www = new WWW (path); yield return 0; if(parentObj.transform.childCount>0){ Destroy(parentObj.transform.GetChild(0).gameObject); } obj = Instantiate(www.assetBundle.mainAsset) as GameObject; obj.transform.parent = parentObj.transform; ObjExporter.DoExport(obj); } }
unity3d——3.5升级4.3打包资源的使用,布布扣,bubuko.com
原文:http://blog.csdn.net/pzw0416/article/details/22056163