# How to have graphic continuity in my chuncks ?(2d procedural / sprites)

I’m trying to learn how to procedurally create a world in 2d. After some research i did this :

I create a DataWorld.cs a DataChunk.cs and a DataSprite.cs to store all the data and separate Data from graphic creation.
And i create an other script WorldGenerator.cs to actually create the world.

it looks like this :

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

public class WorldGenerator : MonoBehaviour {

public Sprite[] sprites;
public SpriteRenderer sp;
public int chunk_size_x;
public int chunk_size_y;
public int world_size_x;
public int world_size_y;

int _chunkNum = -1;
int _scale;
int _magnitude;
float _power = 1;
int _treshold = 15;
GameObject _chunkGO;

SpriteRenderer spriteClone;

void Start ()
{
_scale = (int)Random.Range(10f,50f);
_magnitude =(int) Random.Range((float)_scale-10, _scale+20);

MakeWorld(world_size_x, world_size_y, chunk_size_x, chunk_size_y);
}

public void MakeWorld(int world_size_x, int world_size_y, int chunk_size_x, int chunk_size_y)
{

DataWorld world = new DataWorld(world_size_x, world_size_y, chunk_size_x, chunk_size_y);

for(int x = 0; x < world_size_x; x++)
{
for(int y = 0; y < world_size_y; y++)
{
MakeChunk(world, chunk_size_x,chunk_size_y);
_chunkGO.transform.position = new Vector3 (world.chunks[x,y].posX, world.chunks[x,y].posY,0) ;

}
}
}

public void MakeChunk(DataWorld world, int chunk_size_x, int chunk_size_y)
{
_chunkNum++;
GameObject chunkGO = new GameObject();
chunkGO.name = "CHUNK" + " " + _chunkNum;
_chunkGO = chunkGO;

for(int x=0; x< chunk_size_x; x++)
{
for(int y = 0; y< chunk_size_y; y++)
{

if(y<PerlinNoise(x/8,0,_scale,_magnitude,_power))
{

spriteClone = (SpriteRenderer)Instantiate(sp, new Vector2(x,y), Quaternion.identity);
spriteClone.transform.parent = chunkGO.transform;
spriteClone.name = "sprite " +x + " , " +y;
world.GetAllChunks().spriteTile[x,y].spr = spriteClone;
world.GetAllChunks().spriteTile[x,y].type = DataSprite.TYPE.BLACK;

}
}

}

for(int x=0; x< chunk_size_x; x++)
{
for(int y = 0; y< chunk_size_y; y++)
{

CheckSpritePos(world.GetAllChunks(),x,y);

}
}
}
int PerlinNoise(int x,int y, float scale, float mag, float power){

float rValue;
rValue=Noise.Noise.GetNoise (((double)x) / scale, ((double)y)/ scale,0);
rValue*=mag;

if(power!=0)
{
rValue=Mathf.Pow( rValue, power);
}

return (int) rValue;
}
``````

But the way i do it all instantiates chunks are the same.
I understand why there are all the same, but i can’t figure out how to make them continue each other base on the PerlinNoise function.

EDIT :

So i fixed the continuity on the axis X by adding

`````` if(y<PerlinNois((x+chunk.posX),0,50,100,1f))
``````

It works fine when i only have one dimension in my world ( i only add chunk along the X axis).
But when i have 2 dimension let say my world size is

• world_size_x =4
• world_size_y =2

I can’t figure out how to add chunk.posY to sample the noise corectly.

``````if(y<PerlinNoise((x+chunk.posX+chunk.posY),0,50,100,1f))
``````

does not work. I did plenty of other test but none of them worked. Where and how do i have to add the chunk.posY ?

EDDIT 2

nevermind after several hour of break i finally had the right brain wave :

`````` if(y+chunk.posY<PerlinNoise((x+chunk.posX),0,50,100,1f))
``````

The Problem is, your chunks don’t know where they are globally… you only feed them local x/y from 0 to chunk_size_x/y-1 … the need to know their position and then add this position to the local one when they sample the noise field.

Also, you don’t seem to use DataChunk at all - your worldgen is doing all the work.