【问题标题】:Spawn different types of objects生成不同类型的对象
【发布时间】:2016-06-27 20:16:53
【问题描述】:

我正在尝试创建一个可以生成不同类型对象的脚本

【问题讨论】:

  • 您想保证 10 个对象中的 2 个是一种类型,还是在寻找纯粹的机会?我可能会将其实现为返回对象类型/实例化对象的枚举器
  • 我想保证2号对象即使只有一个也会生成。我只需要被生成。因为它有一种特殊的能力,而1号对象是正常的。
  • 您可能想以您需要的比例将对象添加到列表中,我会选择一个比例,比如 2:8,然后是一个倍数,例如 10、20 等,以指定的比例将项目数添加到列表中,然后从列表中随机选择项目,当项目被选中时删除它
  • 我不明白你的第一个 if 块是干什么用的。我想我有一个解决方案,但我不知道你在第一个 if 中在做什么,所以我不知道如何翻译它。例如,如果randomFloat 的值为0.95f,它应该会生成任何项目。这是你想要的还是一个错误?
  • @ScottChamberlain 在统一检查员中我传递了我的变量。假设我将普通对象传递为 0.8 (80%) 和其他对象 0.2 (20%) 第一个 if 语句修复了当我的 randomFloat 值变为 1 时我曾经得到的错误,因此在这种情况下它不会产生任何东西,我做了它是 randomFloat 0.7,因为我试图获得更高百分比的正常创建产卵.. 我希望这能稍微清理一下

标签: c# unity3d


【解决方案1】:

从您的描述和 cmets 看来,您想保证在 speiclaCratePercentageMin 和 speiclaCratePercentageMax 之间的百分比是特殊创建的,但其余的只能是正常创建。如果是这样,您需要做的就是计算出该百分比将占总数的多少个板条箱,首先产生那么多,然后用普通板条箱填充其余的板条箱。

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

public class spawnmanager : MonoBehaviour {

public int noOfobjects = 6;

public Transform[] spawnPoints;  

public GameObject normalCrate;
public GameObject specialCrate;

public float speiclaCratePercentageMin;
public float speiclaCratePercentageMax;

void Awake()
{
}

// Use this for initialization
void Start () 
{
    spawner();
}

void spawner ()
{
    List<Transform> availablePoints = new List<Transform>(spawnPoints);

    //Figures out how many special creates we need.
    int numberOfSpecialCrates = noOfobjects * Random.Range(this.speiclaCratePercentageMin, this.speiclaCratePercentageMax);

    //Added i<spawnPoints.Length check to prevent errors when noOfobjects is bigger than the number of available spawn points.
    for (int i = 0; i<noOfobjects && i<spawnPoints.Length;i++)
    {    
        int spawnPointIndex = Random.Range (0, availablePoints.Count);

        //As long as i is lower than numberOfSpecialCrates we spawn a special crate.
        if(i < numberOfSpecialCrates)
        {
            Debug.Log("dd");
            Instantiate(specialCrate, availablePoints[spawnPointIndex].position, Quaternion.identity);
        } 
        else
        {
            Instantiate(normalCrate, availablePoints[spawnPointIndex].position, Quaternion.identity) ;
        }     

        availablePoints.RemoveAt(spawnPointIndex);
    }
}
}

【讨论】:

  • 太棒了!它解决了问题 :) 现在,如果障碍物被摧毁,我该如何跟踪它们?例如,如果场景中只有 2 个障碍物,如果您知道,我想生成更多障碍物,如果不是,请与我分享您的信息,非常感谢它有效 :)
  • @Groude 标记所有具有相同标记的对象,然后使用 search for objects in a tag 的函数,当您生成的对象太少时。
  • 您还可以使用存储所有对象实例的列表。 (或者两个,一个一个,如果这样可以更容易地检查当前存在多少稀有的。)
  • @ScottChamberlain 你好,当我在现场没有足够的障碍物时,我仍然卡在重生的东西上。每当我摧毁一个障碍物时,我都想这样做,我会在 1 秒后重生另一个障碍物。现在我正在考虑使用协程,但我不确定逻辑将如何。我有 2 个类,一个是处理产卵的管理器,一个是具有障碍物功能的障碍物的主要类。我想破坏它的障碍类。
  • @Groude 你真的应该为这些东西提出新的问题。用Minimal, Complete, and Verifiable example 写一个新的完整问题并在那里提问。
【解决方案2】:

我认为问题就在这里 if (randomFloat >=1 || randomFloat = 0.7f)

最好使用更多的括号

if (randomFloat >=1 || (randomFloat = 0.7f))

【讨论】:

  • 它让它变得更好,但不知何故,它有时仍会产生 4 或 5 个障碍物而不是产生 6 个
  • 你的代码是随机的,你可能会得到大约 1000 个中的 600 个而不是 10 个中的 6 个
  • 位置随机,但我尝试按百分比计算的类型
【解决方案3】:

查看this SO 问题以获取想法。它似乎正是您要寻找的。​​p>

【讨论】:

  • 不鼓励仅链接答案,即使是其他 SO 问题。要么问题足够不同,这个问题值得拥有完整的答案版本,要么它们足够相似,您应该投票将其作为重复项关闭。
猜你喜欢
  • 1970-01-01
  • 2022-08-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-01
  • 2013-09-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多