unity3d——3.5升级4.3打包资源的使用



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文件。我测试用例,大家试着改改,共同进步。


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值