Перемещение объекта случайным образом без его нахождения внутри стены - Unity 5 - PullRequest
0 голосов
/ 01 июня 2018

Я пытаюсь сделать так, чтобы некоторые типы пикапов появлялись в заданной области, хотя некоторые обычно застревали в стенах, как бы я это исправил?

Код, о котором идет речь, для движущихся объектов

for (int x = 0; x < garbage.Length; x++) 
{
    if (x < 5)
    {
        garbage[x].transform.position = new Vector3(Random.Range(-33.0f, 30.0f), 2.35f, Random.Range(30.0f, -35.0f)); 
    }
}

Исправлено с помощью Physics.OverlapSphere.Спасибо.

Ответы [ 2 ]

0 голосов
/ 01 июня 2018

Вы можете попробовать OnCollisionStay справиться с этим при столкновениях.OnCollisionStay может быть очень тяжелым, если не использовать его осторожно, поэтому вы можете подумать о лучшем способе, если можете.

Вам нужно будет создать новый скрипт, используя следующий код, который вы прикрепите к своему префабу при включении.

bool keepChecking = true;
void OnCollisionStay(Collision collision)
{
    if(keepChecking)
    {
        if(collision.gameobject.tag == "Wall")
        {
            collision.gameobject.transform.position = new Vector3(Random.Range(-33.0f, 30.0f), 2.35f, Random.Range(30.0f, -35.0f));
        }
        else
        {
             keepChecking = false;
        }
     }
}

https://docs.unity3d.com/ScriptReference/Collider.OnCollisionStay.html

Прочитайте этоссылка и убедитесь, что ваши объекты имеют все требования.Ваша стена и Power-Up должны иметь коллайдеры, и по крайней мере один из этих двух должен иметь твердое тело.Ни один из этих объектов не должен быть кинематическим.

Дайте мне знать, если это работает для вас.

0 голосов
/ 01 июня 2018

Внутри оператора if может быть цикл while, поэтому он будет выглядеть как

int attempts = 0;
while(garbage[x].transform.position == /*[the range of coordinates for the wall]*/ || attempts = 0)
{
    garbage[x].transform.position = new Vector3(Random.Range(-33.0f, 30.0f), 2.35f, Random.Range(30.0f, -35.0f));
    attempts += 1;
} 
...