Эта функция должна устанавливать цель. в новое место на экране.
Чтобы убедиться, что игровой объект не перекрывается с другими объектами, например со стенами, я создал еще один игровой объект, который назвал «SpawnableZone». Я назначил ему коллайдер Polygon и отредактировал его, чтобы он покрывал область, подходящую для размещения моей цели.
Для этого я использую цикл while. На каждой итерации задается новая позиция для цели. Затем я проверяю с помощью Physics2D.OverlapCircleAll, касается ли цель коллайдера gameObject SpawnableZone.
Однако я обнаружил, что цикл foreach, отвечающий за проверку того, правильно ли я получил коллайдер, просто пропускается в коде. Он не проходит, и поэтому я никогда не могу найти подходящую позицию для цели. Цикл был бы бесконечным, если бы я не установил безопасный предел для максимального количества попыток/итераций.
Странно то, что я вызываю эту функцию не только всякий раз, когда игрок достигает цели, но и в функции Start(). В функции Start он работает отлично, но не тогда, когда я вызываю его из функции OnTriggerEnter2D.
Код: Выделить всё
public void SetNewPosition()
{
float maxAttempts = 100;
float attemptCount = 0;//Set a limit so no infinite loop is created
int spawnZoneLayerMask = LayerMask.GetMask("SpawnZone");//get the layer mask to check on for collision
bool isTouching = false;
while(!isTouching && (attemptCount < maxAttempts)) //condition: !isTouching means no fitting position is found yet
{
attemptCount++;//make sure not to have too many attempts
transform.position = new Vector3(Random.Range(-8.3f, 8.3f), Random.Range(-4.3f, 4.3f), 0);
//create new position for gameObject
Collider2D[] hitColliders = Physics2D.OverlapCircleAll(transform.position, 3f, spawnZoneLayerMask);
//get all colliders in range
foreach (Collider2D coll in hitColliders)
{
//check every collider in range
if (coll.gameObject.name == "SpawnableZone")//the gameObject is supposed to be in the collider of the
{ // gameObject called "SpawnableZone"
isTouching = true; //make sure while loop stops
Debug.Log("New Position found at " + transform.position + " after " + attemptCount + " attempts.");
break; //exit while loop after a fitting position is found
}
}
if(isTouching)
break; //extra check for exiting loop
}
if(!isTouching)
Debug.Log("No new Position found with " + attemptCount + " attempts.");
}
Подробнее здесь: https://stackoverflow.com/questions/791 ... -getting-s