Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/264.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么在设置脚本执行顺序时,仍然有一个脚本首先执行?_C#_Unity3d_Unity5 - Fatal编程技术网

C# 为什么在设置脚本执行顺序时,仍然有一个脚本首先执行?

C# 为什么在设置脚本执行顺序时,仍然有一个脚本首先执行?,c#,unity3d,unity5,C#,Unity3d,Unity5,我有两个脚本附加到同一个emptygameobject。 第一个脚本是: using System; using System.Collections; using System.Collections.Generic; using System.IO; using UnityEngine; public class SpawnObjects : MonoBehaviour { public int numberOfObjects; public GameObject obje

我有两个脚本附加到同一个emptygameobject。 第一个脚本是:

using System;
using System.Collections;
using System.Collections.Generic;
using System.IO;
using UnityEngine;

public class SpawnObjects : MonoBehaviour
{
    public int numberOfObjects;
    public GameObject objectToPlace;
    public Vector3 newObjectsSize = new Vector3(5, 5, 5);
    public float spawnSpeed = 0.1f;

    private int wallsLengthX;
    private int wallsLengthZ;
    private int wallsPosX;
    private int wallsPosZ;
    private int currentObjects;
    private List<GameObject> objects = new List<GameObject>();

    void Start()
    {
        var wi = GetComponent<Walls>();
        wallsLengthX = (int)wi.lengthX;
        wallsLengthZ = (int)wi.lengthZ;
        wallsPosX = (int)wi.wallsStartPosition.x;
        wallsPosZ = (int)wi.wallsStartPosition.z;

        StartCoroutine(Spawn());
    }

    IEnumerator Spawn()
    { 
        for (int i = 0; i < numberOfObjects; i++)
        {
            GameObject newObject = (GameObject)Instantiate(objectToPlace);
            newObject.transform.localScale = new Vector3(newObjectsSize.x, newObjectsSize.y, newObjectsSize.z);
            newObject.transform.localPosition = GenerateRandomPositions(newObject);
            newObject.name = "Spawned Object";
            newObject.tag = "Spawned Object";
            objects.Add(newObject);
            yield return new WaitForSeconds(spawnSpeed);
            currentObjects += 1;
        }
    }

    private Vector3 GenerateRandomPositions(GameObject newObject)
    {
        float paddingX = Mathf.Clamp(newObject.transform.localScale.x, 0, wallsLengthX) / 2f;
        float paddingZ = Mathf.Clamp(newObject.transform.localScale.z, 0, wallsLengthZ) / 2f;
        float originX = wallsPosX + paddingX - wallsLengthX / 2f;
        float originZ = wallsPosZ + paddingZ - wallsLengthZ / 2f;
        float posx = UnityEngine.Random.Range(originX, originX + wallsLengthX - paddingX);
        float posz = UnityEngine.Random.Range(originZ, originZ + wallsLengthZ - paddingZ);
        float posy = Terrain.activeTerrain.SampleHeight(new Vector3(posx, 0, posz));

        return new Vector3(posx, posy, posz);
    }
}
第一个脚本生成新的10个立方体。 但是第二个脚本航路点变量只得到1个“衍生对象”,而不是10个

当我使用断点时,我看到它在循环中执行第一个脚本一次:

for (int i = 0; i < numberOfObjects; i++)
for(int i=0;i
但是它会跳转到第二个脚本,得到一个“生成的对象”,然后返回到第一个脚本,完成循环的其余部分

我想要的是,它将使第一个整个循环产生10个立方体,然后用第二个脚本将它们全部获得

我甚至在编辑器中做了:编辑>项目设置>脚本执行顺序
但它仍然没有首先完成整个循环,只进行了一次迭代。

您在
Spawn()
coroutine:

yield return new WaitForSeconds(spawnSpeed);
Start()
函数的调用顺序正确,但第一个脚本只是启动一个在每次迭代后生成的协同程序。在第一次收益之后,它将等待继续,直到
WaitForSeconds
结束;同时,第二个脚本将运行其
Start()


作为一个解决方案,您将无法用脚本执行顺序来解决这个问题。您的第二个脚本必须等待第一个脚本运行完它的
Spawn()
coroutine。有很多方法可以做到这一点,但最简单的方法是公开
startcroutine()
返回的
Coroutine
对象,或者在
spawningobjects
类中创建类似
bool DoneSpawning
的标志。

spawning()
Coroutine:

yield return new WaitForSeconds(spawnSpeed);
Start()
函数的调用顺序正确,但第一个脚本只是启动一个在每次迭代后生成的协同程序。在第一次收益之后,它将等待继续,直到
WaitForSeconds
结束;同时,第二个脚本将运行其
Start()

作为一个解决方案,您将无法用脚本执行顺序来解决这个问题。您的第二个脚本必须等待第一个脚本运行完它的
Spawn()
coroutine。有很多方法可以做到这一点,但最简单的方法是公开
startcroutine()
返回的
Coroutine
对象,或者在
spawneObjects
类中创建类似
bool DoneSpawning
的标志