Функция работает, но сопрограмма нетC#

Место общения программистов C#
Ответить
Anonymous
 Функция работает, но сопрограмма нет

Сообщение Anonymous »

У меня очень странная ошибка: у меня есть функция, которая сбрасывает всю мою комнату. Во-первых, он очищает предыдущие сетки, если они существуют. Затем он генерирует списки списков векторов, которые работают как сетки. Затем он порождает объекты в случайных местах сетки, по крайней мере, на расстоянии одного места друг от друга, а затем делает то же самое и с врагами. Когда я сталкиваюсь с игроком на другом игровом объекте, выполняется эта функция, сбрасывающая комнату. Проблема в том, что когда я заменяю функцию сопрограммой, мои объекты появляются правильно, но мои враги появляются только в определенной области. Я проверил сетку врагов, но, похоже, она работает нормально, и это происходит только тогда, когда функция, сбрасывающая комнату, вызывается после возврата доходности. Он работает правильно, если вызывается перед возвратом доходности. Как я могу это решить? Спасибо.
В следующем видео показана вся проблема:

Вот как враги появляются в функции или в сопрограмме с помощью "roomSpawnerScript.Spawnear()" перед возвратом доходности:

Вот как враги появляются в сопрограмме после возврата доходности:

КОД:
Пустой объект столкновения:

Код: Выделить всё

private void OnTriggerEnter2D(Collider2D collision)
{
if (collision.tag == "Player")
{
StartCoroutine(Siguiente());

}
}

private IEnumerator Siguiente()
{

Color newColor = Color.clear;
while (BlackScreen.GetComponent().color.a < 1)
{
newColor.a += 0.01f;
BlackScreen.GetComponent().color = newColor;
yield return null;
}

scrRoomSpawner roomSpawnerScript = roomSpawner.GetComponent();

foreach (GameObject instancia in roomSpawnerScript.instancias)
{
Destroy(instancia);
}

roomSpawnerScript.Spawnear();
player.transform.position = playerSpawnPos;

yield return new WaitForSeconds(1);

while (BlackScreen.GetComponent().color.a > 0)
{
newColor.a -= 0.01f;
BlackScreen.GetComponent().color = newColor;
yield return null;
}
}
Объект, сбрасывающий комнату (RoomSpawner):

Код: Выделить всё

public class scrRoomSpawner : MonoBehaviour
{
//Variables

public float gridWidth;
public float gridHeight;
public float objectNumber;
public float enemyNumber;

//Objetos

public GameObject bloque;
public GameObject enemy;
public GameObject enviroment;
public GameObject aa;
private List gridObjetos = new List();
private List gridEnemigos = new List();
public List instancias = new List();

// Start is called before the first frame update
void Start()
{
Spawnear();
}

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

}

public void Spawnear()
{

gridObjetos.Clear();
gridEnemigos.Clear();

//Crear grid objetos
for (int x = 0; x < gridWidth; x++)
{
for (int y = 0; y < gridHeight; y++)
{
gridObjetos.Add(new Vector2(x - 7.5f, y - 5.5f));
}
}

//Crear grid enemigos
for (int x = 0; x < gridWidth; x++)
{
for (int y = 0; y < gridHeight; y++)
{
gridEnemigos.Add(new Vector2(x - 7.5f, y - 5.5f));
}
}

//Spawnear objetos
for (int i = 0; i < objectNumber; i++)
{
if (gridObjetos.Count > 0)
{
GameObject objeto = Instantiate(bloque);
objeto.transform.SetParent(enviroment.transform);
instancias.Add(objeto);
objeto.transform.position = gridObjetos[Random.Range(0, gridObjetos.Count)];
Vector2 vectorObjeto = objeto.transform.position;

Vector2 minBound = vectorObjeto - new Vector2(1, 1);
Vector2 maxBound = vectorObjeto + new Vector2(1, 1);

gridObjetos.RemoveAll(v => v.x >= minBound.x && v.x = minBound.y && v.y  

Подробнее здесь: [url]https://stackoverflow.com/questions/79055706/function-works-but-coroutine-doesn%c2%b4t[/url]
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

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