MegaOBJExport.cs 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. using UnityEngine;
  2. using System.Collections;
  3. using System.IO;
  4. using System.Text;
  5. // 01313123931 bt handler
  6. public class MegaOBJExport : MonoBehaviour
  7. {
  8. public bool sequence = false;
  9. public int framerate = 30;
  10. public KeyCode key = KeyCode.O;
  11. public string path = "";
  12. public static string MeshToString(MeshFilter mf)
  13. {
  14. #if UNITY_EDITOR
  15. Mesh m = mf.sharedMesh;
  16. MeshRenderer mr = mf.GetComponent<MeshRenderer>();
  17. Material[] mats = mr.sharedMaterials;
  18. StringBuilder sb = new StringBuilder();
  19. sb.Append("g ").Append(mf.name).Append("\n");
  20. foreach ( Vector3 v in m.vertices )
  21. {
  22. sb.Append(string.Format("v {0} {1} {2}\n", v.x, v.y, v.z));
  23. }
  24. sb.Append("\n");
  25. foreach ( Vector3 v in m.normals )
  26. {
  27. sb.Append(string.Format("vn {0} {1} {2}\n", v.x, v.y, v.z));
  28. }
  29. sb.Append("\n");
  30. foreach ( Vector3 v in m.uv )
  31. {
  32. sb.Append(string.Format("vt {0} {1}\n", v.x, v.y));
  33. }
  34. for ( int material = 0; material < m.subMeshCount; material++ )
  35. {
  36. sb.Append("\n");
  37. sb.Append("usemtl ").Append(mats[material].name).Append("\n");
  38. sb.Append("usemap ").Append(mats[material].name).Append("\n");
  39. int[] triangles = m.GetTriangles(material);
  40. for ( int i = 0; i < triangles.Length; i += 3 )
  41. {
  42. sb.Append(string.Format("f {0}/{0}/{0} {1}/{1}/{1} {2}/{2}/{2}\n",
  43. triangles[i] + 1, triangles[i + 1] + 1, triangles[i + 2] + 1));
  44. }
  45. }
  46. return sb.ToString();
  47. #else
  48. return "";
  49. #endif
  50. }
  51. public static void MeshToFile(MeshFilter mf, string filename)
  52. {
  53. #if UNITY_EDITOR
  54. using ( StreamWriter sw = new StreamWriter(filename) )
  55. {
  56. sw.Write(MeshToString(mf));
  57. }
  58. #endif
  59. }
  60. int frame = 0;
  61. #if UNITY_EDITOR
  62. void Update()
  63. {
  64. if ( sequence )
  65. {
  66. if ( Input.GetKey(key) )
  67. {
  68. Time.captureFramerate = framerate;
  69. MeshFilter mf = (MeshFilter)GetComponent<MeshFilter>();
  70. MeshToFile(mf, path + "/" + gameObject.name + "-" + frame + ".obj");
  71. frame++;
  72. }
  73. else
  74. Time.captureFramerate = 0;
  75. }
  76. else
  77. {
  78. if ( Input.GetKeyDown(key) )
  79. {
  80. MeshFilter mf = (MeshFilter)GetComponent<MeshFilter>();
  81. MeshToFile(mf, path + "/" + gameObject.name + ".obj");
  82. }
  83. }
  84. }
  85. #endif
  86. }