Reducing loading time with Instantiate?

hi there…
i found a little bug in my dummy code, wich i need to use for testing the loading of a level.

    using UnityEngine;
    using System.Collections;
     
    public class Map_Loader : MonoBehaviour {
       
        public int scrollspeed = 10;
        public int zoomspeed = 20;
        public int rotatespeed = 5;
       
        public int mapsize_x = 50;
        public int mapsize_y = 50;
       
        public GameObject selfObject;
        public GameObject kamera;
        public GameObject kamera_view;
        public GameObject DirtBlock;
        public GameObject DirtStraight;
        public GameObject DirtInnerCurver;
        public GameObject DirtOuterCurver;
        public GameObject DirtRoof;
        public GameObject DirtGold;
        public GameObject DirtDitrima;
        public GameObject DirtFloor;
        
        public int generateChunkSize = 16;
       
        // Use this for initialization
        void Start () {      
            StartCoroutine(createMap());
            
            kamera.transform.position = new Vector3(((mapsize_x/2)*size.x), 0, ((mapsize_y/2)*size.x));
        }
        
        IENumerator createMap() {
        	MeshFilter mf = DirtBlock.GetComponent(typeof(MeshFilter)) as MeshFilter;
            if (mf == null){return;}
            Mesh mesh = mf.sharedMesh;
            if (mesh == null){return;}
            Vector3 size = mesh.bounds.size;
           
            int maprun_x = 0;
            int maprun_y = 0;
            float pos_x = 0;
            float pos_y = 0;
            for(maprun_y=0; maprun_y<mapsize_y+1; maprun_y++){
                for(maprun_x=0; maprun_x<mapsize_x+1; maprun_x++){
                    pos_x = maprun_x*size.x;
                    pos_y = maprun_y*size.z;
                    GameObject created_block = Instantiate(DirtRoof, new Vector3(pos_x, 0, pos_y), Quaternion.identity) as GameObject;
                    created_block.transform.parent = selfObject.transform;
                    created_block.name = "DirtBlock_"+maprun_x+"/"+maprun_y;
                    Debug.Log(created_block.name+" created!");
                    
                    // yield return 0 = the same as wait(1) in 3DGS ;)
                    if((maprun_y * (mapsize_y+1)) + maprun_x >= (generateChunkSize * generateChunkSize)) { yield return 0; }
                }
            }
        }
       
        // Update is called once per frame
        void Update () {
            if(Input.mousePosition.x < 10)
            {kamera.transform.Translate(-scrollspeed*Time.deltaTime,0,0);}
            else if(Input.mousePosition.x > Screen.width-10)
            {kamera.transform.Translate(scrollspeed*Time.deltaTime,0,0);}
           
            if(Input.mousePosition.y < 10)
            {kamera.transform.Translate(0,0,-scrollspeed*Time.deltaTime);}
            else if(Input.mousePosition.y > Screen.height-10)
            {kamera.transform.Translate(0,0,scrollspeed*Time.deltaTime);}
           
            if(Input.GetKey(KeyCode.End)  kamera_view.camera.fieldOfView < 70) // back
            {kamera_view.camera.fieldOfView += zoomspeed*Time.deltaTime;}
            else if(Input.GetKey(KeyCode.Home)  kamera_view.camera.fieldOfView > 30) // forward
            {kamera_view.camera.fieldOfView -= zoomspeed*Time.deltaTime;}
            else if(Input.GetAxis("Mouse ScrollWheel") < 0  kamera_view.camera.fieldOfView < 70) // back
            {kamera_view.camera.fieldOfView += zoomspeed*3*Time.deltaTime;}
            else if(Input.GetAxis("Mouse ScrollWheel") > 0  kamera_view.camera.fieldOfView > 30) // forward
            {kamera_view.camera.fieldOfView -= zoomspeed*3*Time.deltaTime;}
           
            if(Input.GetKey(KeyCode.Delete))
            {kamera.transform.Rotate(new Vector3(0,-rotatespeed*Time.deltaTime,0));}
            else if(Input.GetKey(KeyCode.PageDown))
            {kamera.transform.Rotate(new Vector3(0,rotatespeed*Time.deltaTime,0));}
           
           
           
            kamera.transform.position = new Vector3(kamera.transform.position.x, 0, kamera.transform.position.z);
        }
    }

The problem is the for-loop i think. When the level has a size of 100x100 tiles, the loading time is around 2 minutes. Even if i use a 2 Polygon Tile with 1 texture ..
Is here a way to reduce that loading time? Cause the maximum level size is 320x320 .
. And Unity hangs up while loading that levels…

Do you really need to create those only at startup? Is there any chance you could do that already in the editor using different scenes?
If yes, I strongly recommend to use a simple Editor script which will help you to define all the variables and then have the tiles being created.

If that is not possible you may try to pool all the assets, meaning you create them in Edit mode and just change their position during runtime to make them appear in their correct position.

The problem is that as far as I know Instantiate() is actually blocking the whole Unity thread, Unity cannot continue until all your operations in Start() are done.

There´s not really a way to use Scenes for the levels. I need to load each one individually at Mapstart.
Creating them at runtime is not possible, cause then i need to change every model according to its ID to another one (52 different Block models) - that´s why i want to create them on the fly.

i added a new code above with a Chunk System from Helghast. The loading time for 320*320 tiles is still immense (8-10 Minutes) ._.