【问题标题】:How t spawn objects from random places one at a time?如何一次从随机位置生成一个对象?
【发布时间】:2020-07-25 10:55:36
【问题描述】:

我正在制作一个需要从顶部生成项目的 android 游戏。我希望生成位置在我的场景顶部是水平随机的。我使用了这些代码,它们没有给我任何随机的东西,而且多个游戏对象同时从同一个生成器生成。我想一次生成一个游戏对象,而其他对象应该只在第一个从游戏场景中被摧毁后才生成。请帮助我对统一以及 c# 和 Stackoverflow 不熟悉。

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

public class Spawner : MonoBehaviour
{
    public GameObject[] spawnableItems;

    // Update is called once per frame
    void Update()
    {
        bool isTimeToSpawn (GameObject itemGameObject)
        {
            spawnableSprites item = itemGameObject.GetComponent<spawnableSprites>();
            float spawnDelay = item.seenEverySeconds;
            float spawnsPerSecond = 1 / spawnDelay;

            if(Time.deltaTime > spawnDelay)
            {
                Debug.LogWarning("SpawnRate Capped By FrameRate");
            }
            float threshold = spawnsPerSecond * Time.deltaTime;

            if(Random.value < threshold)
            {
                return true;
            }

            else
            {
                return false;
            }

        }


        foreach (GameObject item in spawnableItems)
        {
            if(isTimeToSpawn(item))
            {
                Spawn(item);
            }
        }
    }

    void Spawn (GameObject myGameObject)
    {
        GameObject myItem = Instantiate(myGameObject) as GameObject;
        myItem.transform.parent = transform;
        myItem.transform.position = transform.position;
    }
}

【问题讨论】:

    标签: c# unity3d game-development


    【解决方案1】:

    您想在顶部随机生成一个对象,然后仅在第一个对象被破坏后生成另一个对象?正确的? 看起来您不需要生成/删除多个对象。 你知道在游戏开发中我们尽可能地提高效率,有时你所需要的只是使用一个旧对象作为一个新对象,然后欺骗玩家认为它是新的。 所以我的建议是,不要删除你的对象,只需将它的位置再次设置在顶部,如下所示:

    float spawnXmin = 0;
    float spawnXmax = 100;
    float spawnY = 0;
    float spawnZ = 0; // * numbers are just for demonstration
    myItem.transform.position = new Vector3(Random.Range(spawnXmin, spawnXmax), spawnY, spawnZ);
    

    同样不要在Update()中使用那些代码,你在Update中的任何东西都会花费你很多,因为它会在每一帧中运行,所以尽可能避免在Update()中放东西。

    【讨论】:

      【解决方案2】:
       void Start()
      {
          // will wait 2 seconds then call the function Spawn() every 0.3 seconds
          InvokeRepeating("Spawn", 2.0f, 0.3f);
      }
      
      void Spawn()
      {
          GameObject myItem = Instantiate(myGameObject) as GameObject;
          myItem.transform.parent = transform;
          myItem.transform.position = new Vector2(Random.Range(0, width) , height);
      }
      

      【讨论】:

      • 我按照你的建议做了,也尽量不在更新方法中放任何东西。现在,当我玩游戏时,它显示“尝试调用方法:无法调用 Spawner.Spawn。”我现在不知道怎么了。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-08-09
      • 2020-11-19
      • 2011-06-26
      • 1970-01-01
      • 2018-04-03
      • 2015-12-02
      • 2019-10-30
      相关资源
      最近更新 更多