현재 진행 상황
코드
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class RoomFirstDungeonGenerator : SimpleRandomWalkDungeonGenerator
{
[SerializeField]
private int minRoomWidth = 4, minRoomHeight = 4;
[SerializeField]
private int dungeonWidth = 20, dungeonHeight = 20;
[SerializeField]
[Range(0, 10)]
private int offset = 1;
[SerializeField]
private bool randomWalkRooms = false;
protected override void RunProceduralGeneration()
{
CreatRooms();
}
private void CreatRooms()
{
var roomsList = ProceduralGenerationAlgorithms.BinarySpacePartitioning(new BoundsInt((Vector3Int)startPosition, new Vector3Int
(dungeonWidth, dungeonHeight, 0)), minRoomWidth, minRoomHeight);
HashSet<Vector2Int> floor = new HashSet<Vector2Int>();
floor = CreateSimpleRooms(roomsList);
tilemapVisualizer.PaintFloorTiles(floor);
WallGenerator.CreateWalls(floor, tilemapVisualizer);
}
private HashSet<Vector2Int> CreateSimpleRooms(List<BoundsInt> roomsList)
{
HashSet<Vector2Int> floor = new HashSet<Vector2Int>();
foreach (var room in roomsList)
{
for (int col = offset; col < room.size.x - offset; col++)
{
for (int row = offset; row < room.size.y - offset; row++)
{
Vector2Int position = (Vector2Int)room.min + new Vector2Int(col, row);
floor.Add(position);
}
}
}
return floor;
}
}
y값, z값 수정 min -> size
방 더 많이 생성하기
복도를 만들었다
코드 수정
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Random = UnityEngine.Random;
public class RoomFirstDungeonGenerator : SimpleRandomWalkDungeonGenerator
{
[SerializeField]
private int minRoomWidth = 4, minRoomHeight = 4;
[SerializeField]
private int dungeonWidth = 20, dungeonHeight = 20;
[SerializeField]
[Range(0, 10)]
private int offset = 1;
[SerializeField]
private bool randomWalkRooms = false;
protected override void RunProceduralGeneration()
{
CreatRooms();
}
private void CreatRooms()
{
var roomsList = ProceduralGenerationAlgorithms.BinarySpacePartitioning(new BoundsInt((Vector3Int)startPosition, new Vector3Int
(dungeonWidth, dungeonHeight, 0)), minRoomWidth, minRoomHeight);
HashSet<Vector2Int> floor = new HashSet<Vector2Int>();
floor = CreateSimpleRooms(roomsList);
List<Vector2Int> roomCenters = new List<Vector2Int>();
foreach (var room in roomsList)
{
roomCenters.Add((Vector2Int)Vector3Int.RoundToInt(room.center));
}
HashSet<Vector2Int> corridors = ConnectRooms(roomCenters);
floor.UnionWith(corridors);
tilemapVisualizer.PaintFloorTiles(floor);
WallGenerator.CreateWalls(floor, tilemapVisualizer);
}
private HashSet<Vector2Int> ConnectRooms(List<Vector2Int> roomCenters)
{
HashSet<Vector2Int> corridors = new HashSet<Vector2Int>();
var currentRoomCenter = roomCenters[Random.Range(0, roomCenters.Count)];
roomCenters.Remove(currentRoomCenter);
while (roomCenters.Count > 0)
{
Vector2Int closest = FindClosetPointTo(currentRoomCenter, roomCenters);
roomCenters.Remove(closest);
HashSet<Vector2Int> newcorridor = CreateCorridor(currentRoomCenter, closest);
currentRoomCenter = closest;
corridors.UnionWith(newcorridor);
}
return corridors;
}
private HashSet<Vector2Int> CreateCorridor(Vector2Int currentRoomCenter, Vector2Int destination)
{
HashSet<Vector2Int> corridor = new HashSet<Vector2Int>();
var position = currentRoomCenter;
corridor.Add(position);
while (position.y != destination.y)
{
if(destination.y > position.y)
{
position += Vector2Int.up;
}
else if(destination.y < position.y)
{
position += Vector2Int.down;
}
corridor.Add(position);
}
while (position.x != destination.x)
{
if(destination.x > position.x)
{
position += Vector2Int.right;
}else if(destination.x < position.x)
{
position += Vector2Int.left;
}
corridor.Add(position);
}
return corridor;
}
private Vector2Int FindClosetPointTo(Vector2Int currentRoomCenter, List<Vector2Int> roomCenters)
{
Vector2Int closest = Vector2Int.zero;
float distance = float.MaxValue;
foreach (var position in roomCenters)
{
float currentDistance = Vector2Int.Distance(position, currentRoomCenter);
if (currentDistance < distance)
{
distance = currentDistance;
closest = position;
}
}
return closest;
}
private HashSet<Vector2Int> CreateSimpleRooms(List<BoundsInt> roomsList)
{
HashSet<Vector2Int> floor = new HashSet<Vector2Int>();
foreach (var room in roomsList)
{
for (int col = offset; col < room.size.x - offset; col++)
{
for (int row = offset; row < room.size.y - offset; row++)
{
Vector2Int position = (Vector2Int)room.min + new Vector2Int(col, row);
floor.Add(position);
}
}
}
return floor;
}
}
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Random = UnityEngine.Random;
public class RoomFirstDungeonGenerator : SimpleRandomWalkDungeonGenerator
{
[SerializeField]
private int minRoomWidth = 4, minRoomHeight = 4;
[SerializeField]
private int dungeonWidth = 20, dungeonHeight = 20;
[SerializeField]
[Range(0, 10)]
private int offset = 1;
[SerializeField]
private bool randomWalkRooms = false;
protected override void RunProceduralGeneration()
{
CreatRooms();
}
private void CreatRooms()
{
var roomsList = ProceduralGenerationAlgorithms.BinarySpacePartitioning(new BoundsInt((Vector3Int)startPosition, new Vector3Int
(dungeonWidth, dungeonHeight, 0)), minRoomWidth, minRoomHeight);
HashSet<Vector2Int> floor = new HashSet<Vector2Int>();
if (randomWalkRooms)
{
floor = CreateRoomsRandomly(roomsList);
}
else
{
floor = CreateSimpleRooms(roomsList);
}
List<Vector2Int> roomCenters = new List<Vector2Int>();
foreach (var room in roomsList)
{
roomCenters.Add((Vector2Int)Vector3Int.RoundToInt(room.center));
}
HashSet<Vector2Int> corridors = ConnectRooms(roomCenters);
floor.UnionWith(corridors);
tilemapVisualizer.PaintFloorTiles(floor);
WallGenerator.CreateWalls(floor, tilemapVisualizer);
}
private HashSet<Vector2Int> CreateRoomsRandomly(List<BoundsInt> roomsList)
{
HashSet<Vector2Int> floor = new HashSet<Vector2Int>();
for (int i = 0; i < roomsList.Count; i++)
{
var roomBounds = roomsList[i];
var roomCenter = new Vector2Int(Mathf.RoundToInt(roomBounds.center.x), Mathf.RoundToInt(roomBounds.center.y));
var roomFloor = RunRandomWalk(randomWalkParameters, roomCenter);
foreach (var position in roomFloor)
{
if(position.x >= (roomBounds.xMin + offset) && position.x <= (roomBounds.xMin - offset) && position.y >= (roomBounds.yMin -
offset) && position.y <= (roomBounds.yMin - offset))
{
floor.Add(position);
}
}
}
return floor;
}
private HashSet<Vector2Int> ConnectRooms(List<Vector2Int> roomCenters)
{
HashSet<Vector2Int> corridors = new HashSet<Vector2Int>();
var currentRoomCenter = roomCenters[Random.Range(0, roomCenters.Count)];
roomCenters.Remove(currentRoomCenter);
while (roomCenters.Count > 0)
{
Vector2Int closest = FindClosetPointTo(currentRoomCenter, roomCenters);
roomCenters.Remove(closest);
HashSet<Vector2Int> newcorridor = CreateCorridor(currentRoomCenter, closest);
currentRoomCenter = closest;
corridors.UnionWith(newcorridor);
}
return corridors;
}
private HashSet<Vector2Int> CreateCorridor(Vector2Int currentRoomCenter, Vector2Int destination)
{
HashSet<Vector2Int> corridor = new HashSet<Vector2Int>();
var position = currentRoomCenter;
corridor.Add(position);
while (position.y != destination.y)
{
if(destination.y > position.y)
{
position += Vector2Int.up;
}
else if(destination.y < position.y)
{
position += Vector2Int.down;
}
corridor.Add(position);
}
while (position.x != destination.x)
{
if(destination.x > position.x)
{
position += Vector2Int.right;
}else if(destination.x < position.x)
{
position += Vector2Int.left;
}
corridor.Add(position);
}
return corridor;
}
private Vector2Int FindClosetPointTo(Vector2Int currentRoomCenter, List<Vector2Int> roomCenters)
{
Vector2Int closest = Vector2Int.zero;
float distance = float.MaxValue;
foreach (var position in roomCenters)
{
float currentDistance = Vector2Int.Distance(position, currentRoomCenter);
if (currentDistance < distance)
{
distance = currentDistance;
closest = position;
}
}
return closest;
}
private HashSet<Vector2Int> CreateSimpleRooms(List<BoundsInt> roomsList)
{
HashSet<Vector2Int> floor = new HashSet<Vector2Int>();
foreach (var room in roomsList)
{
for (int col = offset; col < room.size.x - offset; col++)
{
for (int row = offset; row < room.size.y - offset; row++)
{
Vector2Int position = (Vector2Int)room.min + new Vector2Int(col, row);
floor.Add(position);
}
}
}
return floor;
}
}
'Project T > 진행' 카테고리의 다른 글
[팀 프로젝트] - 랜덤 워크와 이진 공간 분할 알고리즘(맵 생성 종료) (0) | 2021.12.03 |
---|---|
[팀 프로젝트] - 랜덤 워크와 이진 공간 분할 알고리즘(맵 생성5) (0) | 2021.12.02 |
[팀 프로젝트] - 랜덤 워크와 이진 공간 분할 알고리즘(맵 생성4) (0) | 2021.12.01 |
[팀 프로젝트] - 랜덤 워크와 이진 공간 분할 알고리즘(맵 생성3) (0) | 2021.11.30 |
[팀 프로젝트] - 랜덤 워크와 이진 공간 분할 알고리즘(맵 생성2) (0) | 2021.11.29 |