private void Confirm() { _source.Clear(); _source.vertices = _collapseMesh.vertices; _source.uv = _collapseMesh.uv; _source.triangles = _collapseMesh.triangles; _meshFilter = _currEditing.GetComponent <MeshFilter>(); _meshFilter.sharedMesh = _source; Scene sc = SceneManager.GetActiveScene(); string scenePath = sc.path; string dir = Path.GetDirectoryName(scenePath); string exportName = _meshFilter.name; dir = dir + "/" + exportName; ObjExporter o = new ObjExporter(_collapseMesh, dir + "/" + exportName + ".obj") { progressBar = progressBar }; o.Execute(); AssetDatabase.Refresh(); PrefabUtility.ResetToPrefabState(_currEditing); Object.DestroyImmediate(_collapseMesh); _collapseMesh = null; _source = null; _meshFilter = null; _currEditing = null; }
private void Unity2Terrain() { if (_terrainName == "") { _terrainName = currentSelect.name; } Scene sc = SceneManager.GetActiveScene(); string scenePath = sc.path; string dir = Path.GetDirectoryName(scenePath); string exportName = GetUniqueDirectory(dir, _terrainName); dir = dir + "/" + exportName; ValidateDirectory(dir); AssetDatabase.Refresh(); _terrain = currentSelect.GetComponent<Terrain>().terrainData; int w = _terrain.heightmapWidth; int h = _terrain.heightmapHeight; Vector3 _meshScale = _terrain.size; _meshScale = new Vector3(_meshScale.x/(h - 1)*_tRes, _meshScale.y, _meshScale.z/(w - 1)*_tRes); Vector2 _uvScale = new Vector2((float) (1.0/(w - 1)), (float) (1.0/(h - 1))); float[,] tData = _terrain.GetHeights(0, 0, w, h); w = (int) ((w - 1)/_tRes + 1); h = (int) ((h - 1)/_tRes + 1); Vector3[] _vertics = new Vector3[w*h]; Vector2[] _uvs = new Vector2[w*h]; int[] _polys = new int[(w - 1)*(h - 1)*6]; int x, y; for (y = 0; y < h; y++) { for (x = 0; x < w; x++) { int fx = (int) (x*_tRes); int fy = (int) (y*_tRes); _vertics[y*w + x] = Vector3.Scale(_meshScale, new Vector3(-y, tData[fx, fy], x)); _uvs[y*w + x] = Vector2.Scale(new Vector2(y*_tRes, x*_tRes), _uvScale); } } int index = 0; for (y = 0; y < h - 1; y++) { for (x = 0; x < w - 1; x++) { _polys[index++] = y*w + x; _polys[index++] = (y + 1)*w + x; _polys[index++] = y*w + x + 1; _polys[index++] = (y + 1)*w + x; _polys[index++] = (y + 1)*w + x + 1; _polys[index++] = y*w + x + 1; } } ObjExporter o = new ObjExporter(_vertics, _uvs, _polys, dir + "/" + exportName + ".obj") { progressBar = progressBar }; o.Execute(); string pngName = dir + "/" + exportName + ".png"; string _assetName = AssetDatabase.GetAssetPath(_terrain); Object[] _assets = AssetDatabase.LoadAllAssetsAtPath(_assetName); if (_assets != null && _assets.Length > 1 && _keepTexture) { for (int i = 0, len = _assets.Length; i < len; i++) { if (_assets[i].name == "SplatAlpha 0") { Texture2D _texture = _assets[i] as Texture2D; if (_texture != null) { byte[] _bytes = _texture.EncodeToPNG(); File.WriteAllBytes(pngName, _bytes); AssetDatabase.ImportAsset(pngName, ImportAssetOptions.ForceUpdate); } } } } else { Texture2D _newMaskTexture = new Texture2D(512, 512, TextureFormat.RGBA32, true); Color[] _colorBase = new Color[512*512]; for (int i = 0, len = _colorBase.Length; i < len; i++) { _colorBase[i] = new Color(1, 0, 0, 0); } _newMaskTexture.SetPixels(_colorBase); byte[] _bytes = _newMaskTexture.EncodeToPNG(); File.WriteAllBytes(pngName, _bytes); AssetDatabase.ImportAsset(pngName, ImportAssetOptions.ForceUpdate); } AssetDatabase.ImportAsset(pngName, ImportAssetOptions.ForceUpdate); TextureImporter temp = AssetImporter.GetAtPath(pngName) as TextureImporter; SetTextureFormat(temp); AssetDatabase.Refresh(); AssetDatabase.ImportAsset(pngName, ImportAssetOptions.ForceUpdate); var tempMat = new Material(Shader.Find(TerrainCenter.DEFAULT_SHADER)); string _matPath = dir + "/" + exportName + ".mat"; AssetDatabase.CreateAsset(tempMat, _matPath); AssetDatabase.ImportAsset(_matPath, ImportAssetOptions.ForceUpdate); AssetDatabase.Refresh(); if (_keepTexture) { SplatPrototype[] texts = _terrain.splatPrototypes; for (int i = 0; i < texts.Length; i++) { if (i < 4) { tempMat.SetTexture("_Splat" + i, texts[i].texture); tempMat.SetTextureScale("_Splat" + i, texts[i].tileSize*8.9f); // why 8.9 here? } } } Texture _test = (Texture) AssetDatabase.LoadAssetAtPath(pngName, typeof (Texture)); tempMat.SetTexture("_Control", _test); GameObject prefab = AssetDatabase.LoadAssetAtPath<GameObject>(dir + "/" + exportName + ".obj"); AssetDatabase.Refresh(); GameObject forReplace = Object.Instantiate(prefab, currentSelect.position, Quaternion.identity); Transform childCheck = forReplace.transform.Find("default"); editData.defaultChild = childCheck.gameObject; forReplace.transform.DetachChildren(); Object.DestroyImmediate(forReplace); editData.defaultChild.name = exportName; editData.defaultChild.AddComponent<TerrainObject>(); editData.defaultChild.GetComponent<TerrainObject>().material = tempMat; editData.defaultChild.GetComponent<TerrainObject>().convertType = "UT"; editData.vertexInfo = 0; editData.partsOfTerrain = 0; editData.trisInfo = 0; int countChild = editData.defaultChild.transform.childCount; if (countChild > 0) { Renderer[] _objParts = editData.defaultChild.GetComponentsInChildren<Renderer>(); for (int i = 0, len = _objParts.Length; i < len; i++) { if (!_objParts[i].gameObject.GetComponent<MeshCollider>()) { _objParts[i].gameObject.AddComponent<MeshCollider>(); } _objParts[i].gameObject.isStatic = true; _objParts[i].material = tempMat; _objParts[i].gameObject.layer = 30; _objParts[i].gameObject.AddComponent<TerrainPart>(); MeshFilter _meshFilter = _objParts[i].GetComponent<MeshFilter>(); editData.defaultChild.GetComponent<TerrainObject>().mesh = _meshFilter; editData.partsOfTerrain += 1; editData.vertexInfo += _meshFilter.sharedMesh.vertexCount; editData.trisInfo += _meshFilter.sharedMesh.triangles.Length/3; } } else { editData.defaultChild.AddComponent<MeshCollider>(); editData.defaultChild.isStatic = true; editData.defaultChild.GetComponent<Renderer>().material = tempMat; editData.defaultChild.layer = 30; MeshFilter _meshFilter = editData.defaultChild.GetComponent<MeshFilter>(); editData.vertexInfo += _meshFilter.sharedMesh.vertexCount; editData.trisInfo += _meshFilter.sharedMesh.triangles.Length/3; editData.partsOfTerrain += 1; } GameObject _basePrefab = PrefabUtility.CreatePrefab(dir + "/" + exportName + ".prefab", editData.defaultChild); AssetDatabase.ImportAsset(dir + "/" + exportName + ".prefab", ImportAssetOptions.ForceUpdate); forReplace = PrefabUtility.InstantiatePrefab(_basePrefab) as GameObject; Object.DestroyImmediate(editData.defaultChild.gameObject); editData.defaultChild = forReplace.gameObject; currentSelect.GetComponent<Terrain>().enabled = false; EditorUtility.SetSelectedRenderState(editData.defaultChild.GetComponent<Renderer>(), EditorSelectedRenderState.Highlight); editData.unityTerrain = currentSelect.gameObject; EditorUtility.ClearProgressBar(); _terrainName = ""; AssetDatabase.StartAssetEditing(); ModelImporter objImporter = AssetImporter.GetAtPath(dir + "/" + exportName + ".obj") as ModelImporter; if (objImporter != null) { objImporter.globalScale = 1; objImporter.importTangents = ModelImporterTangents.CalculateLegacyWithSplitTangents; objImporter.importNormals = ModelImporterNormals.Calculate; objImporter.generateAnimations = ModelImporterGenerateAnimations.None; objImporter.meshCompression = ModelImporterMeshCompression.Off; objImporter.normalSmoothingAngle = 180f; } AssetDatabase.ImportAsset(dir + "/" + exportName + ".obj", ImportAssetOptions.ForceSynchronousImport); AssetDatabase.StopAssetEditing(); PrefabUtility.ResetToPrefabState(editData.defaultChild); _finalExportName = exportName; }