- Home /
Question by
tsapapolis · Jul 12, 2021 at 01:08 PM ·
2dtilemapmapendless
How to make endless 2D map in every direction
With the script I got, I can go to the right and it will never end, I can go up and it'll be endless too etc. but when I go somewhere and try to change direction, it's not working.
using System.Collections.Generic;
using System.Collections;
using UnityEngine;
public class LevelGenerator : MonoBehaviour
{
private const float PLAYER_DISTANCE_SPAWN_LEVEL_PART = 100f;
[SerializeField] private Transform levelPart_Start;
[SerializeField] private List<Transform> levelPartList;
[SerializeField] private Transform player;
private Vector3 lastRightPosition;
private Vector3 lastUpPosition;
private Vector3 lastLeftPosition;
private Vector3 lastDownPosition;
private Vector3 playerPosition;
private void Awake()
{
lastRightPosition = levelPart_Start.Find("RightPosition").position;
lastUpPosition = levelPart_Start.Find("UpPosition").position;
lastLeftPosition = levelPart_Start.Find("LeftPosition").position;
lastDownPosition = levelPart_Start.Find("DownPosition").position;
}
private void Update()
{
playerPosition = player.Find("Player").position;
if (Vector3.Distance(playerPosition, lastRightPosition) < PLAYER_DISTANCE_SPAWN_LEVEL_PART)
{
SpawnLevelPartRight();
}
if (Vector3.Distance(playerPosition, lastUpPosition) < PLAYER_DISTANCE_SPAWN_LEVEL_PART)
{
SpawnLevelPartUp();
}
if (Vector3.Distance(playerPosition, lastLeftPosition) < PLAYER_DISTANCE_SPAWN_LEVEL_PART)
{
SpawnLevelPartLeft();
}
if (Vector3.Distance(playerPosition, lastDownPosition) < PLAYER_DISTANCE_SPAWN_LEVEL_PART)
{
SpawnLevelPartDown();
}
}
private void SpawnLevelPartRight()
{
Transform chosenLevelPart = levelPartList[Random.Range(0, levelPartList.Count)];
Transform lastLevelPartTransform = SpawnLevelPart(chosenLevelPart, lastRightPosition);
lastRightPosition = lastLevelPartTransform.Find("RightPosition").position;
}
private void SpawnLevelPartUp()
{
Transform chosenLevelPart = levelPartList[Random.Range(0, levelPartList.Count)];
Transform lastLevelPartTransform = SpawnLevelPart(chosenLevelPart, lastUpPosition);
lastUpPosition = lastLevelPartTransform.Find("UpPosition").position;
}
private void SpawnLevelPartLeft()
{
Transform chosenLevelPart = levelPartList[Random.Range(0, levelPartList.Count)];
Transform lastLevelPartTransform = SpawnLevelPart(chosenLevelPart, lastLeftPosition);
lastLeftPosition = lastLevelPartTransform.Find("LeftPosition").position;
}
private void SpawnLevelPartDown()
{
Transform chosenLevelPart = levelPartList[Random.Range(0, levelPartList.Count)];
Transform lastLevelPartTransform = SpawnLevelPart(chosenLevelPart, lastDownPosition);
lastDownPosition = lastLevelPartTransform.Find("DownPosition").position;
}
private Transform SpawnLevelPart(Transform levelPart, Vector3 spawnPosition)
{
Transform levelPartTransform = Instantiate(levelPart, spawnPosition, Quaternion.identity);
return levelPartTransform;
}
}
Comment
Answer by yusufa26 · Oct 31, 2021 at 11:12 AM
Hi
The problem is updating the last level position only in one direction when spawning a new level part. Last positions should be updated in every direction.
For example:
private void SpawnLevelPartRight()
{
Transform chosenLevelPart = levelPartList[Random.Range(0, levelPartList.Count)];
Transform lastLevelPartTransform = SpawnLevelPart(chosenLevelPart, lastRightPosition);
lastRightPosition = lastLevelPartTransform.Find("RightPosition").position;
lastUpPosition = lastLevelPartTransform.Find("UpPosition").position;
lastLeftPosition = lastLevelPartTransform.Find("LeftPosition").position;
lastDownPosition = lastLevelPartTransform.Find("DownPosition").position;
}
I don't know how the game design is (whether if player can move diagonal or vertical/horizontal only etc.) but diagonal movements of the player will still be a problem with this approach. I think this approach would fits better for games that levels flow in vertical-horizontal directions only.
Thank you, have a nice day.