Search Unity

Procedural Generation

Discussion in 'Scripting' started by FeedorFeed, Nov 28, 2015.

  1. FeedorFeed

    FeedorFeed

    Joined:
    Jan 9, 2014
    Posts:
    35
    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):
    1. using UnityEngine;
    2. using System.Collections;
    3. using System.Collections.Generic;
    4.  
    5. public class cameraAI : MonoBehaviour {
    6.     public Transform playerPOS;
    7.     public Transform cameraPOS;
    8.     public List<GameObject> floorList = new List<GameObject>();
    9.     public List<GameObject> wallTopList = new List<GameObject>();
    10.     public List<GameObject> wallBottomList = new List<GameObject>();
    11.     public List<GameObject> wallLeftList = new List<GameObject>();
    12.     public List<GameObject> wallRightList = new List<GameObject>();
    13.     private int randomFloor;
    14.     private int randomWallTop;
    15.     private int randomWallBottom;
    16.     private int randomWallRight;
    17.     private int randomWallLeft;
    18.  
    19.     // Use this for initialization
    20.     void Start () {
    21.  
    22.     }
    23.    
    24.     // Update is called once per frame
    25.     void Update () {
    26.         cameraPOS = Camera.main.transform;
    27.        
    28.         if(playerPOS.position.z >= cameraPOS.position.z + 9)
    29.         {
    30.             Camera.main.transform.position = new Vector3(cameraPOS.position.x, cameraPOS.position.y, cameraPOS.position.z + 18);
    31.             if (Physics.Raycast(new Vector3(Camera.main.transform.position.x, 40, Camera.main.transform.position.z), Vector3.down, 50) == false)
    32.             {  
    33.                 RandomizeRoom();
    34.                 randomWallBottom = 0;
    35.                 CreateRoom();        
    36.             }
    37.         }
    38.         if (playerPOS.position.z <= cameraPOS.position.z - 9)
    39.         {
    40.             Camera.main.transform.position = new Vector3(cameraPOS.position.x, cameraPOS.position.y, cameraPOS.position.z - 18);
    41.             if (Physics.Raycast(new Vector3(Camera.main.transform.position.x, 40, Camera.main.transform.position.z), Vector3.down, 50) == false)
    42.             {
    43.                 RandomizeRoom();
    44.                 randomWallTop = 0;
    45.                 CreateRoom();
    46.             }
    47.         }
    48.         if (playerPOS.position.x >= cameraPOS.position.x + 16)
    49.         {
    50.             Camera.main.transform.position = new Vector3(cameraPOS.position.x + 32, cameraPOS.position.y, cameraPOS.position.z);
    51.             if (Physics.Raycast(new Vector3(Camera.main.transform.position.x, 40, Camera.main.transform.position.z), Vector3.down, 50) == false)
    52.             {
    53.                 RandomizeRoom();
    54.                 randomWallLeft = 0;
    55.                 CreateRoom();                  
    56.             }
    57.         }
    58.         if (playerPOS.position.x <= cameraPOS.position.x - 16)
    59.         {
    60.             Camera.main.transform.position = new Vector3(cameraPOS.position.x - 32, cameraPOS.position.y, cameraPOS.position.z);
    61.             if (Physics.Raycast(new Vector3(Camera.main.transform.position.x, 40, Camera.main.transform.position.z), Vector3.down, 50) == false)
    62.             {
    63.                 RandomizeRoom();
    64.                 randomWallRight = 0;
    65.                 CreateRoom();
    66.             }
    67.         }
    68.     }
    69.  
    70.     void RandomizeRoom()
    71.     {
    72.         randomFloor = Random.Range(0, floorList.Count);
    73.         randomWallTop = Random.Range(0, wallTopList.Count);
    74.         randomWallBottom = Random.Range(0, wallBottomList.Count);
    75.         randomWallLeft = Random.Range(0, wallLeftList.Count);
    76.         randomWallRight = Random.Range(0, wallRightList.Count);
    77.     }
    78.  
    79.     void CreateRoom()
    80.     {
    81.         Instantiate(floorList[randomFloor], new Vector3(Camera.main.transform.position.x, 0, Camera.main.transform.position.z), new Quaternion(0, 0, 0, 0));
    82.         Instantiate(wallTopList[randomWallTop], new Vector3(Camera.main.transform.position.x, 0, Camera.main.transform.position.z + 9), new Quaternion(0, 0, 0, 0));
    83.         Instantiate(wallBottomList[randomWallBottom], new Vector3(Camera.main.transform.position.x, 0, Camera.main.transform.position.z - 9), new Quaternion(0, 0, 0, 0));
    84.         Instantiate(wallLeftList[randomWallLeft], new Vector3(Camera.main.transform.position.x - 16, 0, Camera.main.transform.position.z), new Quaternion(0, 0, 0, 0));
    85.         Instantiate(wallRightList[randomWallRight], new Vector3(Camera.main.transform.position.x + 16, 0, Camera.main.transform.position.z), new Quaternion(0, 0, 0, 0));
    86.     }
    87. }
    88.  
    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..
     
  2. FeedorFeed

    FeedorFeed

    Joined:
    Jan 9, 2014
    Posts:
    35
    For anyone interested, got it working perfectly!

    Code (CSharp):
    1. using UnityEngine;
    2. using System.Collections;
    3. using System.Collections.Generic;
    4.  
    5. public class cameraAI : MonoBehaviour {
    6.     public Transform playerPOS;
    7.     public Transform cameraPOS;
    8.     public List<GameObject> floorList = new List<GameObject>();
    9.     public List<GameObject> wallTopList = new List<GameObject>();
    10.     public List<GameObject> wallBottomList = new List<GameObject>();
    11.     public List<GameObject> wallLeftList = new List<GameObject>();
    12.     public List<GameObject> wallRightList = new List<GameObject>();
    13.     private int randomFloor;
    14.     private int randomWallTop;
    15.     private int randomWallBottom;
    16.     private int randomWallRight;
    17.     private int randomWallLeft;
    18.  
    19.     // Use this for initialization
    20.     void Start () {
    21.  
    22.     }
    23.    
    24.     // Update is called once per frame
    25.     void Update () {
    26.         cameraPOS = Camera.main.transform;
    27.        
    28.         if(playerPOS.position.z >= cameraPOS.position.z + 9)
    29.         {
    30.             Camera.main.transform.position = new Vector3(cameraPOS.position.x, cameraPOS.position.y, cameraPOS.position.z + 18);
    31.             if (Physics.Raycast(new Vector3(Camera.main.transform.position.x, 40, Camera.main.transform.position.z), Vector3.down, 50) == false)
    32.             {  
    33.                 RandomizeRoom();
    34.                 randomWallBottom = 0;
    35.                 if (Physics.Raycast(new Vector3(Camera.main.transform.position.x, 1, Camera.main.transform.position.z + 18), Vector3.back, 18) == true)
    36.                 {
    37.                     randomWallTop = Random.Range(1, wallTopList.Count);
    38.                 }
    39.                 else { randomWallTop = Random.Range(0, wallTopList.Count); }
    40.                 if (Physics.Raycast(new Vector3(Camera.main.transform.position.x + 32, 1, Camera.main.transform.position.z), Vector3.left, 32) == true)
    41.                 {
    42.                     randomWallRight = Random.Range(1, wallRightList.Count);
    43.                 }
    44.                 else { randomWallRight = Random.Range(0, wallRightList.Count); }
    45.                 if (Physics.Raycast(new Vector3(Camera.main.transform.position.x - 32, 1, Camera.main.transform.position.z), Vector3.right, 32) == true)
    46.                 {
    47.                     randomWallLeft = Random.Range(1, wallLeftList.Count);
    48.                 }
    49.                 else { randomWallLeft = Random.Range(0, wallLeftList.Count); }
    50.                 CreateRoom();        
    51.             }
    52.         }
    53.         if (playerPOS.position.z <= cameraPOS.position.z - 9)
    54.         {
    55.             Camera.main.transform.position = new Vector3(cameraPOS.position.x, cameraPOS.position.y, cameraPOS.position.z - 18);
    56.             if (Physics.Raycast(new Vector3(Camera.main.transform.position.x, 40, Camera.main.transform.position.z), Vector3.down, 50) == false)
    57.             {
    58.                 RandomizeRoom();
    59.                 randomWallTop = 0;
    60.                 if (Physics.Raycast(new Vector3(Camera.main.transform.position.x, 1, Camera.main.transform.position.z - 18), Vector3.forward, 18) == true)
    61.                 {
    62.                     randomWallBottom = Random.Range(1, wallBottomList.Count);
    63.                 }
    64.                 else { randomWallBottom = Random.Range(0, wallBottomList.Count); }
    65.                 if (Physics.Raycast(new Vector3(Camera.main.transform.position.x + 32, 1, Camera.main.transform.position.z), Vector3.left, 32) == true)
    66.                 {
    67.                     randomWallRight = Random.Range(1, wallRightList.Count);
    68.                 }
    69.                 else { randomWallRight = Random.Range(0, wallRightList.Count); }
    70.                 if (Physics.Raycast(new Vector3(Camera.main.transform.position.x - 32, 1, Camera.main.transform.position.z), Vector3.right, 32) == true)
    71.                 {
    72.                     randomWallLeft = Random.Range(1, wallLeftList.Count);
    73.                 }
    74.                 else { randomWallLeft = Random.Range(0, wallLeftList.Count); }
    75.                 CreateRoom();
    76.             }
    77.         }
    78.         if (playerPOS.position.x >= cameraPOS.position.x + 16)
    79.         {
    80.             Camera.main.transform.position = new Vector3(cameraPOS.position.x + 32, cameraPOS.position.y, cameraPOS.position.z);
    81.             if (Physics.Raycast(new Vector3(Camera.main.transform.position.x, 40, Camera.main.transform.position.z), Vector3.down, 50) == false)
    82.             {
    83.                 RandomizeRoom();
    84.                 randomWallLeft = 0;
    85.                 if (Physics.Raycast(new Vector3(Camera.main.transform.position.x, 1, Camera.main.transform.position.z + 18), Vector3.back, 18) == true)
    86.                 {
    87.                     randomWallTop = Random.Range(1, wallTopList.Count);
    88.                 }
    89.                 else { randomWallTop = Random.Range(0, wallTopList.Count); }
    90.                 if (Physics.Raycast(new Vector3(Camera.main.transform.position.x + 32, 1, Camera.main.transform.position.z), Vector3.left, 32) == true)
    91.                 {
    92.                     randomWallRight = Random.Range(1, wallRightList.Count);
    93.                 }else { randomWallRight = Random.Range(0, wallRightList.Count); }
    94.                 if (Physics.Raycast(new Vector3(Camera.main.transform.position.x, 1, Camera.main.transform.position.z - 18), Vector3.forward, 18) == true)
    95.                 {
    96.                     randomWallBottom = Random.Range(1, wallBottomList.Count);
    97.                 }else { randomWallBottom = Random.Range(0, wallBottomList.Count); }
    98.                 CreateRoom();                  
    99.             }
    100.         }
    101.         if (playerPOS.position.x <= cameraPOS.position.x - 16)
    102.         {
    103.             Camera.main.transform.position = new Vector3(cameraPOS.position.x - 32, cameraPOS.position.y, cameraPOS.position.z);
    104.             if (Physics.Raycast(new Vector3(Camera.main.transform.position.x, 40, Camera.main.transform.position.z), Vector3.down, 50) == false)
    105.             {
    106.                 RandomizeRoom();
    107.                 randomWallRight = 0;
    108.  
    109.                 if (Physics.Raycast(new Vector3(Camera.main.transform.position.x, 1, Camera.main.transform.position.z + 18), Vector3.back, 18) == true)
    110.                 {
    111.                     randomWallTop = Random.Range(1, wallTopList.Count);
    112.                 }else { randomWallTop = Random.Range(0, wallTopList.Count); }
    113.  
    114.                 if (Physics.Raycast(new Vector3(Camera.main.transform.position.x, 1, Camera.main.transform.position.z - 18), Vector3.forward, 18) == true)
    115.                 {
    116.                     randomWallBottom = Random.Range(1, wallBottomList.Count);
    117.                 }else { randomWallBottom = Random.Range(0, wallBottomList.Count); }
    118.  
    119.                 if (Physics.Raycast(new Vector3(Camera.main.transform.position.x - 32, 1, Camera.main.transform.position.z), Vector3.right, 32) == true)
    120.                 {
    121.                     randomWallLeft = Random.Range(1, wallLeftList.Count);
    122.                 }else { randomWallLeft = Random.Range(0, wallLeftList.Count); }
    123.  
    124.                 CreateRoom();
    125.             }
    126.         }
    127.     }
    128.  
    129.     void RandomizeRoom()
    130.     {
    131.         randomFloor = Random.Range(0, floorList.Count);
    132.         randomWallTop = Random.Range(0, wallTopList.Count);
    133.         randomWallBottom = Random.Range(0, wallBottomList.Count);
    134.         randomWallLeft = Random.Range(0, wallLeftList.Count);
    135.         randomWallRight = Random.Range(0, wallRightList.Count);
    136.     }
    137.  
    138.     void CreateRoom()
    139.     {
    140.         Instantiate(floorList[randomFloor], new Vector3(Camera.main.transform.position.x, 0, Camera.main.transform.position.z), new Quaternion(0, 0, 0, 0));
    141.         Instantiate(wallTopList[randomWallTop], new Vector3(Camera.main.transform.position.x, 0, Camera.main.transform.position.z + 9), new Quaternion(0, 0, 0, 0));
    142.         Instantiate(wallBottomList[randomWallBottom], new Vector3(Camera.main.transform.position.x, 0, Camera.main.transform.position.z - 9), new Quaternion(0, 0, 0, 0));
    143.         Instantiate(wallLeftList[randomWallLeft], new Vector3(Camera.main.transform.position.x - 16, 0, Camera.main.transform.position.z), new Quaternion(0, 0, 0, 0));
    144.         Instantiate(wallRightList[randomWallRight], new Vector3(Camera.main.transform.position.x + 16, 0, Camera.main.transform.position.z), new Quaternion(0, 0, 0, 0));
    145.     }
    146. }
    147.