//Создать дерево разделения private void CreateBSP(SubDungeon subdungeon) { //Debug.Log("Splitting sub-dungeon " + subdungeon.debugId + ": " + subdungeon.rect); if (subdungeon.IAmLeaf()) { if (splits < maxSplits) { if (subdungeon.rect.width > maxLeafSize || subdungeon.rect.height > maxLeafSize) { if (subdungeon.Split(minLeafSize, maxLeafSize)) { /*Debug.Log("Splitted sub-dungeon " + subdungeon.debugId + " in " + subdungeon.left.debugId + ": " + subdungeon.left.rect + ", " + subdungeon.right.debugId + ": " + subdungeon.right.rect);*/ CreateBSP(subdungeon.left); CreateBSP(subdungeon.right); return; } else { leaves.Add(subdungeon); return; } } } leaves.Add(subdungeon); } }
public void DrawRooms(SubDungeon subDungeon) { if (subDungeon == null) { return; } if (subDungeon.IAmLeaf()) { for (int i = (int)subDungeon.room.x; i < subDungeon.room.xMax; i++) { for (int j = (int)subDungeon.room.y; j < subDungeon.room.yMax; j++) { GameObject instance = Instantiate(floorTile, new Vector3(i, j, 0f), Quaternion.identity) as GameObject; instance.transform.SetParent(transform); boardPositionsFloor[i, j] = instance; } } ////////// /////////// } else { DrawRooms(subDungeon.left); DrawRooms(subDungeon.right); } }
public void DrawWallsRooms(SubDungeon subDungeon) { if (subDungeon == null) { return; } if (subDungeon.IAmLeaf()) { int i = (int)subDungeon.room.x - 1; for (int j = ((int)subDungeon.room.y - 1); j < subDungeon.room.yMax + 1; j++) { SetInstance(wallTile, i, j); } i = (int)subDungeon.room.xMax; for (int j = ((int)subDungeon.room.y - 1); j < subDungeon.room.yMax + 1; j++) { SetInstance(wallTile, i, j); } i = (int)subDungeon.room.y - 1; for (int j = (int)subDungeon.room.x; j < subDungeon.room.xMax; j++) { SetInstance(wallTile, j, i); } i = (int)subDungeon.room.yMax; for (int j = (int)subDungeon.room.x; j < subDungeon.room.xMax; j++) { SetInstance(wallTile, j, i); } } else { DrawWallsRooms(subDungeon.left); DrawWallsRooms(subDungeon.right); } }
public void DrawRooms(SubDungeon subDungeon) { if (subDungeon == null) { return; } if (subDungeon.IAmLeaf()) { //tworzenie pokoju //sprawdzić które punkty to krawędzie i stawić tam inne klocki for (int i = (int)subDungeon.room.x; i < subDungeon.room.xMax; i++) { for (int j = (int)subDungeon.room.y; j < subDungeon.room.yMax; j++) { SetInstance(floorTile, i, j); } } int Randx; int Randy; if (playerSetPosition) { int x = (int)Random.Range(1, 4); for (int i = 0; i < x; i++) { do { Randx = (int)Random.Range(subDungeon.room.x, subDungeon.room.xMax); Randy = (int)Random.Range(subDungeon.room.y, subDungeon.room.yMax); }while (boardPositionsUnits[Randx, Randy] != null); SetEnemy(enemy, Randx, Randy); } } else { Randx = (int)Random.Range(subDungeon.room.x, subDungeon.room.xMax); Randy = (int)Random.Range(subDungeon.room.y, subDungeon.room.yMax); SetPlayer(Randx, Randy); } float chance = Random.Range(1, 100); if (chance <= 50) { do { Randx = (int)Random.Range(subDungeon.room.x, subDungeon.room.xMax); Randy = (int)Random.Range(subDungeon.room.y, subDungeon.room.yMax); }while (boardPositionsUnits[Randx, Randy] != null); SetItem(chiken, Randx, Randy); } } else { DrawRooms(subDungeon.left); DrawRooms(subDungeon.right); } }
// Utility functions /// <summary> Gets a random position in the whole dungeon </summary> private void GetRandomPos(SubDungeon subDungeon) { if (subDungeon == null) { return; } if (subDungeon.IAmLeaf()) { int randPosX, randPosY, findingPosAttempt = 0, maxAttemptLimit = 500; do { randPosX = Random.Range((int)subDungeon.room.x, (int)subDungeon.room.xMax); randPosY = Random.Range((int)subDungeon.room.y, (int)subDungeon.room.yMax); findingPosAttempt++; } while ((_dungeonTiles[randPosX, randPosY] != 1 || _objectSpawnPos[randPosX, randPosY] == 1) && findingPosAttempt <= maxAttemptLimit); _randomPos = new Vector3(randPosX, randPosY, 0); } else { if (Random.Range(0, 2) == 0) { GetRandomPos(subDungeon.left); } else { GetRandomPos(subDungeon.right); } } }
private void SpawnTraps(SubDungeon subDungeon, int dungeonLevel) { if (subDungeon == null) { return; } if (subDungeon.IAmLeaf()) { if (_trapSpawnData.Current <= _trapSpawnData.Max) { int minTrapNumber = (int)((subDungeon.room.width * subDungeon.room.height) / 12); int trapNumberForThisRoom = Random.Range(minTrapNumber, minTrapNumber + 1); for (int i = 0; i < trapNumberForThisRoom; i++) { _randomPos = GetRandomPosInRoom(subDungeon.room); // if the randomPos != invalidPos, then spawn the object if (Vector3.Distance(_randomPos, _invalidPos) != 0) { int trapIndex = Random.Range(0, 2); GameObject instance = Instantiate(GameConfigData.Instance.Traps[trapIndex], _randomPos, Quaternion.identity) as GameObject; instance.transform.SetParent(Dungeon.transform.GetChild((int)Objects.Traps).gameObject.transform); _trapSpawnData.Current++; _objectSpawnPos[(int)_randomPos.x, (int)_randomPos.y] = 1; } } } } else { SpawnTraps(subDungeon.left, dungeonLevel); SpawnTraps(subDungeon.right, dungeonLevel); } }
public void DrawWalls(SubDungeon subDungeon) { if (subDungeon == null) { return; } if (subDungeon.IAmLeaf()) { for (int i = (int)subDungeon.room.x - 1; i < subDungeon.room.xMax + 1; i++) { for (int j = (int)subDungeon.room.y - 1; j < subDungeon.room.yMax + 1; j++) { if (i == subDungeon.room.x - 1 || j == subDungeon.room.y - 1 || i == subDungeon.room.xMax || j == subDungeon.room.yMax) { if (boardPositionsFloor[i, j] == null) { GameObject wall = Instantiate(wallTile, new Vector3(i, j, 0f), Quaternion.identity) as GameObject; wall.transform.SetParent(transform); boardPositionsFloor[i, j] = wall; } } } } } else { DrawWalls(subDungeon.left); DrawWalls(subDungeon.right); } }
private void DrawRooms(SubDungeon subDungeon) { if (subDungeon == null) { return; } if (subDungeon.IAmLeaf()) { for (int i = (int)subDungeon.room.x; i < subDungeon.room.xMax; i++) { for (int j = (int)subDungeon.room.y; j < subDungeon.room.yMax; j++) { if (!(i >= subDungeon.removedPiece.x && i <= subDungeon.removedPiece.xMax && j >= subDungeon.removedPiece.y && j <= subDungeon.removedPiece.yMax)) { GameObject instance = Instantiate(GameConfigData.Instance.FloorTiles[(int)Random.Range(0, GameConfigData.Instance.FloorTiles.Length)], new Vector3(i, j, 0f), Quaternion.identity) as GameObject; instance.transform.SetParent(Dungeon.transform.GetChild((int)Tiles.Floors).gameObject.transform); _dungeonFloorPositions[i, j] = instance; _dungeonTiles[i, j] = 1; } } } } else { DrawRooms(subDungeon.left); DrawRooms(subDungeon.right); } }
public void Drawtrashcan(SubDungeon subDungeon) { if (subDungeon == null) { return; } if (subDungeon.IAmLeaf()) { int x; int y; while (true) { x = (int)Random.Range(subDungeon.rect.x, subDungeon.rect.xMax);//현재 방 크기와 건물 크기에 맞춰 랜덤한 위치 선정 y = (int)Random.Range(subDungeon.rect.y, subDungeon.rect.yMax); if (boardPositionsFloor[x, y].tag != building[0].tag) { break; } } GameObject instance = Instantiate(trashcan, new Vector3(x, y, -1f), Quaternion.identity) as GameObject; instance.transform.SetParent(transform); thingPositionsFloor[x, y] = instance; } else { Drawtrashcan(subDungeon.left); Drawtrashcan(subDungeon.right); } }
public void DrawRooms(SubDungeon subDungeon) { if (subDungeon == null) { return; } if (subDungeon.IAmLeaf()) { for (int i = (int)subDungeon.room.x; i < subDungeon.room.xMax; i++) { for (int j = (int)subDungeon.room.y; j < subDungeon.room.yMax; j++) { GameObject instance = Instantiate(floorTile, new Vector3(i, j, 0f), Quaternion.identity) as GameObject; instance.transform.SetParent(transform); boardPositionsFloor[i, j] = instance; if (j == 5 && playerSpawned == false) { GameObject pObj = Instantiate(player, new Vector3(i + 3, j, 0f), Quaternion.identity) as GameObject; playerSpawned = true; boardPositionsFloor[i, j] = pObj; } if (j == 7 && swordSpawned == false) { GameObject sObj = Instantiate(sword, new Vector3(i + 3, j, 0f), Quaternion.identity) as GameObject; swordSpawned = true; boardPositionsFloor[i, j] = sObj; } if (j == 30 && keySpawned == false) { GameObject kObj = Instantiate(key, new Vector3(i, j, 0f), Quaternion.identity) as GameObject; keySpawned = true; boardPositionsFloor[i, j] = kObj; } if (j == 32 && enemySpawned == false) { GameObject eObj = Instantiate(enemy, new Vector3(i, j, 0f), Quaternion.identity) as GameObject; enemySpawned = true; boardPositionsFloor[i, j] = eObj; } if (j >= 55 && flagSpawned == false) { GameObject fObj = Instantiate(flag, new Vector3(i + 5, j, 0f), Quaternion.identity) as GameObject; flagSpawned = true; boardPositionsFloor[i, j] = fObj; } } } } else { DrawRooms(subDungeon.left); DrawRooms(subDungeon.right); } }
public void ListRooms(SubDungeon root, List <SubDungeon> allRooms) { if (root.IAmLeaf()) { Debug.Log("Added Room"); allRooms.Add(root); } else { ListRooms(root.left, allRooms); ListRooms(root.right, allRooms); } }
public void DrawRoomWalls(SubDungeon subDungeon) { if (subDungeon == null) { return; } if (subDungeon.IAmLeaf()) { //first we create holders for the rooms //room prefab GameObject roomParent = Instantiate(_roomHolder, dungeonRoomsParent); DungeonRoom thisRoom = new DungeonRoom(roomParent, dungeonRoomsParent.childCount, subDungeon.room); _dungeonRooms.Add(thisRoom); //wall holder of room prefab Transform roomWallHolder = roomParent.transform.GetChild(2); //room top walls for (int i = (int)subDungeon.room.x + 1; i < subDungeon.room.xMax - 1; i++) { DrawWall(dungeonWalls.top, i, (int)subDungeon.room.yMax - 1, roomWallHolder); } //room bottom walls for (int i = (int)subDungeon.room.x + 1; i < subDungeon.room.xMax - 1; i++) { DrawWall(dungeonWalls.bottom, i, (int)subDungeon.room.y, roomWallHolder); } //room left walls for (int i = (int)subDungeon.room.y + 1; i < subDungeon.room.yMax - 1; i++) { DrawWall(dungeonWalls.left, (int)subDungeon.room.x, i, roomWallHolder); } //room right walls for (int i = (int)subDungeon.room.y + 1; i < subDungeon.room.yMax - 1; i++) { DrawWall(dungeonWalls.right, (int)subDungeon.room.xMax - 1, i, roomWallHolder); } //room corner walls DrawWall(dungeonWalls.topLeftCorner, (int)subDungeon.room.x, (int)subDungeon.room.yMax - 1, roomWallHolder); DrawWall(dungeonWalls.topRightCorner, (int)subDungeon.room.xMax - 1, (int)subDungeon.room.yMax - 1, roomWallHolder); DrawWall(dungeonWalls.bottomLeftCorner, (int)subDungeon.room.x, (int)subDungeon.room.y, roomWallHolder); DrawWall(dungeonWalls.bottomRightCorner, (int)subDungeon.room.xMax - 1, (int)subDungeon.room.y, roomWallHolder); } else { DrawRoomWalls(subDungeon.leftDungeon); DrawRoomWalls(subDungeon.rightDungeon); } }
private void CreateBSP(SubDungeon subDungeon) { if (subDungeon.IAmLeaf()) { if (subDungeon._rect.width > _maxRoomSize || subDungeon._rect.height > _maxRoomSize) // || Random.Range(0.0f, 1.0f) > 0.25) { if (subDungeon.Split(_minRoomSize, _maxRoomSize)) { CreateBSP(subDungeon._right); CreateBSP(subDungeon._left); } } } }
// Szoba rajzolása public void DrawRooms(SubDungeon subDungeon) { if (subDungeon == null) { return; } // ha a rész levél, akkor végigmegy rajza és lerak egységenként egy floorTilet if (subDungeon.IAmLeaf()) { int typeOfRoom; typeOfRoom = Random.Range(0, 2); FurnishInterface furnisher; switch (typeOfRoom) { case 0: furnisher = new LampOnDesk(); break; case 1: furnisher = new ChairBesideDesk(); break; default: furnisher = new LampOnDesk(); break; } furnisher.placeItems(subDungeon.room); GameObject lamp = roomTemplates [Random.Range(0, 2)].lamp; Texture floorTexture = roomTemplates[Random.Range(0, 3)].floorTexture; for (int i = (int)subDungeon.room.x; i < subDungeon.room.xMax; i++) { for (int j = (int)subDungeon.room.y; j < subDungeon.room.yMax; j++) { //GameObject instance = Instantiate (floorTile, new Vector3 (i, j, 0f), Quaternion.Identity) as GameObject; GameObject instance = Instantiate(floorTile, new Vector3(i, 0f, j), Quaternion.Euler(90, 0, 0)) as GameObject; instance.GetComponent <MeshRenderer> ().material.mainTexture = floorTexture; instance.transform.SetParent(transform); boardPositionsFloor [i, j] = instance; } } DrawWallsAround(subDungeon); //Instantiate(lamp,new Vector3((subDungeon.room.x+subDungeon.room.xMax)/2,0f,(subDungeon.room.y+subDungeon.room.yMax)/2),Quaternion.Euler(new Vector3(0,-90,0))); } else //ha nem levél, akkor halad tovább a gyerekeire { DrawRooms(subDungeon.left); DrawRooms(subDungeon.right); } }
public void CreateBSP(SubDungeon subDungeon) { if (subDungeon.IAmLeaf()) { // Si el subdungeon es muy largo if (subDungeon.rect.width > maxRoomSize || subDungeon.rect.height > maxRoomSize || Random.Range(0.0f, 1.0f) > 0.25) { if (subDungeon.Split(minRoomSize, maxRoomSize)) { CreateBSP(subDungeon.left); CreateBSP(subDungeon.right); } } } }
public void SpacePartition(SubDungeon subDungeon) { if (subDungeon.IAmLeaf()) { //split subDungeon if it's large if (subDungeon.rectangle.width > _roomSideSize || subDungeon.rectangle.height > _roomSideSize) { if (subDungeon.Split(_roomSideSize)) { SpacePartition(subDungeon.leftDungeon); SpacePartition(subDungeon.rightDungeon); } } } }
public void CreateBSP(SubDungeon subDungeon) // 트리 만들기 { if (subDungeon.IAmLeaf()) //잎 노드일때 { //나눈 방이 많이 클 시 if (subDungeon.rect.width > maxRoomSize || subDungeon.rect.height > maxRoomSize || Random.Range(0.0f, 1.0f) > 0.25) { if (subDungeon.Split(minRoomSize, maxRoomSize)) { CreateBSP(subDungeon.left); CreateBSP(subDungeon.right); } } } }
public void CreateBSP(SubDungeon subDungeon) { if (subDungeon.IAmLeaf()) // ha a rész levél //ha a rész magassága, vagy szélessége nagyobb mint a maximum megengedett { if (subDungeon.rect.width > maxRoomSize || subDungeon.rect.height > maxRoomSize || Random.Range(0.0f, 1.0f) > 0.25) { //szétválasztható if (subDungeon.Split(minRoomSize, maxRoomSize)) { //szétválasztani és meghívni a gyerekeire is CreateBSP(subDungeon.left); CreateBSP(subDungeon.right); } } } }
private void SpawnEnemies(SubDungeon subDungeon, int dungeonLevel) { if (subDungeon == null) { return; } if (subDungeon.IAmLeaf()) { if (_enemySpawnData.Current <= _enemySpawnData.Max) { int minEnemyNumber = (int)((subDungeon.room.width * subDungeon.room.height) / 8); int enemyNumberForThisRoom = Random.Range(minEnemyNumber, minEnemyNumber + 1); for (int i = 0; i < enemyNumberForThisRoom; i++) { _randomPos = GetRandomPosInRoom(subDungeon.room); // if the randomPos != invalidPos, then spawn the object if (Vector3.Distance(_randomPos, _invalidPos) != 0) { int enemyIndex = 0; do // make sure that there is only one turret in a room { enemyIndex = (int)Random.Range(_enemyIndexes[dungeonLevel, 0], _enemyIndexes[dungeonLevel, 1] + 1); } while (subDungeon.hasTurret && enemyIndex == 2); // check if the room has a turret and new enemy is turret GameObject instance = Instantiate(Enemies[enemyIndex], _randomPos, Quaternion.identity) as GameObject; instance.transform.SetParent(Dungeon.transform.GetChild((int)Objects.Enemies).gameObject.transform); _enemySpawnData.Current++; _objectSpawnPos[(int)_randomPos.x, (int)_randomPos.y] = 1; if (enemyIndex == 2) { subDungeon.hasTurret = true; } } } } } else { SpawnEnemies(subDungeon.left, dungeonLevel); SpawnEnemies(subDungeon.right, dungeonLevel); } }
public void CreateBSP(SubDungeon subDungeon) { // Debug.Log("Splitting sub-dungeon " + subDungeon.debug + ": " + subDungeon.rect); if (subDungeon.IAmLeaf()) { if (subDungeon.rect.width > minRoom || subDungeon.rect.height > minRoom) { if (subDungeon.Split(minRoom)) { // Debug.Log("Splitted sub-dungeon " + subDungeon.debug + " in " // + subDungeon.left.debug + ": " + subDungeon.left.rect + ", " // + subDungeon.right.debug + ": " + subDungeon.right.rect); CreateBSP(subDungeon.left); CreateBSP(subDungeon.right); } } } }
private void CreateBSP(SubDungeon subDungeon) { //Debug.Log("Splitting sub-dungeon " + subDungeon.debugId + ": " + subDungeon.rect); if (subDungeon.IAmLeaf()) { // if the subdungeon is too large if (subDungeon.rect.width > GameConfigData.Instance.MaxRoomSize || subDungeon.rect.height > GameConfigData.Instance.MaxRoomSize || Random.Range(0.0f, 1.0f) > 0.25) { if (subDungeon.Split(GameConfigData.Instance.MinRoomSize, GameConfigData.Instance.MaxRoomSize)) { //Debug.Log ("Splitted sub-dungeon " + subDungeon.debugId + " in " + subDungeon.left.debugId + ": " + subDungeon.left.rect + ", " //+ subDungeon.right.debugId + ": " + subDungeon.right.rect); CreateBSP(subDungeon.left); CreateBSP(subDungeon.right); } } } }
public void CreateBSP(SubDungeon subDungeon) { Debug.Log("Splitting sub-dungeon " + subDungeon.debugId + ": " + subDungeon.rect); if (subDungeon.IAmLeaf()) { if (subDungeon.rect.width > maxRoomSize || subDungeon.rect.height > maxRoomSize || Random.Range(0.0f, 1.0f) > 0.25) { if (subDungeon.Split(minRoomSize, maxRoomSize)) { Debug.Log("Splitted sub-dungeon " + subDungeon.debugId + " in " + subDungeon.left.debugId + ": " + subDungeon.left.rect + ", " + subDungeon.right.debugId + ": " + subDungeon.right.rect); CreateBSP(subDungeon.left); CreateBSP(subDungeon.right); } } } }
public void DrawRooms(SubDungeon subDungeon) { if (subDungeon == null) { return; } if (subDungeon.IAmLeaf()) { for (int i = (int)subDungeon.room.x; i < subDungeon.room.xMax; i++) { for (int j = (int)subDungeon.room.y; j < subDungeon.room.yMax; j++) { GameObject instance; if (i == subDungeon.room.xMax - 1 || j == subDungeon.room.yMax - 1 || i == subDungeon.room.x || j == subDungeon.room.y) { //wall are created elsewhere //instance = Instantiate(outerWallTile, new Vector3(i, j, 10f), Quaternion.identity); instance = Instantiate(floorTile, new Vector3(i, j, 10f), Quaternion.identity); } else { if (playerSpawned == false) // spawn player on first tile { instance = Instantiate(playerGameObj, new Vector3(i, j, 0f), Quaternion.identity); playerSpawned = true; } instance = Instantiate(floorTile, new Vector3(i, j, 10f), Quaternion.identity); } instance.transform.SetParent(transform); boardPositionsFloor[i, j] = instance; } } } else { DrawRooms(subDungeon.left); DrawRooms(subDungeon.right); } }
public void DrawRooms(SubDungeon subDungeon) { if (subDungeon == null) { return; } if (subDungeon.IAmLeaf()) { for (int i = (int)subDungeon.room.x; i < subDungeon.room.xMax; i++) { for (int j = (int)subDungeon.room.y; j < subDungeon.room.yMax; j++) { GameObject instance = Instantiate(floorTile, new Vector3(i, j, 0f), Quaternion.identity) as GameObject; instance.transform.SetParent(transform); boardPositionsFloor[i, j] = instance; RaycastHit2D hit = Physics2D.Raycast(new Vector2(i, j), new Vector2(i, j), 0); //player if (playerSpawn != 1) { if (hit.collider != null && hit.collider.gameObject.tag != "Wall") { Instantiate(Player, new Vector3(Convert.ToInt32((subDungeon.room.xMin + subDungeon.room.xMax) / 2), Convert.ToInt32((subDungeon.room.yMin + subDungeon.room.yMax) / 2), -1f), Quaternion.identity); playerstartPos = new Vector2(Convert.ToInt32((subDungeon.room.xMin + subDungeon.room.xMax) / 2), Convert.ToInt32((subDungeon.room.yMin + subDungeon.room.yMax) / 2)); playerSpawn++; } } } } } else { DrawRooms(subDungeon.left); DrawRooms(subDungeon.right); } }
public void DrawRooms(SubDungeon subDungeon) // 주어진 공간에서 작은 방 만드는 함수 { if (subDungeon == null) { return; } if (subDungeon.IAmLeaf()) // 잎 노드면 공간이 충분히 나눠 졌으므로 방 생성 시작 { for (int i = (int)subDungeon.rect.x; i < subDungeon.rect.xMax; i++) { for (int j = (int)subDungeon.rect.y; j < subDungeon.rect.yMax; j++) { GameObject instance = Instantiate(floorTile, new Vector3(i, j, 1f), Quaternion.identity) as GameObject; instance.transform.SetParent(transform); boardPositionsFloor[i, j] = instance; } } } else { DrawRooms(subDungeon.left); DrawRooms(subDungeon.right); } }
private void DrawRoom(SubDungeon subDungeon) { if (subDungeon == null) { return; } if (subDungeon.IAmLeaf()) { obstacleList = new List <Coord>(); // _room 좌표를 얻어와 장애물 생성에 필요한 좌표를 만들어 준다. for (int x = (int)subDungeon._room.x + 1; x < subDungeon._room.xMax - 1; ++x) { for (int y = (int)subDungeon._room.y + 1; y < subDungeon._room.yMax - 1; ++y) { obstacleList.Add(new Coord(x, y)); } } shuffledArray = new Queue <Coord>(Helper.SuffleArray(obstacleList.ToArray(), seed)); // 장애물 생성 int obstacleCount = 0; for (int i = 0; i < obstacleCount; ++i) { Coord randomCoord = GetRandomCoord(shuffledArray); Vector3 position = new Vector3(randomCoord._x, .5f, randomCoord._y); GameObject obstacle = Instantiate(_obstaclePrefab, position, Quaternion.identity); } // 노드 생성 for (int x = (int)subDungeon._room.x; x < subDungeon._room.xMax; ++x) { for (int y = (int)subDungeon._room.y; y < subDungeon._room.yMax; ++y) { Node room = Instantiate(tile, new Vector3(x, 0, y), Quaternion.Euler(0, 0, 0), transform.Find("Node")); //room.transform.SetParent(transform); room.name = room.name + "||" + x + "::" + y; room.SetNodeType(NodeType.None); SetNodeType(room); room.SetNode(x, y); nodes[x, y] = room; } } // 적 생성 if (totalCount < 15) { for (int i = 0; i < 1; ++i) { Coord randomCoord = GetRandomCoord(shuffledArray); Vector3 position = new Vector3(randomCoord._x, 0, randomCoord._y); Enemy enemy = Instantiate(_enemyPrefab, position, Quaternion.identity, transform.Find("Enemy")); } ++totalCount; } if (_hereStart == false) { _hereStart = true; Coord pos = GetRandomCoord(shuffledArray); Vector3 position = new Vector3(pos._x, 0, pos._y); Player player = Instantiate(_playerPrefab, position, Quaternion.identity); } else if (_hereEnd == false) { _hereEnd = true; Coord pos = GetRandomCoord(shuffledArray); Vector3 position = new Vector3(pos._x, 1, pos._y); GameObject end = Instantiate(_endPrefab, position, Quaternion.identity); } } else { DrawRoom(subDungeon._left); DrawRoom(subDungeon._right); } }
//Отрисовка комнат private void DrawRooms(SubDungeon subdungeon) { if (subdungeon == null) { return; } if (subdungeon.IAmLeaf()) { GameObject toInstantiate; for (int i = (int)subdungeon.room.x; i < subdungeon.room.xMax; i++) { for (int j = (int)subdungeon.room.y; j < subdungeon.room.yMax; j++) { toInstantiate = RandomTile(tiles[activeTileset].floorTiles, 0.15f); if (i == subdungeon.room.x || i == subdungeon.room.xMax - 1 || j == subdungeon.room.y || j == subdungeon.room.yMax - 1) { if (i == subdungeon.room.xMax - 1) { toInstantiate = tiles[activeTileset].wallTiles[2]; } else if (i == subdungeon.room.x) { toInstantiate = tiles[activeTileset].wallTiles[6]; } else if (j == subdungeon.room.y) { toInstantiate = tiles[activeTileset].wallTiles[4]; } else if (j == subdungeon.room.yMax - 1) { toInstantiate = tiles[activeTileset].wallTiles[0]; } if (i == subdungeon.room.xMax - 1 && j == subdungeon.room.yMax - 1) { toInstantiate = tiles[activeTileset].wallTiles[1]; } else if (i == subdungeon.room.xMax - 1 && j == subdungeon.room.y) { toInstantiate = tiles[activeTileset].wallTiles[3]; } else if (i == subdungeon.room.x && j == subdungeon.room.y) { toInstantiate = tiles[activeTileset].wallTiles[5]; } else if (i == subdungeon.room.x && j == subdungeon.room.yMax - 1) { toInstantiate = tiles[activeTileset].wallTiles[7]; } CreateAt(i, j, toInstantiate); } else { if (i > subdungeon.room.x + 1 && i < subdungeon.room.xMax - 2 && j > subdungeon.room.y + 1 && j < subdungeon.room.yMax - 2) { freePositions.Add(new Vector2Int(i, j)); } GameObject instance = CreateAt(i, j, toInstantiate); RandomRotation(instance); } } } } else { DrawRooms(subdungeon.left); DrawRooms(subdungeon.right); } }
public void DrawBuilding(SubDungeon subDungeon) //건물 생성 함수 { hashClear(); //건물 배치가 안되는(너무작은)방일 경우 빠져나가기 위한 해시 배열 초기화 int buildChoice; //랜덤 건물 선택 변수 Rect buildSize; //현재 건물의 사이즈 표시 bool isfull = false; //사이즈가 안되는 건물 표시 int num = 0; if (subDungeon == null) { return; } if (subDungeon.IAmLeaf()) { while (true)//방 사이즈와 건물 사이즈가 맞는지 검사 { num = 0; buildChoice = Random.Range(0, building.Length);//건물 번호 랜덤 생성 if (buildHash[buildChoice] > 0) { continue; //이미 선택된 건물일 경우 다시 검사 } buildHash[buildChoice]++; //현재 건물 번호의 해시 배열 증가 (예) 1번 건물 생성시 hash[1] 1증가 buildSize = building[buildChoice].GetComponent <RectTransform>().rect; //건물 사이즈 저장 if (buildSize.width < subDungeon.rect.width && buildSize.height / 2 < subDungeon.rect.height) { break; //방의 크기에 건물이 들어가면 검사 종료 } for (int i = 0; i < buildHash.Length; i++) { if (buildHash[i] == 0) { num++; //해시 배열 검사 } } if (num > 0) { continue; //아직 모든 건물 확인하지 않았을 시 다시 검사 } if (num == 0) { isfull = true;//모든 건물을 검사했다면 검사 종료 break; } } if (!isfull) //방 사이즈에 맞는 건물이 있을 경우 { int x = (int)Random.Range(subDungeon.rect.x, subDungeon.rect.xMax - buildSize.width); //현재 방 크기와 건물 크기에 맞춰 랜덤한 위치 선정 int y = (int)Random.Range(subDungeon.rect.y, subDungeon.rect.yMax - buildSize.height / 2); GameObject instance = Instantiate(building[buildChoice], new Vector3(x, y, 0f), Quaternion.identity) as GameObject; instance.transform.SetParent(transform); for (int i = x; i < (int)buildSize.width + x; i++)//위치 배열에 건물 정보 추가 { for (int j = y; j < (int)buildSize.height / 2 + y; j++) { boardPositionsFloor[i, j] = instance; } } } } else { DrawBuilding(subDungeon.left); DrawBuilding(subDungeon.right); } }
public void DrawLamp(SubDungeon subDungeon)//가로등 생성 함수 { if (subDungeon == null) { return; } if (!subDungeon.IAmLeaf()) { string rname, buildname, tname;//차도, 건물, 가로등이 같은 구역에 있는지 확인할 변수 rname = vertTile[0].tag; buildname = building[0].tag; tname = streetLamp.tag; if (subDungeon.isline == 1) //가로로 나눴을 경우 { for (int i = (int)subDungeon.line.x; i < subDungeon.line.xMax; i++) // y값 고정 후 x값을 1씩 올려 길을 만듦 { if (i % lampNum == 0) // 가로등을 위 아래 교차해서 생성. { string bname = boardPositionsFloor[i, (int)subDungeon.line.y - 1].tag; //현재 좌표 if (bname != rname && bname != tname && bname != buildname) // 현제 좌표에 도로, 건물, 같은 가로등이 있는가? { GameObject instance = Instantiate(streetLamp, new Vector3(i, subDungeon.line.y - 1, -2), Quaternion.identity) as GameObject; if (!IsNear(instance, lampNum)) // 현재 생성된 가로등의 주위에 다른 가로등이 있는가? { instance.transform.SetParent(transform); thingPositionsFloor[i, (int)subDungeon.line.y - 1] = instance; } else { Destroy(instance); } } } if (i % lampNum == (int)(lampNum / 2))// 가로등을 위 아래 교차해서 생성. { string bname = boardPositionsFloor[i, (int)subDungeon.line.y + 8].tag; if (bname != rname && bname != tname && bname != buildname) { GameObject instance = Instantiate(streetLamp, new Vector3(i, subDungeon.line.y + 8, -2), Quaternion.identity) as GameObject; if (!IsNear(instance, lampNum)) { instance.transform.SetParent(transform); thingPositionsFloor[i, (int)subDungeon.line.y + 8] = instance; } else { Destroy(instance); } } } } } else if (subDungeon.isline == 2) //세로로 나눴을 경우 { for (int i = (int)subDungeon.line.y; i < subDungeon.line.yMax; i++) //x값 고정 후 y값을 1씩 올려 길을 만듦 { if (i % lampNum == 0) //가로등을 좌우로 배치 { string bname = boardPositionsFloor[(int)subDungeon.line.x - 1, i].tag; if (bname != rname && bname != tname && bname != buildname) { GameObject instance = Instantiate(streetLamp, new Vector3(subDungeon.line.x - 1, i, -2), Quaternion.identity) as GameObject; if (!IsNear(instance, lampNum)) { instance.transform.SetParent(transform); thingPositionsFloor[(int)subDungeon.line.x - 1, i] = instance; } else { Destroy(instance); } } } if (i % lampNum == (int)(lampNum / 2))//가로등을 좌우로 배치 { string bname = boardPositionsFloor[(int)subDungeon.line.x + 8, i].tag; if (bname != rname && bname != tname && bname != buildname) { GameObject instance = Instantiate(streetLamp, new Vector3(subDungeon.line.x + 8, i, -2), Quaternion.identity) as GameObject; if (!IsNear(instance, lampNum)) { instance.transform.SetParent(transform); thingPositionsFloor[(int)subDungeon.line.x + 8, i] = instance; } else { Destroy(instance); } } } } } } DrawLamp(subDungeon.left); DrawLamp(subDungeon.right); }
public void DrawLines(SubDungeon subDungeon) //길 까는 함수 { if (subDungeon == null) { return; } if (!subDungeon.IAmLeaf()) // 서브 던전 클래스에 있는 라인에 대한 정보를 이용하여 길을 그림. 방을 나누지 않았으면(즉 잎 노드이면) 이 정보가 없음. { if (subDungeon.isline == 1) //가로로 나눴을 경우 { for (int i = (int)subDungeon.line.x; i < subDungeon.line.xMax; i++) // y값 고정 후 x값을 1씩 올려 길을 만듦 { GameObject instance = Instantiate(horiTile[0], new Vector3(i, subDungeon.line.y, 1f), Quaternion.Euler(0, 180, 180)) as GameObject; instance.transform.SetParent(transform); boardPositionsFloor[i, (int)subDungeon.line.y] = instance; instance = Instantiate(horiTile[1], new Vector3(i, subDungeon.line.y + 1, 1f), Quaternion.identity) as GameObject; instance.transform.SetParent(transform); boardPositionsFloor[i, (int)subDungeon.line.y + 1] = instance; instance = Instantiate(horiTile[1], new Vector3(i, subDungeon.line.y + 2, 1f), Quaternion.identity) as GameObject; instance.transform.SetParent(transform); boardPositionsFloor[i, (int)subDungeon.line.y + 2] = instance; instance = Instantiate(horiTile[2], new Vector3(i, subDungeon.line.y + 3, 1f), Quaternion.identity) as GameObject; instance.transform.SetParent(transform); boardPositionsFloor[i, (int)subDungeon.line.y + 3] = instance; instance = Instantiate(horiTile[1], new Vector3(i, subDungeon.line.y + 4, 1f), Quaternion.identity) as GameObject; instance.transform.SetParent(transform); boardPositionsFloor[i, (int)subDungeon.line.y + 4] = instance; instance = Instantiate(horiTile[1], new Vector3(i, subDungeon.line.y + 5, 1f), Quaternion.identity) as GameObject; instance.transform.SetParent(transform); boardPositionsFloor[i, (int)subDungeon.line.y + 5] = instance; instance = Instantiate(horiTile[0], new Vector3(i, subDungeon.line.y + 6, 1f), Quaternion.identity) as GameObject; instance.transform.SetParent(transform); boardPositionsFloor[i, (int)subDungeon.line.y + 6] = instance; } } else if (subDungeon.isline == 2) //세로로 나눴을 경우 { for (int i = (int)subDungeon.line.y; i < subDungeon.line.yMax; i++) //x값 고정 후 y값을 1씩 올려 길을 만듦 { GameObject instance = Instantiate(vertTile[0], new Vector3(subDungeon.line.x, i, 1f), Quaternion.identity) as GameObject; instance.transform.SetParent(transform); boardPositionsFloor[(int)subDungeon.line.x, i] = instance; instance = Instantiate(vertTile[1], new Vector3(subDungeon.line.x + 1, i, 1f), Quaternion.identity) as GameObject; instance.transform.SetParent(transform); boardPositionsFloor[(int)subDungeon.line.x + 1, i] = instance; instance = Instantiate(vertTile[1], new Vector3(subDungeon.line.x + 2, i, 1f), Quaternion.identity) as GameObject; instance.transform.SetParent(transform); boardPositionsFloor[(int)subDungeon.line.x + 2, i] = instance; instance = Instantiate(vertTile[2], new Vector3(subDungeon.line.x + 3, i, 1f), Quaternion.identity) as GameObject; instance.transform.SetParent(transform); boardPositionsFloor[(int)subDungeon.line.x + 3, i] = instance; instance = Instantiate(vertTile[1], new Vector3(subDungeon.line.x + 4, i, 1f), Quaternion.identity) as GameObject; instance.transform.SetParent(transform); boardPositionsFloor[(int)subDungeon.line.x + 4, i] = instance; instance = Instantiate(vertTile[1], new Vector3(subDungeon.line.x + 5, i, 1f), Quaternion.identity) as GameObject; instance.transform.SetParent(transform); boardPositionsFloor[(int)subDungeon.line.x + 5, i] = instance; instance = Instantiate(vertTile[0], new Vector3(subDungeon.line.x + 6, i, 1f), Quaternion.Euler(180, 0, 180)) as GameObject; instance.transform.SetParent(transform); boardPositionsFloor[(int)subDungeon.line.x + 6, i] = instance; } } Vehicle(subDungeon); } DrawLines(subDungeon.left); // 길을 그린 후 다음 방의 길 연결 DrawLines(subDungeon.right); // 왼쪽 노드 그린 후 오른쪽 노드 길 연결 }