【问题标题】:How can I generate the units at the same time?如何同时生成单位?
【发布时间】:2018-11-20 05:06:25
【问题描述】:
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();
    }
}

在 Start 中我正在做一个循环并根据 numberOfunits 启动 Coroutine。

如果 numberOfUnits 为 1,则工作正常。但它是否大于 1,例如 2,它首先创建第一组楼梯,然后在第二个“Stairs”父级上它只创建一个楼梯。我不希望它等待完成我想要的第一个协程同时创建多个协程的楼梯。

我还想在每个楼梯单元之间添加一个间隙。 并且如果我更改 numberOfUnits 在更新中进行此操作,它将添加/销毁更多楼梯单元。所有的楼梯单元都应该在 StartCoroutine 中进行实例化。

【问题讨论】:

    标签: c# unity3d


    【解决方案1】:

    您误解了协程的工作方式,而不是线程。正在发生的事情是您不断调用协程,因此它一遍又一遍地开始而不是创建单独的实例。

    你应该做的是创建一个预制件并实例化它来完成这项工作。我的最后一句话是关于线程,但除非它在主线程上,否则您将无法实例化任何东西,因此完成此操作的最简单方法是这样。

    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());
        //}
    }
    

    【讨论】:

    • 对,循环预制件并使用 GenerateStairs 脚本复制/创建许多游戏对象。
    • 高五 :) 快乐编码。
    猜你喜欢
    • 2011-04-25
    • 1970-01-01
    • 2019-10-28
    • 2015-08-11
    • 1970-01-01
    • 2013-06-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多