示例:根據權重對象列表隨機返回一個枚舉類型
using System.Collections;
using UnityEngine;
public static class WeightObjectsUtil {
/// <summary>
/// 隨機在權重列表返回一個枚舉類型
/// </summary>
/// <typeparam name="T"> 枚舉類型 </typeparam>
/// <param name="weightObjects"> 權重對象列表 </param>
/// <param name="defaultType"> 默認返回的枚舉類型 </param>
/// <returns></returns>
public static T GetLandTypeWithWeightList<T> ((T type, int weight)[] weightObjects, T defaultType) where T : System.Enum {
// 總權重
int sumWeight = 0;
for (int i = 0, len = weightObjects.Length; i < len; i++) {
sumWeight += weightObjects[i].weight;
}
// 隨機數 [0, sumWeight)
int n = Random.Range(0, sumWeight);
// 根據隨機數所在總權重線段上的落點計算出結果
int m = 0;
for (int i = 0, len = weightObjects.Length; i < len; i++) {
(T landType, int weight) weightObj = weightObjects[i];
if (n >= m && n < m + weightObj.weight) {
return weightObj.landType;
}
m += weightObj.weight;
}
return defaultType;
}
}
