[Unity]随机装备属性随机数生成物品概率

 

 

当类似随机地牢游戏 里面生成 的装备 的属性 各不相同,且数值各不一样,是怎么作到 类似暗黑破坏神 里面的随机装备属性的。

随机生成物品也可以用到。

[Unity]随机装备属性随机数生成物品概率_第1张图片


鉴定武器,新增武器属性的概率

比如拾取了 一把 未鉴定的武器剑,由于是未鉴定的,因此不能直接装备。

需要 鉴定 来 解锁 武器的 属性。

这个 武器 的稀有程度 来 判断 随机 的 武器 属性 的稀有程度,以及数值。

这个武器 的稀有 程度 包含 的计算为(武器属性 鉴定完毕后 拥有的 )

int 武器稀有程度 = 100;//100为传说武器,90为绿色武器,80为蓝色武器,70为橘色武器,10为白色武器。

 

每增加 一个 属性就要 使得

武器属性当前数量 += 1;//并且用If 来判断 是否超过了 当前武器的 最大 属性 的数量

武器稀有程度 -= 新建的武器属性的权重值;//传说武器 有个专门的生成 传说武器属性的函数。对应不同颜色的武器 也有与之对应的生成 武器属性的函数。

传说武器属性函数,专门 来随机处理 武器的属性。越是强力的武器属性的权重值 越是大,接近100

当 这个鉴定的武器 的 武器稀有程度 越低,那么新增的 武器 属性 就越是 不强力。

 


随机数占比数组 来生成 某些物品

这里涉及到 随机数占比数组 来生成 某些物品

例如,当角色 进入 房间,60%概率生成普通怪物,30%概率生成 精英怪,10%的概率 生成 BOSS怪物。

这个怎么用 随机数 来随机 生成?

...
int Probability_Max = 100;//最大数为100
int Probability_Monest_Lv1 = 60;//普通怪物
int Probability_Monest_Lv2 = 30;//精英怪物
int Probability_Monest_Lv3 = 10;//BOSS级别怪物
...

刷怪的概率=普通怪物刷怪概率+精英怪物刷怪概率+BOSS怪物刷怪概率;//这里的刷怪概率 也可以从100改为更低的值,例如其他的数值来 使得进入当前的房间的概率为 道具房、商店房间,等等其他房间

由于 这里 只有 3种生成 物品、怪物的需要,那么更多 的 物品、概率,是否 需要重复写 几十个、几百个 变量,来输入 概率。

...
int Probability_Max = 100;//最大数为100
int Probability_Monest_Lv1 = 60;//普通怪物
int Probability_Monest_Lv2 = 30;//精英怪物
int Probability_Monest_Lv3 = 10;//BOSS级别怪物
int Probability_Monest_Lv4 = 10;//BOSS级别怪物
int Probability_Monest_Lv5 = 60;//普通怪物
int Probability_Monest_Lv6 = 30;//精英怪物
int Probability_Monest_Lv7 = 10;//BOSS级别怪物
int Probability_Monest_Lv8 = 10;//BOSS级别怪物
...

 


 

类似 WOW 里面,对 高级装备 提出需求的 摇骰子 的 随机数计算。

在WOW里面,组队 刷出 了高级的装备,每个人 都可以 根据自己的职业 的需求,以及 这个 高级装备 的属性 来提出自己的需求,摇骰子,每个玩家 按下 需求 的按钮,就会 返回 一个 随机数,随机数最大的那个 玩家 获得 这个高级装备。

[Unity]随机装备属性随机数生成物品概率_第2张图片

黄100,绿50,黑100

100次,黄44,绿9,黑47

 

红色字体代表 这3种颜色 的 最大值的设置。

100 44 10 32 5 25 20 33 20 33 15 25 15 31 15 36
绿 50 9 10 33 5 29 20 31 20 32 15 40 15 33 15 22
100 47 10 35 5 46 20 36 20 36 15 35 15 36 15 42

 


当黄、绿、黑 的最大值设置 为10的整数的时候,并且都相等的时候,概率 趋近于 1/3。这里的分母3是指 黄、绿、黑的数量,当然可以是其他的数

10 32 5 25 20 33 20 33 15 25 15 31 15 36
绿 10 33 5 29 20 31 20 32 15 40 15 33 15 22
10 35 5 46 20 36 20 36 15 35 15 36 15 42

 

 


当黄、绿、黑 的最大值设置 为2:1:2的时候,

100 44 2 24 10 39 10 43 10 46 10 38        
绿 50 9 1 0 5 9 5 7 5 10 5 8        
100 47 2 76 10 52 10 50 10 44 10 54        

概率在45/100,10/100,45/100徘徊。为什么不是 40:20:40?

 


当黄、绿、黑 的最大值设置 为2:3:2的时候,

10 19 10 23 10 11 2 13 2 6 4 21 4 14
绿 15 57 15 58 15 59 3 51 3 53 6 47 6 57
10 24 10 19 10 30 2 36 2 41 4 32 4 29

20:60:20/10:50:40/

 



逻辑图

[Unity]随机装备属性随机数生成物品概率_第3张图片

Test_CubeSpawnManager.cs

using UnityEngine;
using UnityEngine.UI;//Text

public class Test_CubeSpawnManager : MonoBehaviour {
    /// 
    /// 生成 物品 的位置
    /// 
    public Transform spawnPosition;

    /// 
    /// 随机数生成 的方块
    /// 
    public Test_CubeSpawn[] spawns_array;

    /// 
    /// 当前 要生成的  方块 的概率
    /// 
    private int currentProbability = 0;
    /// 
    /// 当前的要生成的方块
    /// 
    private Test_CubeSpawn currentCubeSpawn = null;//当前只 生成1个 方块。
    /// 
    /// 生成的方块
    /// 
    Transform go;

    /// 
    /// 按钮按下的次数
    /// 
    public int button_push;
    /// 
    /// 显示的 文本 的按钮按下的次数
    /// 
    public Text text;
    
    /// 
    /// 当按钮SpawnCube 按下 执行的 函数
    /// 
    public void buttonPush()
    {
        if (spawns_array.Length >0)
        {
            clear();//重置 所有的条件
            button_push++;//记录 按下按钮的次数
            int _int;
            for (int i=0; i < spawns_array.Length; i++)
            { _int = spawns_array[i].spawnCube();
                currentProbability = (currentProbability > _int) ? currentProbability : _int;
                //当 currentProbability 大于 _int 的时候,则 保持 当前概率。否则 更新 当前的 概率
                currentCubeSpawn = (currentProbability > _int) ? currentCubeSpawn : spawns_array[i];
            }
            if (currentCubeSpawn != null
                && spawnPosition != null)
            {
                currentCubeSpawn.init_num += 1;
                go = Transform.Instantiate(currentCubeSpawn.cube) as Transform;//生成方块
                go.position = spawnPosition.position;//设置 生成方块 的位置
                if (currentCubeSpawn.text != null)
                {
                    currentCubeSpawn.text.text = currentCubeSpawn.init_num.ToString();//使得对应方块的文本显示对应的次数
                }
            }
            if (text != null)
            {
                text.text = button_push.ToString();//显示 按下按钮的次数
            }

        }
    }

    /// 
    /// 按下 restart按钮
    /// 
    public void clear()
    {
        if ( go != null)
        {
            currentCubeSpawn = null;
            currentProbability = 0;
           Destroy(go.gameObject);
        }
    }
}

Test_CubeSpawn.cs

using UnityEngine;
using UnityEngine.UI;//Text

public class Test_CubeSpawn : MonoBehaviour {

    /// 
    /// 要生成的 方块。
    /// 
    public Transform cube;
    /// 
    /// 最大概率
    /// 
    public int max = 100;
    /// 
    /// 最小概率
    /// 
    public int min = 0;
    /// 
    /// 当前概率
    /// 
    public int probability = 0;
    /// 
    /// 显示 对应方块的 文本 的生成 次数
    /// 
    public Text text;
    /// 
    /// 生成的次数
    /// 
    public int init_num = 0;

    /// 
    ///  返回 一个概率值。
    /// 
    /// 概率
    public int spawnCube()
    {
        probability = Random.Range(min,max);
        return probability;
    }
}

 


 

 

 

你可能感兴趣的:(Unity,游戏实现)