コード例 #1
0
    protected void GenerateCandidates()
    {
        DDebugTimer.Start();

        //ClearStepVoxels();

        elementsFactory.StartFactory(targetElementsCount);

        if (stepByStep)
        {
            return;
        }

        int infiniteLoopCheckCount = 0, infiniteLoopCheck = targetElementsCount << elementsFactory.loopCheckCount;

        while (elementsFactory.CandidateComponents.GetOpenCandidatesCount() > 0)
        {
            if (infiniteLoopCheckCount++ > infiniteLoopCheck)
            {
                throw new System.Exception("DungeonGenerator::Dungeon generation takes too long. - Possible infinite loop.");
            }

            GenerateNextCandidate();

            if (stepByStep)
            {
                break;
            }
        }

        Debug.Log("DungeonGenerator::Generation completed : " + DDebugTimer.Lap() + "ms");
        Debug.Log("DungeonGenerator::Elements targeted : " + targetElementsCount + ". Candidates accepted : " + elementsFactory.CandidateComponents.GetAcceptedCandidatesCount());
    }
コード例 #2
0
    /*
     * protected void ClearStepVoxels()
     * {
     *  int length = stepVoxels.Count;
     *  for (int i = 0; i < length; i++)
     *  {
     *      GameObject.DestroyImmediate(stepVoxels[i]);
     *  }
     *
     *  stepVoxels.Clear();
     * }
     *
     * protected void AddStepVoxel(Vector3 stepVoxelWorldPos, Color color)
     * {
     *  GameObject sphereGO = GameObject.CreatePrimitive(PrimitiveType.Sphere);
     *
     *  sphereGO.transform.parent = this.transform;
     *  sphereGO.transform.position = stepVoxelWorldPos;
     *  sphereGO.GetComponent<Renderer>().material.color = color;
     *  sphereGO.name += stepVoxelWorldPos;
     *
     *  stepVoxels.Add(sphereGO);
     * }
     */
    /// <summary>
    /// Gets all accepted candidates from Elements Factory and initializes new element for each.
    /// </summary>
    protected void BuildAllElements()
    {
        DDebugTimer.Start();

        List <Candidate> acceptedCandidates = elementsFactory.CandidateComponents.GetAllAcceptedCandidates();
        int count = acceptedCandidates.Count;

        for (int i = 1; i < count; i++)
        {
            Candidate acceptedCandidate = acceptedCandidates[i];
            BuildElement(acceptedCandidate);
        }

        Debug.Log("DungeonGenerator::Generated Elements Initialized : " + DDebugTimer.Lap() + "ms");
    }
コード例 #3
0
    private void StartGeneration()
    {
        DDebugTimer.Start();

        generationComplete = false;
        rooms = new List <Room>();
        doors = new List <Door>();

        int        spawn = random.range(0, data.sets[dungeonSet].spawns.Count - 1);
        GameObject room  = (GameObject)Instantiate(data.sets[dungeonSet].spawns[spawn].gameObject);

        startRoom = room;
        rooms.Add(room.GetComponent <Room>());
        room.transform.parent = this.gameObject.transform;
        openSet.Add(room.GetComponent <EL.Dungeon.Room>());
        room.GetComponent <Volume>().RecalculateBounds();
        AddGlobalVoxels(room.GetComponent <Volume>().voxels);
        roomsCount++;

        while (openSet.Count > 0)
        {
            GenerateNextRoom();
        }

        //process doors
        for (int i = 0; i < rooms.Count; i++)
        {
            for (int j = 0; j < rooms[i].doors.Count; j++)
            {
                if (rooms[i].doors[j].door == null)
                {
                    Door d = ((GameObject)Instantiate(data.sets[dungeonSet].doors[0].gameObject)).GetComponent <Door>();
                    doors.Add(d);
                    rooms[i].doors[j].door            = d;
                    rooms[i].doors[j].sharedDoor.door = d;
                    //
                    d.gameObject.transform.position = rooms[i].doors[j].transform.position;
                    d.gameObject.transform.rotation = rooms[i].doors[j].transform.rotation;
                    d.gameObject.transform.parent   = this.gameObject.transform;
                }
            }
        }
        //locked doors and keys, etc come next.

        generationComplete = true;
        Debug.Log("DungeonGenerator::Generation completed : " + DDebugTimer.Lap() + "ms");
    }
コード例 #4
0
    private void StartGeneration()
    {
        DDebugTimer.Start();

        generationComplete = false;
        rooms = new List <Room>();
        doors = new List <Door>();
        CreateSpawnRoom();

        while (openSet.Count > 0)
        {
            GenerateNextRoom();
        }

        ProcessDoors();

        generationComplete = true;
        Debug.Log("DungeonGenerator::Generation completed : " + DDebugTimer.Lap() + "ms");
    }
コード例 #5
0
    private IEnumerator StartGeneration()
    {
        yield return(null);

        DDebugTimer.Start();
        stopwatch.Start();
        generationComplete = false;

        rooms = new List <Room>();
        doors = new List <Door>();

        int        spawn = random.range(0, data.sets[dungeonSet].spawns.Count - 1);
        GameObject room  = (GameObject)Instantiate(data.sets[dungeonSet].spawns[spawn].gameObject);

        startRoom = room;
        rooms.Add(room.GetComponent <Room>());
        room.transform.parent        = this.gameObject.transform;
        room.transform.localPosition = Vector3.zero;
        openSet.Add(room.GetComponent <EL.Dungeon.Room>());
        room.GetComponent <Volume>().RecalculateBounds();
        AddGlobalVoxels(room.GetComponent <Volume>().voxels);
        roomsCount++;

        while (openSet.Count > 0 && (!generateWithTimer || stopwatch.ElapsedMilliseconds < MaxGenerationTime))
        {
            stopwatch.Reset();

            GenerateNextRoom();
            if (UseEnumaration)
            {
                yield return(new WaitForSeconds(GenerationDelay));
            }

            stopwatch.Start();
        }

        //TODO: Do a pass on all rooms to try to replace dead ends with room that connect them

        //Init the player/walker
        SpawnRoom  spawnRoom  = startRoom.GetComponent <SpawnRoom>();
        GameObject walker     = Instantiate(WalkerPrefab, spawnRoom.SpawnPosition.position, spawnRoom.SpawnPosition.rotation);
        var        controller = walker.GetComponent <TwitchPlayerController>();

        controller.TargetDoor = spawnRoom.doors[0];

        //process doors
        for (int i = 0; i < rooms.Count; i++)
        {
            for (int j = 0; j < rooms[i].doors.Count; j++)
            {
                if (rooms[i].doors[j].door == null && rooms[i].doors[j].sharedDoor != null)
                {
                    Door d = ((GameObject)Instantiate(data.sets[dungeonSet].doors[0].gameObject)).GetComponent <Door>();
                    doors.Add(d);
                    rooms[i].doors[j].door            = d;
                    rooms[i].doors[j].sharedDoor.door = d;
                    //
                    d.gameObject.transform.position = rooms[i].doors[j].transform.position;
                    d.gameObject.transform.rotation = rooms[i].doors[j].transform.rotation;
                    d.gameObject.transform.parent   = this.gameObject.transform;
                }
            }
        }
        //locked doors and keys, etc come next.

        generationComplete = true;
        Debug.Log("DungeonGenerator::Generation completed : " + DDebugTimer.Lap() + "ms");
    }