Home > Software engineering >  How Can I Not Make Points Spawn In The Same Place Twice? (Unity)
How Can I Not Make Points Spawn In The Same Place Twice? (Unity)

Time:11-25

guys so I'm trying to make an endless Map Generator for my 2D grappling Hook Game Kinda like Danis square Game and I was trying to generate a set number of swingable points in certain range to test.

Everything works fine except that some Points overlap each other when spawned So I was wondering how could I prevent this from happening?

Should I change my code or is there any method of spawning things I should try so they don't overlap?



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

public class MapGenerator : MonoBehaviour
{
    public Transform Endpositin;
    public int NumOfSwwingablePoints;
    public GameObject SwinggablePoint;
    public int MinX, MaxX;
    public int MinY, MaxY;
    public int Xpos;
    public int Ypos;
    Vector2 PointPos;
    void Start()
    {
        for (int i = 0; i <= NumOfSwwingablePoints; i  )
        {
            Xpos = Random.Range(MinX, MaxX);
            Ypos = Random.Range(MinY, MaxY);
            PointPos = new Vector2(Xpos, Ypos);
            Instantiate(SwinggablePoint, PointPos, Quaternion.identity);
        }
    }

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


    
}

I have Tried this Method and I have also tried to increase values and giving the points colliders to see if they overlap but none of that works. I have also tried update function, but they just keep spawning, and it never stops

CodePudding user response:

My suggestion is everytime you create a new block then save the position of the block in a list. when next time you create a new block, check the new position with the list.

Here is the code.

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    
    public class MapGenerator : MonoBehaviour
    {
        public Transform Endpositin;
        public int NumOfSwwingablePoints;
        public GameObject SwinggablePoint;
        public int MinX, MaxX;
        public int MinY, MaxY;
        private int Xpos;
        private int Ypos; // this can be private since we use only privatly
        Vector2 PointPos;
    
        List<Vector2> PointPosList = new List<Vector2>();
        void Start()
        {
            for (int i = 0; i < NumOfSwwingablePoints; i  ) // I change <= to < since we start from 0
            {
                Generating();
            }
        }
        void Generating()
        {
            bool foundSamePosition;
            do
            {
                foundSamePosition = false;
                Xpos = Random.Range(MinX, MaxX);
                Ypos = Random.Range(MinY, MaxY);
                PointPos = new Vector2(Xpos, Ypos);
                // finding the generated position is already exist 
                for (int i = 0; i < PointPosList.Count; i  )
                {
                    if (SamePosition(PointPos, PointPosList[i]))
                    {
                        foundSamePosition = true;
                    }
                }
            } while (foundSamePosition);// if we found the position try again

            // if not found, add the new position to a list for next time check 
            PointPosList.Add(PointPos);
            Instantiate(SwinggablePoint, PointPos, Quaternion.identity);
        }
    
        private bool SamePosition(Vector2 v1, Vector2 v2)
        {
            return (v1.x == v2.x && v1.y == v2.y);
        }
    }
  • Related