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()); }
/* * 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"); }
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"); }
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"); }
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"); }