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);
}
}
}
这个主要参考http://wiki.unity3d.com/index.php?title=ExportOBJ这个文章,它这个用的编辑器类,我改成了脚本类,我看了看,就是把信息转存了一下。
然后我测试使用
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);
}
}
就可以将 /Users/dilitech/Downloads/test这个文件下的资源文件解包到当前工程的Test文件夹下都是.obj格式,其实Texture相对这个异曲同工,可以自己写下。因为资源文件是.*格式,我的是 .unity格式,所以要加载到场景中才能转成.obj文件。我测试用例,大家试着改改,共同进步。