跳到主要内容

轮盘赌算法(Roulette)

轮盘赌选择是游戏开发中常见的随机选择算法之一,此算法基于对象的权重比例确定其被选择的概率,权重越高,被选择的概率越大。 您可以使用扩展包内的winS.Unity.Roulettejump icon来快速使用轮盘赌选择。

我们以抽卡,这一轮盘赌算法常见的应用场景来简单演示如何使用 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 A11/25 = 4%
Hero B11/25 = 4%
General C22/25 = 8%
General D33/25 = 12%
Soldier E88/25 = 32%
Soldier F1010/25 = 40%