Search code examples
c#for-loopunity-game-engineinstantiationminecraft

Instantiate inside nested for loops does not do what it is intended to


I have been working on a minecraft clone game in Unity 2017.3 and C# and i started all right but when i worked on the super flat world generation system there began a problem. Inside the World mono behaviour, in the Generate void, there are three nested for loops which should generate a new dirt block on every possible position between 0 and 5

But it only makes a line of dirt block stretching along the Z axis.

Here is the code for PlaceableItem(attached to dirtPrefab) and World(attached to World)

Placeable Item class

using UnityEngine;
using System.Collections;

public class PlaceableItem : MonoBehaviour
{

    public string nameInInventory = "Unnamed Block";
    public int maxStack = 64;

    public bool destructible = true;
    public bool explodesOnX = false;
    public bool abidesGravity = false;
    public bool isContainer = false;
    public bool canBeSleptOn = false;
    public bool dropsSelf = false;

    private Rigidbody rb;

    // Use this for initialization
    void Start()
    {
        rb = GetComponent<Rigidbody>();
    }

    // Update is called once per frame
    void Update()
    {
        if (abidesGravity) {
            rb.useGravity = true;
        } else {
            rb.useGravity = false;
        }
    }

    private void OnDestroy()
    {
        if (dropsSelf) {
            //Drop this gameObject
        }
    }

    public void Explode() {
        if (!explodesOnX)
            return;
    }

    public void OnMouseDown()
    {
        if (isContainer && !canBeSleptOn) {
            //Open the container inventory
        } else if (canBeSleptOn && !isContainer) {
            //Make the character sleep on the item
        }
    }

    private void OnMouseOver()
    {
        if (Input.GetMouseButtonDown(1) && destructible) {
            Destroy(gameObject);
        }
    }

}

World class

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class World : MonoBehaviour {

    public GameObject dirtPrefab;

    public bool generateAutomatically = true; 

    // Use this for initialization
    void Start () {
        if (generateAutomatically) {
            Generate();
        }
    }

    // Update is called once per frame
    void Update () {

    }

    void Generate() {
        for (int x = 0; x <= 5; x++) {
            for (int y = 0; y <= 5; y++) {
                for (int z = 0; z <= 5; z++) {
                    Instantiate(dirtPrefab, new Vector3(x, y, z), Quaternion.identity);
                }
            }
        }
    }

    void RemoveAllBlocks() {
        foreach (PlaceableItem placeableItem in GetComponentsInChildren<PlaceableItem>()) {
            Destroy(placeableItem.gameObject);
        }
    }
}

Thanks in advance, fellow developers! Hope this is not a stupid question!


Solution

  • [SOLVED] I realised i had a recttransform somehow attached to my dirt prefab. Removing it and adding a transform instead helped.