Как я могу генерировать единицы в то же время? - PullRequest
0 голосов
/ 19 ноября 2018
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class GenerateStairs : MonoBehaviour
{
    [Header("Stairs Prefb")]
    public GameObject stairsPrefab;
    [Space(5)]
    [Header("Platforms")]
    public bool addPlatforms = false;
    public GameObject platformsPrefab;
    [Space(5)]
    [Header("Settings")]
    [Range(1, 20)]
    public int numberOfUnits = 1;
    public float delay = 3;
    public int stairsNumber = 5;
    public Vector3 stairsStartPosition;
    public Vector3 stairSize;
    public Vector3 stairsSize;
    public float stepWidthFactor = 1f;

    private Vector3 stairsPosition;
    private GameObject stairsParent;
    private int oldNumberOfUnits = 0;

    // Use this for initialization
    void Start()
    {
        oldNumberOfUnits = numberOfUnits;

        for (int i = 0; i < numberOfUnits; i++)
        {
            stairsParent = new GameObject();
            stairsParent.name = "Stairs";
            StartCoroutine(BuildStairs());
        }
    }

    // Update is called once per frame
    void Update()
    {
        if(oldNumberOfUnits != numberOfUnits)
        {
            StartCoroutine(BuildStairs());
            oldNumberOfUnits = numberOfUnits;
        }
    }

    private IEnumerator BuildStairs()
    {
        for (int i = 1; i <= stairsNumber; i++)
        {

            stairsPosition = new Vector3(
                    stairsStartPosition.x,
                    stairsStartPosition.y + (i * stairsSize.y),
                    stairsStartPosition.z + (i * stairsSize.y) * stepWidthFactor);

            GameObject stair = Instantiate(
                    stairsPrefab,
                    stairsPosition,
                    Quaternion.identity);

            stair.tag = "Stair";
            stair.transform.parent = stairsParent.transform;
            stair.transform.localScale = stairSize;

            yield return new WaitForSeconds(delay);
        }

        stairsParent.AddComponent<MoveObjects>().Init();
    }
}

В начале я делаю цикл и запускаю сопрограмму в соответствии с numberOfunits.

Работает нормально, если numberOfUnits равно 1. Но больше 1, например 2, сначала создаетсяпервый набор лестниц, но затем на втором родителе «Лестницы» создается только 1 лестница.Я не хочу, чтобы он ждал, чтобы закончить первый сопрограмм, который я хочу в то же время, чтобы создать количество лестниц сопрограмм.

И я также хочу добавить промежуток между каждой единицей лестницы.А также, чтобы сделать это в Обновлении, если я изменю число единиц, это добавит / уничтожит больше лестничных единиц.Внутри StartCoroutine должны быть все лестничные клетки.

1 Ответ

0 голосов
/ 19 ноября 2018

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

То, что вы должны сделать, это создать, создать сборный и установить, что делать работу. Мое последнее замечание касалось потоков, но вы не сможете создать что-либо, если только это не в основном потоке, поэтому самый простой способ сделать это будет выглядеть так.

public GameObject yourGoWithAboveClassOnIt;


void Start()
{
    oldNumberOfUnits = numberOfUnits;

    for (int i = 0; i < numberOfUnits; i++)
    {
        Instantiate(yourGoWithAboveClassOnIt);
    }
}

ваш предыдущий класс удалит это

void Start()
{
    //oldNumberOfUnits = numberOfUnits;

    //for (int i = 0; i < numberOfUnits; i++)
    //{
        stairsParent = new GameObject();
        stairsParent.name = "Stairs";
        StartCoroutine(BuildStairs());
    //}
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...