Example #1
0
    public GameObject GenerateWall(bool generateDoor, float length)
    {
        var wallObj = new GameObject();

        SceneManager.MoveGameObjectToScene(wallObj, gameObject.scene);
        Wall mainWall;

        if (generateDoor)
        {
            mainWall = (WallsWithDoor.RandomTake(1).FirstOrDefault() as GameObject).GetComponent <Wall>();
        }
        else
        {
            mainWall = (Walls.RandomTake(1).FirstOrDefault() as GameObject).GetComponent <Wall>();
        }
        if (!mainWall)
        {
            throw new System.Exception("No enough walls.");
        }
        mainWall = Utility.Instantiate(mainWall.gameObject, wallObj).GetComponent <Wall>();

        // Put the main wall to an appropriate position
        if (mainWall.Length > length)
        {
            mainWall.transform.position = Vector3.zero;
        }
        else
        {
            var range = length - mainWall.Length;
            var pos   = UnityEngine.Random.Range(-range / 2, range / 2);
            mainWall.transform.position = new Vector3(0, 0, pos);

            // Fill the rest space
            // Left space
            var  restSpace = length / 2 - mainWall.Length / 2 + pos;
            Wall wall;
AgainLeft:
            wall = Utility.Instantiate(Walls.RandomTake(1).FirstOrDefault() as GameObject, wallObj).GetComponent <Wall>();
            wall.transform.localPosition = new Vector3(0, 0, -length / 2 + restSpace - (wall.Length / 2));
            restSpace -= wall.Length;
            if (restSpace > 0)
            {
                goto AgainLeft;
            }

            restSpace = length / 2 - mainWall.Length / 2 - pos;
AgainRight:
            wall = Utility.Instantiate(Walls.RandomTake(1).FirstOrDefault() as GameObject, wallObj).GetComponent <Wall>();
            wall.transform.localPosition = new Vector3(0, 0, length / 2 - restSpace + (wall.Length / 2));
            restSpace -= wall.Length;
            if (restSpace > 0)
            {
                goto AgainRight;
            }
        }

        return(wallObj);
    }