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 )