теперь это не влияет на сопрограмму. когда я запускаю игру, и флаг bool spawn имеет значение false или true, если я меняю его во время выполнения, это не меняет сопрограмму. если сопрограмма уже работает, она не остановит ее, а если она не работает, она не запустит ее.
Я пытался использовать для этого oldSpawn, но, возможно, это неправильный способ ее использования. ?
using System.Collections;
using UnityEngine;
using UnityEngine.PlayerLoop;
public class SpawnObjects : MonoBehaviour
{
[Header("Prefabs To Spawn")]
public GameObject prefabToSpawn;
[Header("Terrain Settings")]
public Terrain terrain;
public GameObject spawnedTerrainObjectsParent;
[Header("Spawn Settings")]
public bool spawn = false;
public int numberOfObjects = 100;
public float duration = 1.0f;
public float yOffset = 0.5f;
public bool isParent = true;
private float terrainWidth, terrainLength;
private float xTerrainPos, zTerrainPos;
private float yValTerrain, randXTerrain, randZTerrain;
private bool oldSpawn;
void Awake()
{
oldSpawn = spawn;
if (terrain != null)
{
terrainWidth = terrain.terrainData.size.x;
terrainLength = terrain.terrainData.size.z;
xTerrainPos = terrain.transform.position.x;
zTerrainPos = terrain.transform.position.z;
if (isParent && spawnedTerrainObjectsParent == null)
{
spawnedTerrainObjectsParent = new GameObject("Spawned Terrain Parent");
}
}
if(spawn)
{
StartCoroutine(Generate());
}
}
private void Update()
{
if(oldSpawn != spawn)
{
if(spawn)
{
StopCoroutine(Generate());
StartCoroutine(Generate());
}
else
{
StopCoroutine(Generate());
}
oldSpawn = spawn;
}
}
private IEnumerator Generate()
{
for (int i = 0; i < numberOfObjects; i++)
{
randXTerrain = UnityEngine.Random.Range(xTerrainPos, xTerrainPos + terrainWidth);
randZTerrain = UnityEngine.Random.Range(zTerrainPos, zTerrainPos + terrainLength);
yValTerrain = terrain.SampleHeight(new Vector3(randXTerrain, 0, randZTerrain)) + yOffset;
GameObject objInstance = Instantiate(prefabToSpawn, new Vector3(randXTerrain, yValTerrain, randZTerrain), Quaternion.identity, spawnedTerrainObjectsParent.transform);
objInstance.name = "Terrain Spawned";
yield return new WaitForSeconds(duration);
}
}
}
Подробнее здесь: https://stackoverflow.com/questions/783 ... en-true-in
Как остановить сопрограмму, если флаг bool имеет значение false, и перезапустить ее, если значение true в обновлении? ⇐ C#
Место общения программистов C#
1713557465
Anonymous
теперь это не влияет на сопрограмму. когда я запускаю игру, и флаг bool spawn имеет значение false или true, если я меняю его во время выполнения, это не меняет сопрограмму. если сопрограмма уже работает, она не остановит ее, а если она не работает, она не запустит ее.
Я пытался использовать для этого oldSpawn, но, возможно, это неправильный способ ее использования. ?
using System.Collections;
using UnityEngine;
using UnityEngine.PlayerLoop;
public class SpawnObjects : MonoBehaviour
{
[Header("Prefabs To Spawn")]
public GameObject prefabToSpawn;
[Header("Terrain Settings")]
public Terrain terrain;
public GameObject spawnedTerrainObjectsParent;
[Header("Spawn Settings")]
public bool spawn = false;
public int numberOfObjects = 100;
public float duration = 1.0f;
public float yOffset = 0.5f;
public bool isParent = true;
private float terrainWidth, terrainLength;
private float xTerrainPos, zTerrainPos;
private float yValTerrain, randXTerrain, randZTerrain;
private bool oldSpawn;
void Awake()
{
oldSpawn = spawn;
if (terrain != null)
{
terrainWidth = terrain.terrainData.size.x;
terrainLength = terrain.terrainData.size.z;
xTerrainPos = terrain.transform.position.x;
zTerrainPos = terrain.transform.position.z;
if (isParent && spawnedTerrainObjectsParent == null)
{
spawnedTerrainObjectsParent = new GameObject("Spawned Terrain Parent");
}
}
if(spawn)
{
StartCoroutine(Generate());
}
}
private void Update()
{
if(oldSpawn != spawn)
{
if(spawn)
{
StopCoroutine(Generate());
StartCoroutine(Generate());
}
else
{
StopCoroutine(Generate());
}
oldSpawn = spawn;
}
}
private IEnumerator Generate()
{
for (int i = 0; i < numberOfObjects; i++)
{
randXTerrain = UnityEngine.Random.Range(xTerrainPos, xTerrainPos + terrainWidth);
randZTerrain = UnityEngine.Random.Range(zTerrainPos, zTerrainPos + terrainLength);
yValTerrain = terrain.SampleHeight(new Vector3(randXTerrain, 0, randZTerrain)) + yOffset;
GameObject objInstance = Instantiate(prefabToSpawn, new Vector3(randXTerrain, yValTerrain, randZTerrain), Quaternion.identity, spawnedTerrainObjectsParent.transform);
objInstance.name = "Terrain Spawned";
yield return new WaitForSeconds(duration);
}
}
}
Подробнее здесь: [url]https://stackoverflow.com/questions/78355994/how-to-stop-the-coroutine-if-the-flag-bool-is-false-and-re-start-it-when-true-in[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия