unity3d 在设置随机范围后的短时间内生成的对象负载

sqougxex  于 2022-12-23  发布在  其他
关注(0)|答案(1)|浏览(159)

新的统一和C#和目前正在通过创建与代码的课程。2原型2的练习,我试图设置它,使狗之间产生2至5秒,每次略有变化的随机性。3然而,现在发生的是,他们是在随机间隔产生,然而,然后有一个巨大的增加数量的狗产卵,它迅速填补了场景,并使用了大量的处理能力:

我的SpawnManager脚本如下所示:

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

public class SpawnManager : MonoBehaviour
{
    public GameObject[] dogPrefabs;

    private float spawnRangeX = 10;
    private float spawnPosZ = 20;
    private float startDelay = 2;
    private float startspawnDelay = 1.5f;
    public float RandomSpawnBeg = 2; //* Time.deltaTime;
    public float RandomSpawnEnd = 5; //* Time.deltaTime;
    public float RandomSpawn = Random.Range(RandomSpawnBeg, RandomSpawnEnd);
    //public float boneDelay = 2.0f;

    // Start is called before the first frame update
    void Start()
    {
        InvokeRepeating("SpawnRandomAnimal", startDelay, RandomSpawn); //calls SpawnRandomAnimals method, after 2 seconds, every 1.5 seconds.
    }

    // Update is called once per frame
    void Update()
    {
       
    }
    void SpawnRandomAnimal()
    {
        
        int animalIndex = Random.Range(0, dogPrefabs.Length);
        Vector3 spawnPos = new Vector3(Random.Range(-spawnRangeX, spawnRangeX), 0, spawnPosZ); //creating a Vector3 variable which sets a random value for the x axis between the spawnRange vars, 0 on the y axis, and the spawnPosZ var for the z axis.

        Instantiate(dogPrefabs[animalIndex], spawnPos, dogPrefabs[animalIndex].transform.rotation); // spawn an animal from the index with an updated vector 3 position and rotation
        
        //InvokeRepeating("SpawnRandomAnimal", startDelay, RandomSpawn);
        Debug.Log("Spawn time is " + RandomSpawn);
    }
}

我有点不知道是什么原因导致了狗的攻击。我想它可能是告诉它每2 - 5帧做一次,而不是每秒钟,但是当i * RandomSpawnBeg和RandomSpawnEnd的时间。deltatime仍然以同样的方式执行。
我真的很喜欢学习C#和Unity,但是在时间是如何工作的方面有点卡住了,如果有人能为我解释一下,我会非常感激的!
谢啦,谢啦

vu8f3i0k

vu8f3i0k1#

首先调用重复函数

public void InvokeRepeating(string methodName, float time, float repeatRate);

**调用方法methodName在时间秒,然后重复每repeatRate秒。**例如InvokeRepeating("LaunchProjectile", 2.0f, 0.3f);这意味着我将创建一个抛射物后2秒从开始帧和每0.3秒我会再次调用这个LaunchProjectile。这是调用重复现在我们解决你的问题:**Start()**在Unity中,Start()函数被调用一次,且仅在调用Update()之前的第一帧被调用一次。因此,基本上每次都是以相同的帧速率重复调用,因为随机化仅发生一次。要解决此问题,只需将调用随机化函数的位置更改为:

void Start()
{
    InvokeRepeating("SpawnRandomAnimal", startDelay,Random.Range(RandomSpawnBeg, RandomSpawnEnd)); 
}

现在测试一下,我的朋友,我希望你的Unity之旅充满快乐。我建议你阅读这篇文档,它会在很多方面帮助你Order of execution

相关问题