游戏随机与概率工具库
ProbUtil 是一套用于 Unity 项目中的通用随机与概率计算工具库。
该工具提供了一系列常用的概率计算与随机方法, 可用于 掉落系统、AI行为、随机地图、Roguelike机制、技能触发、抽卡系统 等场景。
工具为 纯代码工具类,无需初始化,也不会依赖任何项目状态。
1. 工具概述
ProbUtil 提供以下类型的随机与概率计算功能:
- 概率判断
- 权重随机
- 概率随机
- 随机元素选择
- 不重复随机
- 随机数字
- 随机Enum
- 随机方向
- 随机Vector
- 随机布尔
- 列表洗牌
所有功能均基于 UnityEngine.Random 实现。
2. 使用方式
ProbUtil 为 静态工具类,无需实例化。
直接调用即可使用。
3. 概率判断
用于判断某事件是否按概率触发。
3.1 Chance
按 0~1概率 判断。
示例:
if (ProbUtil.Chance(0.2f))
{
// 20%概率触发
}
参数说明:
probability —— 概率值 0~1
工具内部会自动进行 Clamp 处理。
3.2 ChancePercent
按 百分比概率 判断。
示例:
if (ProbUtil.ChancePercent(25))
{
// 25%概率触发
}
参数说明:
percent —— 概率百分比 0~100
4. 权重随机
用于根据权重随机选择某个结果。
常用于:
- 掉落系统
- 宝箱生成
- 怪物生成
- AI行为决策
4.1 Roll
按 整数权重 随机返回 index。
示例:
int result = ProbUtil.Roll(40,40,15,5);
概率分布:
- 0 → 40%
- 1 → 40%
- 2 → 15%
- 3 → 5%
返回值: index 被选中的权重索引
4.2 RollNormalized
按 小数概率 随机返回 index。
示例:
int result = ProbUtil.RollNormalized(0.4f,0.4f,0.15f,0.05f);
概率分布:
- 0 → 40%
- 1 → 40%
- 2 → 15%
- 3 → 5%
适用于:
- 算法计算概率
- AI概率决策
- 动态概率系统
4.3 Roll(元素版本)
按权重随机返回元素。
示例:
List<string> items = new List<string>()
{
"Common",
"Rare",
"Epic"
};
List<int> weights = new List<int>()
{
70,
25,
5
};
string item = ProbUtil.Roll(items,weights);
适用于:
- 掉落表
- 抽卡系统
- 奖励池
5. 随机元素
用于从集合中随机选择元素。
5.1 Pick(数组)
随机选择数组中的一个元素。
示例:
int value = ProbUtil.Pick(new int[]{1,2,3,4});
5.2 Pick(List)
随机选择 List 中的一个元素。
示例:
string name = ProbUtil.Pick(nameList);
6. 不重复随机
用于从集合中随机选择元素并删除。
适用于:
- 抽卡池
- 奖励池
- 不重复随机事件
6.1 PickAndRemove
示例:
int item = ProbUtil.PickAndRemove(poolList);
执行后:
- 随机元素返回
- 元素从列表中删除
7. 随机数字
用于生成随机数字。
7.1 RangeExcept
在随机区间中排除某个数字。
示例:
int value = ProbUtil.RangeExcept(0,5,2);
返回值范围:
- 0 1 3 4
适用于:
- 随机技能
- 随机目标
- 随机索引
8. Enum随机
用于随机选择一个 Enum 值。
示例:
EnemyType type = ProbUtil.RandomEnum<EnemyType>();
适用于:
- AI行为
- 状态机
- 随机角色
9. 随机布尔
随机返回 true 或 false。
示例:
bool result = ProbUtil.Bool();
概率为:
50% true 50% false
10. 随机方向
用于生成随机方向向量。
10.1 RandomDirection2D
生成 2D单位方向向量。
示例:
Vector2 dir = ProbUtil.RandomDirection2D();
适用于:
- 子弹散射
- 粒子方向
- AI移动
10.2 RandomDirection3D
生成 3D单位方向向量。
示例:
Vector3 dir = ProbUtil.RandomDirection3D();
11. 随机Vector
用于生成随机位置。
11.1 RandomPointInCircle
生成圆形范围内的随机点。
示例:
Vector2 pos = ProbUtil.RandomPointInCircle(5f);
11.2 RandomPointInSphere
生成球形范围内的随机点。
示例:
Vector3 pos = ProbUtil.RandomPointInSphere(10f);
12. 列表洗牌
用于打乱集合顺序。
实现算法:
Fisher-Yates Shuffle
12.1 Shuffle
示例:
ProbUtil.Shuffle(cardList);
执行后:
列表顺序将被随机打乱。
适用于:
- 卡牌系统
- 随机事件池
- Roguelike房间顺序
13. 使用限制与注意事项
所有函数均依赖 UnityEngine.Random
-
不保证跨平台随机一致性
-
不适用于需要确定性随机的逻辑
-
不适用于加密随机
如需确定性随机,应使用自定义 RandomSeed 系统。
14. 典型使用场景
ProbUtil 常用于:
- 宝箱掉落系统
- 怪物掉落系统
- AI行为概率
- Roguelike随机房间
- 技能触发概率
- 抽卡系统
- 奖励池
- 随机地图生成
15. 总结
ProbUtil 是一套 轻量、通用、零依赖 的随机与概率工具库。
它提供了游戏开发中最常见的随机功能,使开发者能够:
-
简洁表达概率逻辑
-
快速实现随机机制
-
避免重复编写概率算法
该工具通常作为 游戏基础工具库 的一部分使用。