轮盘赌算法(Roulette)
轮盘赌选择是游戏开发中常见的随机选择算法之一,此算法基于对象的权重比例确定其被选择的概率,权重越高,被选择的概率越大。
您可以使用扩展包内的winS.Unity.Roulette
来快速使用轮盘赌选择。
我们以抽卡,这一轮盘赌算法常见的应用场景来简单演示如何使用 Roulette。
创建卡牌数据
我们简单创建一个数据类 Card 来代表卡牌:
Card.cs
public class Card
{
public string name { get; private set; }
public Level level { get; private set; }
public Card(string name, Level level)
{
this.name = name;
this.level = level;
}
public enum Level
{
SSR,
SR,
S,
R,
N,
}
}
编写测试脚本
紧接着我们创建一个测试 MonoBehaviour 脚本,并输入以下代码:
using UnityEngine;
using winS.Unity;
public class Example_UseRoulette : MonoBehaviour
{
private Roulette<Card> roulette;
private void Start()
{
roulette = new Roulette<Card>();
roulette.AddBet(new Card("Hero A", Card.Level.SSR), 1f);
roulette.AddBet(new Card("Hero B", Card.Level.SSR), 1f);
roulette.AddBet(new Card("General C", Card.Level.SR), 2f);
roulette.AddBet(new Card("General D", Card.Level.S), 3f);
roulette.AddBet(new Card("Soldier E", Card.Level.N), 8f);
roulette.AddBet(new Card("Soldier F", Card.Level.N), 10f);
}
private void Update()
{
if (Input.GetKey(KeyCode.Space))
{
Card card = roulette.Get();
Debug.Log(card.name);
}
}
}
上述代码中,轮盘的总权重为卡牌权重的总和,即 1+1+2+3+8+10=25,以下是每张卡牌的抽取情况:
| 卡牌 | 权重 | 抽取概率 |
|---|---|---|
| Hero A | 1 | 1/25 = 4% |
| Hero B | 1 | 1/25 = 4% |
| General C | 2 | 2/25 = 8% |
| General D | 3 | 3/25 = 12% |
| Soldier E | 8 | 8/25 = 32% |
| Soldier F | 10 | 10/25 = 40% |