Объекты появились друг в друге - PullRequest
1 голос
/ 07 мая 2020

У меня есть спавн препятствий для игрока, и когда начинается игра, препятствия появляются друг в друге. Я пытался решить эту проблему с помощью 2d цикла while и Physics, но когда я запустил игру, Unity вылетела. И еще я попробовал через Raycast2D проверить, когда луч сталкивается с каким-то коллайдером, и изменить его положение. Но лучик маленький не всегда работал.

Первый способ

 while (!Physics.CheckBox(pos, BlotPref[1].transform.localScale))
    {
         pos = new Vector2(Random.Range(-1f, 1f), YPosSetter());
    }

Второй способ

 while (hit.collider == null)
    {
        transform.position = new Vector2(Random.Range(-1f, 1f), YPosSetter());
    }

Спаунер

private void SpawnerPaper()
{

    for (int i = 0; i < PlaningSpawn; i++)
    {
        if (rndType <= _dbPaperSpawn)
        {
            var blot = Instantiate(BlotPref[Random.Range(0, BlotPref.Length)], new Vector2(Random.Range(-1f, 1f), Random.Range(30f, 70f)), Quaternion.identity);
            blot.transform.SetParent(paper.transform);
        }
    }
}

1 Ответ

0 голосов
/ 07 мая 2020

одно решение - проверить коллайдер, если препятствия находятся рядом со случайным положением, с помощью Physics2D.OverlapCircleAll и использования Layers :

конечно, препятствия имеют коллайдер ...

private void SpwanerPaper()
{
    for (int i = 0; i < PlaningSpawn; i++)
    {
        if (rndType <= _dbPaperSpawn)
        {
            while (true)
            {
                var position = new Vector2(Random.Range(-1f, 1f), Random.Range(30f, 70f));
                 // i have choosen radius 1f, you could increase it if needed
                Collider2D[] colliders = Physics2D.OverlapCircleAll(position, 1f, obstacleLayer);

                if (colliders.Length == 0)
                {
                    //so no obstacles present, spawn here
                    var blot = Instantiate(BlotPref[Random.Range(0, BlotPref.Length)],
                        position, Quaternion.identity);
                    blot.transform.SetParent(paper.transform);
                    break;// get out while loop
                }

                // so  obstacles within 1m of the player loop again and give new random position

            }
        }

    }
}

Следуя ситуации, вы также можете использовать Physics2D.CircleCastAll

Если вы не знаете Layers, у вас есть обучающее видео на YouTube ЗДЕСЬ

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...