Exemple #1
0
    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();
        }
    }
Exemple #2
0
    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();
    }
Exemple #3
0
    //地形データなどを生成するメソッド。実体は生成しない。
    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());
        }
    }