Exemple #1
0
    // Start is called before the first frame update
    void Start()
    {
        //example we want 1 block to be 4x4 and there to be 2x2 number of blocks
        //n = 4
        //b = 2
        //(n-1)*b+1
        //we would need 7 by 7 tiles to generate this level
        var temp = (size - 1) * blocks + 1;

        //Generate outer walls
        for (int edge1 = -1; edge1 <= temp; edge1++)
        {
            Instantiate(outerTile, new Vector3(edge1 * _tileWidth, 0, -1 * _tileWidth), Quaternion.Euler(0, 90 * Random.Range(0, 4), 0));
            Instantiate(outerTile, new Vector3(edge1 * _tileWidth, 0, temp * _tileWidth), Quaternion.Euler(0, 90 * Random.Range(0, 4), 0));
        }

        for (int edge2 = 0; edge2 < temp; edge2++)
        {
            Instantiate(outerTile, new Vector3(-1 * _tileWidth, 0, edge2 * _tileWidth), Quaternion.Euler(0, 90 * Random.Range(0, 4), 0));
            Instantiate(outerTile, new Vector3(temp * _tileWidth, 0, edge2 * _tileWidth), Quaternion.Euler(0, 90 * Random.Range(0, 4), 0));
        }

        //Generate play area
        for (int i = 0; i < temp; i++)
        {
            for (int j = 0; j < temp; j++)
            {
                GameObject obj;
                Transform  npc_spawn = null;

                if (i % (size - 1) == 0 && j % (size - 1) == 0)
                {
                    obj       = _crossRoadScript.Generate(i, j);
                    npc_spawn = obj.transform.Find("NPC Spawn point");
                }
                else if (i % (size - 1) == 0 || j % (size - 1) == 0)
                {
                    obj       = _roadScript.Generate(i, j);
                    npc_spawn = obj.transform.Find("NPC Spawn point");
                }
                else if ((i % (size - 1) == 1 || j % (size - 1) == 1 || i % (size - 1) == size - 2 ||
                          j % (size - 1) == size - 2) && Random.value > (1 - tavernPercent))
                {
                    obj = _tavernScript.Generate(i, j);
                    // Don't generate NPC on taverns yet, we will do it after the player drinks a beer
                }
                else
                {
                    obj       = _fillerScript.Generate(i, j);
                    npc_spawn = obj.transform.Find("NPC Spawn point");
                }
                // Small hack to refresh the colliders (saw that on internet, no idea if it really working or not)
                obj.SetActive(false);
                obj.SetActive(true);
                //NavigationGraph.AddNodes(obj);
                foreach (Transform child in obj.transform)
                {
                    if (child.CompareTag("GraphNode"))
                    {
                        NavigationGraph.CreateNode(child.position);
                        Destroy(child.gameObject);
                    }
                }
                // Spawn a NPC with 20% chance, could be adjusted if we have a difficulty setting
                // (the issue stated to spawn a fixed amount of NPC, but i think a fixed probability would do the trick too)
                if (Random.Range(0, 4) == 3 && npc_spawn != null)
                {
                    SpawnNPC(npc_spawn.position);
                }
            }
        }
        NavigationGraph.ReGenerateAllLinks();
    }