C#动物产卵器逻辑-需要建议

C#动物产卵器逻辑-需要建议,c#,unity3d,logic,unity5,C#,Unity3d,Logic,Unity5,在我的游戏中,我有分散在地形上的动物产卵器。其想法是只有当玩家在产卵者的射程内时,才让动物产卵,但如果在产卵者附近有太多动物,则不允许。这就是我到目前为止所做的,但现在我有点卡住了。有人能给我一些关于以下事情的指导吗 产卵几率计算正确吗?例如,设置两个动物的产卵几率分别为10%和90%,这会使animalA有10%的产卵几率和animalB有90%的产卵几率吗?还是我的计算错了 我的半径计算正确吗 最重要的是:我可以改进它吗? 守则: [System.Serializable] public

在我的游戏中,我有分散在地形上的动物产卵器。其想法是只有当玩家在产卵者的射程内时,才让动物产卵,但如果在产卵者附近有太多动物,则不允许。这就是我到目前为止所做的,但现在我有点卡住了。有人能给我一些关于以下事情的指导吗

  • 产卵几率计算正确吗?例如,设置两个动物的产卵几率分别为10%和90%,这会使animalA有10%的产卵几率和animalB有90%的产卵几率吗?还是我的计算错了
  • 我的半径计算正确吗
  • 最重要的是:我可以改进它吗?
守则:

[System.Serializable]
public class SpawnableAnimal
{
public string AnimalName;
public float spawnWeight;

public float spawnPercentage;
}

public class AnimalSpawner : MonoBehaviour {

public float maxSpawnRadius = 1000.0f;
public float noSpawnRadius = 700.0f;

public GameObject spawnedAnimal;

public SpawnableAnimal[] spawnableAnimals;

void Start () {
    System.Random rand = new System.Random();
    int randInt = rand.Next(0, 100);

    float startTime = randInt / 100f;
    float repeatTime = randInt / 100f;
    InvokeRepeating("ReadyToSpawn", startTime, (60.0f + repeatTime));
}

void ReadyToSpawn()
{
    Debug.Log("Ready to spawn");
    bool canSpawn = true;

    GameObject[] players = GameObject.FindGameObjectsWithTag("Player");
    GameObject[] animals = GameObject.FindGameObjectsWithTag("Animal");
    for(int i = 0; i < players.Length; i++)
    {
        if (Vector3.Distance(this.transform.position, players[i].transform.position) > maxSpawnRadius)
            canSpawn = false;

        if (Vector3.Distance(this.transform.position, players[i].transform.position) < noSpawnRadius)
            canSpawn = false;
    }

    if (players.Length < 1)
        canSpawn = false;

    if (spawnedAnimal != null)
        canSpawn = false;

    if (canSpawn)
        SpawnAnimal();
}

void SpawnAnimal()
{
    System.Random rand = new System.Random();
    double x = rand.NextDouble();

    var totalWeight = spawnableAnimals.Select(a => a.spawnWeight).Sum();

    for(int i = 0; i < spawnableAnimals.Length; i++)
    {
        float spawnPercentage = spawnableAnimals[i].spawnWeight / totalWeight;

        if(x < spawnPercentage)
        {
            InstantiateAnimal(i);
            return;
        }

        x -= spawnPercentage;
    }
}

void InstantiateAnimal(int animalToSpawn)
{
    if (animalToSpawn != -1)
        spawnedAnimal = GameObject.Find("AnimalManager").GetComponent<AnimalManager>().SpawnAnimal(spawnableAnimals[animalToSpawn].AnimalName, this.transform.position, this.transform.rotation);
    else Debug.Log("No animal to spawn!");
}
[System.Serializable]
公营可产卵动物
{
公共字符串AnimalName;
公众浮标重量;
公众持股比例;
}
公营动物典当商:单一行为{
公共浮动最大半径=1000.0f;
公共浮子noSpawnRadius=700.0f;
公共游戏对象繁殖动物;
公共可繁殖动物[]可繁殖动物;
无效开始(){
System.Random rand=new System.Random();
int randInt=rand.Next(01100);
浮动起始时间=randInt/100f;
浮动重复时间=randInt/100f;
调用重复(“ReadyToSpawn”,startTime,(60.0f+repeatTime));
}
void readytopawn()
{
Log(“准备生成”);
bool canSpawn=true;
GameObject[]玩家=GameObject.FindGameObjectsSwithTag(“玩家”);
GameObject[]动物=GameObject.FindGameObjectsSwithTag(“动物”);
for(int i=0;imaxRadius)
canSpawn=false;
if(向量3.距离(this.transform.position,players[i].transform.position)a.spawnWeight.Sum();
对于(int i=0;i<可繁殖动物.长度;i++)
{
浮动产卵百分比=可产卵动物[i]。产卵重量/总重量;
如果(x<百分比)
{
动物(i);
返回;
}
x-=产卵率;
}
}
void实例化动物(int animalToSpawn)
{
if(animalToSpawn!=-1)
spawnedAnimal=GameObject.Find(“AnimalManager”).GetComponent().SpawnAnimal(可繁殖动物[AnimalToSpown].AnimalName、this.transform.position、this.transform.rotation);
else Debug.Log(“没有要产卵的动物!”);
}

}

您在这里进行整数除法:

float startTime = randInt / 100
我想你想要的是:

float startTime = randInt / 100f
您将获得“反向”产卵机会:

然而,这并不能完全解决问题,因为:

arraySum += randInt;
正在执行与以下相同的操作:

break;
因此,如果可繁殖动物中的第一个元素的繁殖几率为10%,而可繁殖动物中的第二个元素的繁殖几率为90%,那么第一个元素的分布为10%,第二个元素的分布为90%*90%=81%,因为只有在第一个元素失败时才会尝试第二个元素

Vector3.Distance(this.transform.position, players[i].transform.position)
这些位置在同一空间吗?向量3.距离(x,y)是否表示
| x-y |
?如果是这样的话,我觉得这个计算很好

产卵动物
看起来很奇怪。我不知道它在做什么。如果你能解释一下你的想法,我可能会理解

我会给每只动物分配一个重量。这个数字是任意的,但它们的相对大小很重要。如果猫的体重是100,狗的体重是1000,那么狗的产卵几率是猫的10倍

旁白:为什么是权重而不是百分比?如果你定义猫有10%的产卵机会,狗有90%的产卵机会,然后你添加沙鼠,剩下多少百分比来分配沙鼠?百分比必须加上1,因此您必须调整所有其他动物的百分比以腾出空间。如果我们使用体重,猫的体重是100,狗的体重是1000,那么我们可以加上体重为500的沙鼠,我们知道沙鼠产卵的次数是猫的5倍,是狗的一半——无需调整

让我们假设您在
[0,1)
中生成了一个随机数
x
(可以使用)

我们想在
[0,1)
中为每只动物分配一个与其体重成比例的时间间隔。首先找到总体重

var totalWeight = spawnableAnimals.Select(a => a.Weight).Sum();

由此,我们可以为每只动物分配一个百分比,即
a.Weight/totalWeight
。这些百分比加起来等于1,因此您可以在间隔
[0,1)
Pi
是从索引的动物集
A
中繁殖动物
Ai
的概率,如果
0你应该发布此内容,这些问题在这里是离题的谢谢!我甚至不知道codereview.stackexchange.com我真的很感激这样的答案!这样的答案对我很有帮助站起来学习处理这些事情的新方法,而不仅仅是给我代码来复制和粘贴。根据你的解释,我试图用一个新方法来替换SpawnAnimal方法。上面的调整大致上就是你的意思吗?@minganbeyeveld不完全是。当我说“暂停”时你需要结束算法,这意味着
在循环中中断
,或者从函数中返回
,或者任何合适的方法。我还用算法中缺少的几个部分(边界检查
I
I
的增量)修复了我的答案。非常感谢你的帮助!我再次更新了代码(希望操作正确)@minganbeyeveled看起来不错。确保
可繁殖动物[i]。spawnWeight/totalWeight
是浮点除法,而不是整数除法。
Vector3.Distance(this.transform.position, players[i].transform.position)
var totalWeight = spawnableAnimals.Select(a => a.Weight).Sum();
0.0    0.1    0.2    0.3 …    1.0
 [  P1  )[     P2     )[ …  Pn )