У меня игра не работает. Пожалуйста, помогите мне исправить мой цикл foreach, который постоянно пропускается [закрыто]C#

Место общения программистов C#
Anonymous
У меня игра не работает. Пожалуйста, помогите мне исправить мой цикл foreach, который постоянно пропускается [закрыто]

Сообщение Anonymous »

Итак, я создаю эту игру на Unity C#. Когда игрок (2D-платформер) касается игрового объекта под названием «Цель», скрипт, прикрепленный к игровому объекту, запускает функцию «SetNewPosition()».
Эта функция должна устанавливать цель. в новое место на экране.
Чтобы убедиться, что игровой объект не перекрывается с другими объектами, например со стенами, я создал еще один игровой объект, который назвал «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.");

}
Это моя функция SetNewPosition(), которую я вызываю, когда игрок касается цели.

Подробнее здесь: https://stackoverflow.com/questions/791 ... -getting-s

Вернуться в «C#»