【问题标题】:Selecting an enemy from a non sorted weighted list从未排序的加权列表中选择敌人
【发布时间】:2019-08-05 11:26:33
【问题描述】:

我一直对为什么这不能正常工作感到头疼。我有一个列表可以改变每秒生成怪物的概率。我想从这个列表中选择一个随机加权的敌人。我在某个地方出错了,我认为它在"EnemyToSpawnNext = Enemies[sorted[T].Key].Enemie[0].EnemyPrefab;" 区域附近。

public GameObject EnemySelection()
{

    var sorted = TierProbability.Select((x, i) => new KeyValuePair<int, float>(i, x)).OrderBy(x => x.Value).ToList();
    List<int> idx = sorted.Select(x => x.Key).ToList();
    List<float> B = sorted.Select(x => x.Value).ToList();


    float P = UnityEngine.Random.Range(0, 1);
    float Sum_prob = 0;
    for (int T = 0; T < TotalNumberofTiers; T++)
    {

        Sum_prob += sorted[T].Value; 
        print(Sum_prob);
        if (Sum_prob >= P)
        {
            EnemyToSpawnNext = Enemies[sorted[T].Key].Enemie[0].EnemyPrefab;

            break;
        }
    }
    return EnemyToSpawnNext;

}

以下是创建概率列表的难度调整函数。

 public void DifficultyAdjustments()
{
    SecondsElapsed += 10; // for debugging

    Min_Tier += 10 * (End_Min_Tier - Start_Min_Tier) / (TimeinMinutes * 60);
    Peak_Tier += 10 * (End_Peak_Tier - Start_Peak_Tier) / (TimeinMinutes * 60);
    Max_tier += 10 * (End_Max_Tier - Start_Max_Tier) / (TimeinMinutes * 60);


    for (int T = 0; T < TotalNumberofTiers; T++)
    {
        if (T < Min_Tier)
        WeightT = 0;
    if (T > Max_tier)
        WeightT = 0;
    if (Min_Tier <= T & T < Peak_Tier)
        WeightT = 1 + (Max_weight - 1) / (Peak_Tier - Min_Tier) * (T - Min_Tier);
    if (Peak_Tier <= T & T < Max_tier)
        WeightT = 1 + (Max_weight - 1) / (Peak_Tier - Max_tier) * (T - Max_tier);
        TierWeights[T] = WeightT;
        TierProbability[T]  = WeightT / TierWeights.Sum();
    }
    print(EnemySelection()); // for debugging

}

【问题讨论】:

    标签: c# linq unity3d math


    【解决方案1】:

    问题是你的P

     float P = UnityEngine.Random.Range(0, 1);
    

    这个P总是为零

    改用这个:

    float P = UnityEngine.Random.Range(0f, 1f);

    【讨论】:

    • 你可以简单地使用这个 float P = UnityEngine.Random.Range(0f, 1f);
    • 不要忘记 f 或者你可以使用最大范围作为 2 取决于你想要什么。 @Prime
    • 对于0到1之间的随机值,可以使用:Random.value
    猜你喜欢
    • 2015-07-01
    • 1970-01-01
    • 2020-02-27
    • 1970-01-01
    • 1970-01-01
    • 2015-06-21
    • 1970-01-01
    • 2019-01-14
    • 2013-07-23
    相关资源
    最近更新 更多