Hey Guys, Long time lurker, needing a bit of help with a procedure generation script. Can't quite figure out the next step to take. Code (CSharp): using UnityEngine; using System.Collections; using System.Collections.Generic; public class cameraAI : MonoBehaviour { public Transform playerPOS; public Transform cameraPOS; public List<GameObject> floorList = new List<GameObject>(); public List<GameObject> wallTopList = new List<GameObject>(); public List<GameObject> wallBottomList = new List<GameObject>(); public List<GameObject> wallLeftList = new List<GameObject>(); public List<GameObject> wallRightList = new List<GameObject>(); private int randomFloor; private int randomWallTop; private int randomWallBottom; private int randomWallRight; private int randomWallLeft; // Use this for initialization void Start () { } // Update is called once per frame void Update () { cameraPOS = Camera.main.transform; if(playerPOS.position.z >= cameraPOS.position.z + 9) { Camera.main.transform.position = new Vector3(cameraPOS.position.x, cameraPOS.position.y, cameraPOS.position.z + 18); if (Physics.Raycast(new Vector3(Camera.main.transform.position.x, 40, Camera.main.transform.position.z), Vector3.down, 50) == false) { RandomizeRoom(); randomWallBottom = 0; CreateRoom(); } } if (playerPOS.position.z <= cameraPOS.position.z - 9) { Camera.main.transform.position = new Vector3(cameraPOS.position.x, cameraPOS.position.y, cameraPOS.position.z - 18); if (Physics.Raycast(new Vector3(Camera.main.transform.position.x, 40, Camera.main.transform.position.z), Vector3.down, 50) == false) { RandomizeRoom(); randomWallTop = 0; CreateRoom(); } } if (playerPOS.position.x >= cameraPOS.position.x + 16) { Camera.main.transform.position = new Vector3(cameraPOS.position.x + 32, cameraPOS.position.y, cameraPOS.position.z); if (Physics.Raycast(new Vector3(Camera.main.transform.position.x, 40, Camera.main.transform.position.z), Vector3.down, 50) == false) { RandomizeRoom(); randomWallLeft = 0; CreateRoom(); } } if (playerPOS.position.x <= cameraPOS.position.x - 16) { Camera.main.transform.position = new Vector3(cameraPOS.position.x - 32, cameraPOS.position.y, cameraPOS.position.z); if (Physics.Raycast(new Vector3(Camera.main.transform.position.x, 40, Camera.main.transform.position.z), Vector3.down, 50) == false) { RandomizeRoom(); randomWallRight = 0; CreateRoom(); } } } void RandomizeRoom() { randomFloor = Random.Range(0, floorList.Count); randomWallTop = Random.Range(0, wallTopList.Count); randomWallBottom = Random.Range(0, wallBottomList.Count); randomWallLeft = Random.Range(0, wallLeftList.Count); randomWallRight = Random.Range(0, wallRightList.Count); } void CreateRoom() { Instantiate(floorList[randomFloor], new Vector3(Camera.main.transform.position.x, 0, Camera.main.transform.position.z), new Quaternion(0, 0, 0, 0)); Instantiate(wallTopList[randomWallTop], new Vector3(Camera.main.transform.position.x, 0, Camera.main.transform.position.z + 9), new Quaternion(0, 0, 0, 0)); Instantiate(wallBottomList[randomWallBottom], new Vector3(Camera.main.transform.position.x, 0, Camera.main.transform.position.z - 9), new Quaternion(0, 0, 0, 0)); Instantiate(wallLeftList[randomWallLeft], new Vector3(Camera.main.transform.position.x - 16, 0, Camera.main.transform.position.z), new Quaternion(0, 0, 0, 0)); Instantiate(wallRightList[randomWallRight], new Vector3(Camera.main.transform.position.x + 16, 0, Camera.main.transform.position.z), new Quaternion(0, 0, 0, 0)); } } Is what I've got so far. Which ensure's I'll always be able to exit the room I generate via the side I entered upon generation. However, if there is already another room above the one I'm yet to generate, I'm unsure how I'd check to make sure that both room's have the door's aligned..
For anyone interested, got it working perfectly! Code (CSharp): using UnityEngine; using System.Collections; using System.Collections.Generic; public class cameraAI : MonoBehaviour { public Transform playerPOS; public Transform cameraPOS; public List<GameObject> floorList = new List<GameObject>(); public List<GameObject> wallTopList = new List<GameObject>(); public List<GameObject> wallBottomList = new List<GameObject>(); public List<GameObject> wallLeftList = new List<GameObject>(); public List<GameObject> wallRightList = new List<GameObject>(); private int randomFloor; private int randomWallTop; private int randomWallBottom; private int randomWallRight; private int randomWallLeft; // Use this for initialization void Start () { } // Update is called once per frame void Update () { cameraPOS = Camera.main.transform; if(playerPOS.position.z >= cameraPOS.position.z + 9) { Camera.main.transform.position = new Vector3(cameraPOS.position.x, cameraPOS.position.y, cameraPOS.position.z + 18); if (Physics.Raycast(new Vector3(Camera.main.transform.position.x, 40, Camera.main.transform.position.z), Vector3.down, 50) == false) { RandomizeRoom(); randomWallBottom = 0; if (Physics.Raycast(new Vector3(Camera.main.transform.position.x, 1, Camera.main.transform.position.z + 18), Vector3.back, 18) == true) { randomWallTop = Random.Range(1, wallTopList.Count); } else { randomWallTop = Random.Range(0, wallTopList.Count); } if (Physics.Raycast(new Vector3(Camera.main.transform.position.x + 32, 1, Camera.main.transform.position.z), Vector3.left, 32) == true) { randomWallRight = Random.Range(1, wallRightList.Count); } else { randomWallRight = Random.Range(0, wallRightList.Count); } if (Physics.Raycast(new Vector3(Camera.main.transform.position.x - 32, 1, Camera.main.transform.position.z), Vector3.right, 32) == true) { randomWallLeft = Random.Range(1, wallLeftList.Count); } else { randomWallLeft = Random.Range(0, wallLeftList.Count); } CreateRoom(); } } if (playerPOS.position.z <= cameraPOS.position.z - 9) { Camera.main.transform.position = new Vector3(cameraPOS.position.x, cameraPOS.position.y, cameraPOS.position.z - 18); if (Physics.Raycast(new Vector3(Camera.main.transform.position.x, 40, Camera.main.transform.position.z), Vector3.down, 50) == false) { RandomizeRoom(); randomWallTop = 0; if (Physics.Raycast(new Vector3(Camera.main.transform.position.x, 1, Camera.main.transform.position.z - 18), Vector3.forward, 18) == true) { randomWallBottom = Random.Range(1, wallBottomList.Count); } else { randomWallBottom = Random.Range(0, wallBottomList.Count); } if (Physics.Raycast(new Vector3(Camera.main.transform.position.x + 32, 1, Camera.main.transform.position.z), Vector3.left, 32) == true) { randomWallRight = Random.Range(1, wallRightList.Count); } else { randomWallRight = Random.Range(0, wallRightList.Count); } if (Physics.Raycast(new Vector3(Camera.main.transform.position.x - 32, 1, Camera.main.transform.position.z), Vector3.right, 32) == true) { randomWallLeft = Random.Range(1, wallLeftList.Count); } else { randomWallLeft = Random.Range(0, wallLeftList.Count); } CreateRoom(); } } if (playerPOS.position.x >= cameraPOS.position.x + 16) { Camera.main.transform.position = new Vector3(cameraPOS.position.x + 32, cameraPOS.position.y, cameraPOS.position.z); if (Physics.Raycast(new Vector3(Camera.main.transform.position.x, 40, Camera.main.transform.position.z), Vector3.down, 50) == false) { RandomizeRoom(); randomWallLeft = 0; if (Physics.Raycast(new Vector3(Camera.main.transform.position.x, 1, Camera.main.transform.position.z + 18), Vector3.back, 18) == true) { randomWallTop = Random.Range(1, wallTopList.Count); } else { randomWallTop = Random.Range(0, wallTopList.Count); } if (Physics.Raycast(new Vector3(Camera.main.transform.position.x + 32, 1, Camera.main.transform.position.z), Vector3.left, 32) == true) { randomWallRight = Random.Range(1, wallRightList.Count); }else { randomWallRight = Random.Range(0, wallRightList.Count); } if (Physics.Raycast(new Vector3(Camera.main.transform.position.x, 1, Camera.main.transform.position.z - 18), Vector3.forward, 18) == true) { randomWallBottom = Random.Range(1, wallBottomList.Count); }else { randomWallBottom = Random.Range(0, wallBottomList.Count); } CreateRoom(); } } if (playerPOS.position.x <= cameraPOS.position.x - 16) { Camera.main.transform.position = new Vector3(cameraPOS.position.x - 32, cameraPOS.position.y, cameraPOS.position.z); if (Physics.Raycast(new Vector3(Camera.main.transform.position.x, 40, Camera.main.transform.position.z), Vector3.down, 50) == false) { RandomizeRoom(); randomWallRight = 0; if (Physics.Raycast(new Vector3(Camera.main.transform.position.x, 1, Camera.main.transform.position.z + 18), Vector3.back, 18) == true) { randomWallTop = Random.Range(1, wallTopList.Count); }else { randomWallTop = Random.Range(0, wallTopList.Count); } if (Physics.Raycast(new Vector3(Camera.main.transform.position.x, 1, Camera.main.transform.position.z - 18), Vector3.forward, 18) == true) { randomWallBottom = Random.Range(1, wallBottomList.Count); }else { randomWallBottom = Random.Range(0, wallBottomList.Count); } if (Physics.Raycast(new Vector3(Camera.main.transform.position.x - 32, 1, Camera.main.transform.position.z), Vector3.right, 32) == true) { randomWallLeft = Random.Range(1, wallLeftList.Count); }else { randomWallLeft = Random.Range(0, wallLeftList.Count); } CreateRoom(); } } } void RandomizeRoom() { randomFloor = Random.Range(0, floorList.Count); randomWallTop = Random.Range(0, wallTopList.Count); randomWallBottom = Random.Range(0, wallBottomList.Count); randomWallLeft = Random.Range(0, wallLeftList.Count); randomWallRight = Random.Range(0, wallRightList.Count); } void CreateRoom() { Instantiate(floorList[randomFloor], new Vector3(Camera.main.transform.position.x, 0, Camera.main.transform.position.z), new Quaternion(0, 0, 0, 0)); Instantiate(wallTopList[randomWallTop], new Vector3(Camera.main.transform.position.x, 0, Camera.main.transform.position.z + 9), new Quaternion(0, 0, 0, 0)); Instantiate(wallBottomList[randomWallBottom], new Vector3(Camera.main.transform.position.x, 0, Camera.main.transform.position.z - 9), new Quaternion(0, 0, 0, 0)); Instantiate(wallLeftList[randomWallLeft], new Vector3(Camera.main.transform.position.x - 16, 0, Camera.main.transform.position.z), new Quaternion(0, 0, 0, 0)); Instantiate(wallRightList[randomWallRight], new Vector3(Camera.main.transform.position.x + 16, 0, Camera.main.transform.position.z), new Quaternion(0, 0, 0, 0)); } }