public override void generate() { if (!generated) { type = TreeType.Shirakashi; mesh = BPMesh.generateTree(new TreeInfo(type, TreeInfo.getMaxHeight(type) / TreeInfo.getGrowSpeed(type))); generated = true; } if (entity == null) { (entity = new GameObject("tree-" + getChunkX() + "," + getChunkZ()).AddComponent <MapEntity> ()).init(this); } else { reloadEntity(); } }
private IEnumerator a() { if (generated || generatingAsync) { yield break; } if (generatingChunks.Count >= max_generation) { generateCancelledChunks.Add(this); yield break; } if (stopGenerating) { stopGenerating = false; yield break; } generatingAsync = true; generatingChunks.Add(this); Debug.Log(DateTime.Now + " チャンク生成開始(Async) X: " + x + " Z: " + z); //地形の生成 List <Vector3> points = new List <Vector3> (); bool e_u = false; bool e_d = false; bool e_l = false; bool e_r = false; bool e_ul = false; bool e_ur = false; bool e_dr = false; bool e_dl = false; while (!(e_u && e_d && e_l && e_r && e_ul && e_ur && e_dr && e_dl)) { int x2 = x; int z2 = z; if (!e_u) { z2 = z + 1; } else if (!e_d) { z2 = z - 1; } else if (!e_l) { x2 = x - 1; } else if (!e_r) { x2 = x + 1; } else if (!e_ul) { x2 = x - 1; z2 = z + 1; } else if (!e_ur) { x2 = x + 1; z2 = z + 1; } else if (!e_dr) { x2 = x + 1; z2 = z - 1; } else if (!e_dl) { x2 = x - 1; z2 = z - 1; } Chunk chunk = map.getChunk(x2, z2); if (chunk.generatingAsync) { //隣接するチャンクが待機中に生成を開始している場合があるため、 //自チャンクの生成を後に回し最初からやり直す。 generatingAsync = false; generatingChunks.Remove(this); generateCancelledChunks.Add(this); Debug.Log(DateTime.Now + " チャンク生成中止(13) X: " + x + " Z: " + z); yield break; } if (chunk.generated) { List <Vector3> verts1 = new List <Vector3> (chunk.mesh.vertices); for (int b = 0; b < verts1.Count;) { if (verts1 [b].x == 0 || verts1 [b].z == 0 || verts1 [b].x == size || verts1 [b].z == size) { verts1 [b] += (x2 - x) * Vector3.right * size + (z2 - z) * Vector3.forward * size; b++; } else { verts1.RemoveAt(b); } } points.AddRange(verts1); if (!e_u) { e_ul = true; e_ur = true; } else if (!e_d) { e_dl = true; e_dr = true; } else if (!e_l) { e_ul = true; e_dl = true; } else if (!e_r) { e_ur = true; e_dr = true; } } if (!e_u) { e_u = true; } else if (!e_d) { e_d = true; } else if (!e_l) { e_l = true; } else if (!e_r) { e_r = true; } else if (!e_ul) { e_ul = true; } else if (!e_ur) { e_ur = true; } else if (!e_dr) { e_dr = true; } else if (!e_dl) { e_dl = true; } } IEnumerator _routine = BPMesh.getBPFractalTerrainAsync(Main.main, fineness, size, height, points); yield return(Main.main.StartCoroutine(_routine)); if (_routine.Current is Mesh) { if (stopGenerating) { Debug.Log(DateTime.Now + " チャンク生成中止(14) X: " + x + " Z: " + z); generatingAsync = false; stopGenerating = false; generatingChunks.Remove(this); yield break; } mesh = (Mesh)_routine.Current; } //森林の生成 generateForest(); generatingAsync = false; generatingChunks.Remove(this); generated = true; Debug.Log(DateTime.Now + " チャンク生成完了 X: " + x + " Z: " + z); reloadEntity(); }
//地形データなどを生成するメソッド。実体は生成しない。 public bool generateChunk() { if (generated || generatingSync) { return(false); } stopAsyncGenerating(); generatingSync = true; Debug.Log(DateTime.Now + " チャンク生成開始 X: " + x + " Z: " + z); //地形の生成 List <Vector3> points = new List <Vector3> (); for (int x2 = x - 1; x2 <= x + 1; x2++) { for (int z2 = z - 1; z2 <= z + 1; z2++) { if (x2 != x || z2 != z) { Chunk chunk = map.getChunk(x2, z2); if (chunk.generatingAsync) { chunk.stopAsyncGenerating(); } if (chunk.generated && chunk.mesh != null) { List <Vector3> verts1 = new List <Vector3> (chunk.mesh.vertices); for (int b = 0; b < verts1.Count;) { if (verts1 [b].x == 0 || verts1 [b].z == 0 || verts1 [b].x == size || verts1 [b].z == size) { b++; } else { verts1.RemoveAt(b); } } Vector3[] verts2 = verts1.ToArray(); for (int c = 0; c < verts2.Length; c++) { verts2 [c] += (x2 - x) * Vector3.right * size + (z2 - z) * Vector3.forward * size; } points.AddRange(verts2); } } } } mesh = BPMesh.getBPFractalTerrain(fineness, size, height, points); //森林の生成 generateForest(); generatingSync = false; generated = true; Debug.Log(DateTime.Now + " チャンク生成完了 X: " + x + " Z: " + z); reloadEntity(); return(true); }
public static void ExportColliders() { try { var path = EditorUtility.SaveFilePanelInProject("Export Physics Data", "Physics.xml", "xml", ""); if (path.Length <= 0) { Debug.Log("Path can't be null."); return; } FileStream file = null; if (File.Exists(path)) { File.Delete(path); } file = File.Create(path); XmlSerializer serializer = new XmlSerializer(typeof(BPColliders)); BPColliders colliders = new BPColliders(); foreach (var collider in FindObjectsOfType(typeof(Collider)).Cast <Collider>()) { // Box Collider var box = collider as BoxCollider; if (box != null) { var center = box.center + box.gameObject.transform.position; BPBox bpBox = new BPBox() { Center = new PositionData(center.x, center.y, center.z), HalfExtents = new PositionData(box.size.x / 2f, box.size.y / 2f, box.size.z / 2f), Rotation = new PositionData(box.transform.rotation.x, box.transform.rotation.y, box.transform.rotation.z, box.transform.rotation.w), LocalScale = new PositionData(box.transform.localScale.x, box.transform.localScale.y, box.transform.localScale.z) }; colliders.Boxes.Add(bpBox); } // Capsule Collider var capsule = collider as CapsuleCollider; if (capsule != null) { var center = capsule.center + capsule.gameObject.transform.position; BPCapsule bpCapsule = new BPCapsule() { Center = new PositionData(center.x, center.y, center.z), Rotation = new PositionData(capsule.transform.rotation.x, capsule.transform.rotation.y, capsule.transform.rotation.z, capsule.transform.rotation.w), LocalScale = new PositionData(capsule.transform.localScale.x, capsule.transform.localScale.y, capsule.transform.localScale.z), Height = capsule.height, Radius = capsule.radius }; colliders.Capsules.Add(bpCapsule); } // Sphere Collider var sphere = collider as SphereCollider; if (sphere != null) { var center = sphere.center + sphere.gameObject.transform.position; BPSphere bpSphere = new BPSphere() { Center = new PositionData(center.x, center.y, center.z), Rotation = new PositionData(sphere.transform.rotation.x, sphere.transform.rotation.y, sphere.transform.rotation.z, sphere.transform.rotation.w), LocalScale = new PositionData(sphere.transform.localScale.x, sphere.transform.localScale.y, sphere.transform.localScale.z), Radius = sphere.radius }; colliders.Spheres.Add(bpSphere); } // Mesh Collider var mesh = collider as MeshCollider; if (mesh != null) { var center = mesh.gameObject.transform.position; List <PositionData> vertArray = new List <PositionData>(mesh.sharedMesh.vertexCount); foreach (var vec in mesh.sharedMesh.vertices) { vertArray.Add(new PositionData(vec.x, vec.y, vec.z)); } BPMesh bpMesh = new BPMesh() { Center = new PositionData(center.x, center.y, center.z), Rotation = new PositionData(mesh.transform.rotation.x, mesh.transform.rotation.y, mesh.transform.rotation.z, mesh.transform.rotation.w), LocalScale = new PositionData(mesh.transform.localScale.x, mesh.transform.localScale.y, mesh.transform.localScale.z), NumTris = mesh.sharedMesh.triangles.GetLength(0), NumVert = mesh.sharedMesh.vertexCount, Triangles = new List <int>(mesh.sharedMesh.triangles), Vertexes = vertArray }; colliders.Meshes.Add(bpMesh); } } serializer.Serialize(file, colliders); file.Close(); Debug.LogFormat("Export colliders success. Path: {0}", path); } catch (Exception ex) { Debug.LogErrorFormat("Physics export error: {0}", ex.ToString()); } }