分类:Unity、C#、VS2015

创建日期:2016-04-20

一、简介

Unity引擎提供的Random类可以用来生成随机数、随机点或旋转角度。

1、成员变量

seed:设置用于随机数生成器的种子。

value:返回一个随机数,在0.0(包括)~1.0(包括)之间。(只读)

insideUnitSphere:返回半径为1的球体内的一个随机点。(只读)

insideUnitCircle:返回半径为1的圆内的一个随机点。(只读)

onUnitSphere:返回半径为1的球体在表面上的一个随机点。(只读)

rotation:返回一个随机旋转角度。(只读)

2、方法

Range:返回min和max之间的一个随机浮点数,包含min但不包含max。

如果max等于min,将返回min。返回值永远不会是max,除非min等于max。

例如:

using UnityEngine;
using System.Collections;
public class example : MonoBehaviour {
public GameObject prefab;
public void Awake() {
//从关卡列表中加载一个随机关卡
Application.LoadLevel(Random.Range(0, Application.levelCount));
}
void Start() {
Vector3 position = new Vector3(Random.Range(-10, 10), 0, Random.Range(-10, 10));
Instantiate(prefab, position, Quaternion.identity);
}
}

二、基本用法--添加随机的游戏元素

随机选取项目或值在很多游戏中非常重要。该部分说明如何使用 Unity 内置随机函数执行一些常见的游戏机制。

1、从数组选择随机项目

可随机挑选数组元素,是因为能够选择零到数组最大索引值(等于数组长度减去1)之间的随机整数。使用内置 Random.Range 函数就可轻松做到:

var element = myArray[Random.Range(0, myArray.Length)];

注意:Random.Range 从包含第一个参数但排除第二个参数的范围中返回一个值,所以在此处使用 myArray.Length 能给出正确结果。

2、用不同概率选择项目

有时候,您需要随机选择项目,但有些项目被选中的概率比其他项目大。例如,NPC 在遇到玩家时会以几种不同的方式作出反应:

l 50% 的机率会友好问候

l 25% 的机率会跑开

l 20% 的机率会立即攻击

l 5% 的机率会提供金钱作为礼物

可以想象这些不同的结果分布在分成几部分的条形纸上,每种结果占总长度的一部分。所占部分与选中结果的概率相等。做选择就是选取条形纸长度上的随机点(比如说扔飞镖),然后看看它落在哪个部分。

在脚本中,条形纸实际上是一个浮点数组,按顺序包含项目的不同概率。随机点由 Random.value 乘以数组中所有浮点总数得出(它们合计起来不一定等于 1;重点是不同值获得的相对大小)。要找出随机点“落在”哪个数组元素,首先检查看它是否小于第一个元素的值。如果是,则将选中第一个元素;否则,从点值减去第一个元素的值,再与第二个元素比较,直到找到正确的元素。类似于下面的C#代码:

public float Choose(float[] probs)
{
float total = 0.0f;
foreach (var elem in probs)
{
total += elem;
} float randomPoint = Random.value * total;
for (int i = 0; i < probs.Length; i++)
{
if (randomPoint <= probs[i]) return i;
else randomPoint -= probs[i];
}
return probs.Length - 1;
}

注意,最后一个返回语句不能省略,因为 Random.value 可能会返回结果 1,在这种情况下,省略了最后一条语句就无法搜索到随机点。

3、随机排序

一个普遍的游戏机制是从一组随机排序的已知项目中进行选择。例如,一副牌通常被打乱,这样就不会以可预测的顺序抓牌。您可以通过访问数组中的每个元素,并随机与数组中的其他元素交换,来打乱数组项目的顺序:-

public void Shuffle(int[] deck)
{
for (int i = 0; i < deck.Length; i++)
{
var temp = deck[i];
var randomIndex = Random.Range(0, deck.Length);
deck[i] = deck[randomIndex];
deck[randomIndex] = temp;
}
}

4、从一组项目中非重复选取

常见任务是从一组项目中随机挑选若干项目,同一个项目最多只能选中一次。例如,您可能想在随机复活点生成若干 NPC,但要确保每个点处只能生成一个 NPC。为此,可以依次迭代项目,随机决定每个项目是否要添加到选择集。访问完每个项目后,剩下项目被选中的概率等于需要选择的项目数量除以剩下的所有项目数量。

例如,假设有十个复活点可选,但必须只能选择五个。第一个项目被选中的概率是 5 / 10 或 0.5。如果选择第一个项目,则第二个项目的概率为 4 / 9 或 0.44(即仍需从九个剩下的项目中选择四个)。然而,如果没有选择第一个项目,则第二个项目的概率为 5 / 9 或 0.56(即仍需从九个剩下的项目中选择五个)。这个操作一直持续到选择集包含五个所需项目。

您可以在如下代码中完成此目的:

public Transform[] ChooseSet(int numRequired)
{
var result = new Transform[numRequired];
var numToChoose = numRequired;
for (int numLeft = spawnPoints.Length; numLeft > 0; numLeft--)
{
// Adding 0.0 is simply to cast the integers to float for the division.
var prob = numToChoose + 0.0 / numLeft + 0.0; if (Random.value <= prob)
{
numToChoose--;
result[numToChoose] = spawnPoints[numLeft - 1]; if (numToChoose == 0)
break;
}
}
return result;
}

注意,尽管选择是随机的,但选择集中的项目与在原始数组中的顺序相同。如果项目排序是一次性的话,那么部分随机项目是可预见的,所以有必要在使用之前打乱数组的顺序。

5、空间中的随机点

将 Vector3 每个分量设为 Random.value 返回的值,通过这种方式来选择三维空间中的随机点:

var randVec = new Vector3(Random.value, Random.value, Random.value);

上述函数在边长为一个单位的立方体中给出一个点。将向量的 X、Y 和 Z 分量乘以所需边长,就可将立方体进行简单的缩放。如果一个轴的值设为零,该点将始终位于某一个平面。例如,如选择“地面”上的一个随机点,通常是随机设置 X 和 Z 分量,而将 Y 分量设为零。

当它是一个球体时(即:当您想从原点引出的给定半径内获取一个随机点时),您可以用 Random.insideUnitSphere 乘以所需半径的大小:

var randWithinRadius = Random.insideUnitSphere * radius;

注意,如果您将结果向量的某个分量设为零,则“不能”在一个圆内获得正确的随机点。尽管该点确实是随机的,且在右半径内,但点的分布概率在很大程度上会偏向圆的边缘,因此点分布极不均匀。为完成此任务,应当使用 Random.insideUnitCircle:

var randWithinCircle = Random.insideUnitCircle * radius;

【Unity】6.6 Random类的更多相关文章

  1. Random类(随机数)

    前言:总是忘记怎么用.上网一查,都是些有的没的...... 最简单却最常用的方法:Random.Next方法 首先,为Random类实例化一个对象: Random n=new Random(); Ne ...

  2. .Net使用system.Security.Cryptography.RNGCryptoServiceProvider类与System.Random类生成随机数

    .Net中我们通常使用Random类生成随机数,在一些场景下,我却发现Random生成的随机数并不可靠,在下面的例子中我们通过循环随机生成10个随机数: ; i < ; i++) { Rando ...

  3. System类和Random类

    System类 成员方法: public static void gc():运行垃圾回收器 public static void exit(int status):退出垃圾回收器 public sta ...

  4. ActionScript 3.0 自写类整理笔记(十三)——Random类

    一个简单的随机函数工具类,总共提供了9种静态方法来获取不同的随机值随便写的,如果你还有什么更好的建议,请提出来,谢谢~ index.Random类:代码:public final class Rand ...

  5. Java api 入门教程 之 JAVA的Random类

    在实际的项目开发过程中,经常需要产生一些随机数值,例如网站登录中的校验数字等,或者需要以一定的几率实现某种效果,例如游戏程序中的物品掉落等. 在Java API中,在java.util包中专门提供了一 ...

  6. Random类

    Random类是随机数产生类,可以指定一个随机数的范围,然后任意产生在此范围中的数字. //================================================= // F ...

  7. JAVA的Random类[转]

    在实际的项目开发过程中,经常需要产生一些随机数值,例如网站登录中的校验数字等,或者需要以一定的几率实现某种效果,例如游戏程序中的物品掉落等. 在Java API中,在java.util包中专门提供了一 ...

  8. Math类和Random类(数学公式相关类)

    Math 类包含用于执行基本数学运算的方法,如初等指数.对数.平方根和三角函数. 常用方法: 1.static 数值类型 abs(数值类型 a)      返回 double 值的绝对值. 2.sta ...

  9. 用Random类输出验证码

    package dx; import java.text.DecimalFormat; import java.util.Random; public class DxL { //创建类 public ...

随机推荐

  1. Android M 动态权限获取

    新的权限获取方式除了要求像之前版本号一样在AndroidManifest文件里静态申请之外,应用还需依据须要请求权限,方式採用向用户显示一个请求权限的对话框. 这些被动态申请的权限能够在系统设置中被手 ...

  2. 十大经典排序算法-JS篇

    http://web.jobbole.com/87968/ 虽然是JS篇,但其他编程语言(例如java)实现起来是差不多的.

  3. 转 安装PHP出现make: *** [sapi/cli/php] Error 1 解决办法

    ext/iconv/.libs/iconv.o: In function `php_iconv_stream_filter_ctor':/home/king/php-5.2.13/ext/iconv/ ...

  4. linux 上配置tomcat、mysql 开机启动

    1.tomcat 开机启动 方法一.修改系统文件 (已经尝试,可以) 1.修改/etc/rc.d/rc.local vi /etc/rc.d/rc.local 2.添加下面两行脚本,记住是两行,仅仅第 ...

  5. WD backup西部盘数据备份

    西部数据(WD),硬盘备份数据!防止数据丢失.损坏.... 起因: 电脑上存储很多资料,之前有500G的东芝硬盘(现在插头不灵敏),故决定换个好点的1T硬盘.电脑在一夜间打不开,不能识别硬盘!怎么重启 ...

  6. masonry瀑布流的使用

    今天在使用masonry.pkgd.min.js瀑布流的时候遇到一个很奇怪的问题,官网显示正常,而我的就是显示不正确,然后我又查看一遍,原来要加这段代码就ok了,记录一下,怕以后还会遇到这个问题 *, ...

  7. oracle 11g空表导不出问题

    查询空表 ' 生成分配空间的执行语句 or num_rows is null 复制出来执行即可.

  8. System.Web.HttpValueCollection.ThrowIfMaxHttpCollectionKeysExceeded

    昨天客户跟我说,突然一个页面频繁地报ThrowIfMaxHttpCollectionKeysExceeded这个异常.而且是数据量大的时候报错,数据量小的时候OK. 根据异常的名称也能看得差不多超过了 ...

  9. @weakify, @strongify

    我们知道,在使用 block 的时候,为了避免产生循环引用,通常需要使用 weakSelf 与 strongSelf,写下面这样的代码 __weak typeof(self) weakSelf = s ...

  10. Docker stop停止/remove删除所有容器

    原文地址:https://blog.csdn.net/superdangbo/article/details/78688904 docker ps // 查看所有正在运行容器$ docker stop ...