项目中美术有需求,需要将Unity场景中的预设物导出为3DMax可用的.obj格式的文件,所以就写了一个编辑器工具类,根据所选择的场景物体导出,比例关系为 Unity 1米 = 3DMax 1厘米
工具栏选项:
实例代码:
/**
*Copyright(C) 2018 by Qihoo_Blockchain
*All rights reserved.
*FileName: EditorObjExporter.cs
*Author: WangDouDou
*Version: 1.0
*UnityVersion:2018.1.0f2
*Date: 2018-11-01
*Description:
*History:
*/
using UnityEngine;
using UnityEditor;
using System.Collections;
using System.Collections.Generic;
using System.IO;
using System.Text;
using System;
using UnityEngine.SceneManagement;
struct ObjMaterial
{
public string name;
public string textureName;
}
public class EditorObjExporter : ScriptableObject
{
private static int vertexOffset = 0;
private static int normalOffset = 0;
private static int uvOffset = 0;
//User should probably be able to change this. It is currently left as an excercise for
//the reader.
private static string targetFolder = "ExportedObj";
private static string MeshToString(MeshFilter mf, Dictionary<string, ObjMaterial> materialList)
{
Mesh m = mf.sharedMesh;
Material[] mats = mf.GetComponent<Renderer>().sharedMaterials;
StringBuilder sb = new StringBuilder();
sb.Append("g ").Append(mf.name).Append("");
foreach (Vector3 lv in m.vertices)
{
Vector3 wv = mf.transform.TransformPoint(lv);
//This is sort of ugly - inverting x-component since we're in
//a different coordinate system than "everyone" is "used to".
sb.Append(string.Format("v {0} {1} {2}", -wv.x, wv.y, wv.z));
}
sb.Append("");
foreach (Vector3 lv in m.normals)
{
Vector3 wv = mf.transform.TransformDirection(lv);
sb.Append(string.Format("vn {0} {1} {2}", -wv.x, wv.y, wv.z));
}
sb.Append("");
foreach (Vector3 v in m.uv)
{
sb.Append(string.Format("vt {0} {1}", v.x, v.y));
}
for (int material = 0; material < m.subMeshCount; material++)
{
sb.Append(