Unity 中的随机数!

本文介绍了Unity中如何使用随机数实现各种游戏机制,包括随机选择数组元素、加权随机值、随机排序(如扑克牌洗牌)、不重复选取及空间中的随机点。通过示例代码和方法解释,帮助开发者更好地理解和应用随机数在游戏开发中的作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

孙广东  2015.1.3

关于Unity游戏运行中的 随机数:

   Unity/Editor/Data/Documentation/en/Manual/RandomNumbers.html

添加随机游戏元素
    在许多游戏中,随机选择的items或values是很重要的。本节展示了如何使用Unity的内置随机函数来实现一些常见的游戏机制。

选择一个随机Item游戏元素从数组中:
在随机选择一个数组元素时,可以选择一个零和数组的最大值(这是等于数组的长度减去 1 )的随机整数。这是很容易使用内置的随机函数:—
var element = myArray[Random.Range(0, myArray.Length)];


注意,Random.Range 从一个范围(包括第一个参数但不包括第二)返回一个值,所以使用 myArray.Length。在这里能给出正确的结果。

选择不同概率的Items:
    有时,你需要选择随机的物品,但有些物品更容易被选上。例如,NPC可能会反应在几个不同的方式,当它遇到一个玩家:
 50% 友好的问候的机会
 25% 逃跑的机会
 20% 直接攻击的机会
 5% 提供金钱作为礼物的机会

    你能想象这些不同的结果作为一条纸分成几部分分别占总长度的一小部分的条。所占比例等于被选择的结果的概率。作出选择是相当于挑选一个随机点沿带状的长度(例如投掷一个飞镖),然后看到它是在。

 


          在脚本中,该文件条实际上是一个float 的数组,该数组中包含的Item的不同的概率。随机点则是由float数组总大小乘以 Random.value 值来获得(他们不需要总计达1;重要的是不同的值和 相对大小)。为了找出随机点元素落在哪个点数组,首先检查看它是否是小于第一个元素的值。如果是的话,那么第一个元素将被选择。否则,从数组中减去第一个元素的值,比较第二个元素,直到找到正确的元素。类似于下面这个代码:

//C#

    float Choose (float[] probs) {

        float total = 0;

        foreach (float elem in probs) {
            total += elem;
        }

        float randomPoint = Random.value * total;

        for
### Unity 中生成随机数的方法 在 Unity 中,`UnityEngine.Random.Range()` 是最常用的生成随机数方法之一。此函可以用于生成浮点型或整型的随机数值。 对于生成指定范围内不重复的随机数,可以通过移除已选中的元素来确保唯一性: ```csharp using System.Collections.Generic; using UnityEngine; public class UniqueRandomNumbers : MonoBehaviour { private List<int> Nums = new List<int>(); void Start() { // 初始化列表 for (int i = 0; i < 10; ++i) { Nums.Add(i); } for (int i = 0; i < 5; i++) { int id = UnityEngine.Random.Range(0, Nums.Count); // 随机下标 Debug.Log(Nums[id]); // 获取随机数 Nums.RemoveAt(id); // 移除该元素以防止重复选取[^1] } } } ``` 如果只需要简单的随机数而不需要考虑去重,则可以直接调用 `Random.Range(minValue,maxValue)` 方法,在给定区间内返回一个随机数。当参为两个整时会得到一个闭区间的整;若是浮点则获得开区间的实[^4]。 为了保证每次运行程序都能有不同的种子序列从而改变产生的随机数列,可以在脚本开头加入如下语句初始化随机状态: ```csharp System.Random.InitState(System.Environment.TickCount); // 或者使用 C# 的 Random 类实例化对象 var randomInstance = new System.Random(); float value = randomInstance.NextDouble(); // 获得 [0.0, 1.0) 区间内的双精度浮点 ``` 需要注意的是,Unity 自带的 `Random.Range()` 函已经足够满足大多情况下的需求,并且其内部实现了良好的分布特性,因此通常无需手动设置种子除非有特殊要求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值