电子游戏中玩家与系统进行互动的乐趣绝大多数取决于事件发生的不可预知性和随机性。在unity3D的API中提供了Random类来解决随机问题。

最简单的应用就是在数组中随机选择一个元素,使用Random内置的方法可以进行选择。代码如下:

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

Random.Range方法的两个参数代表了选择数据元素的范围。

很多时候,游戏中运用更复杂的随机事件,下面描述几种常见的随机事件案例

1:随机选择具有不同概率的事件

当你你需要选择具有不同发生概率的事件元素时。运用的场景为在游戏中玩家遇到NPC时,NPC在系统内部有好几种与玩家交互的方法。但是这些方法发生的概率并不相等。例如有50%几率进行问好;25%几率跑开;20%几率攻击玩家;5%几率为玩家提供礼品。

学过概率统计学的同学,一定做过在连续时间内发生事件概率的模型。我们也可以将上面描述的需求抽象为一个模型,我们将整个NPC与玩家交互系统看做一个纸带,按照事件发生的概率将纸带分为若干段,将大概率事件排在前面,小概率事件排在后面。当玩家遇到NPC时代表在这个纸带上随机选择一个点。抽象结果用图如下:

随机选择的点在哪个事件范围内就会发生相应的事件。将这个模型用代码表示为:

float Choose(float[] Probs)
{
//将事件元素加入到数组中,如上面有4个元素,分别为50,25,20,5
{
float total=;
Foreach(float elem in probs )
Total+=elem;
}
//Random.value方法返回一个0—1的随机数
float randomPoint=Random.value*total;
for(int i=;i<pros.Length;i++ )
{
if(randomPoint<probs[i])
return i;
else
randomPoint-=probs[i];
}
return probs.length-;
}

过程描述:首先检查随机数是否小于第一个元素,如果小于那么第一个元素就被选择了。否则用随机数的值减去第一个元素的值然后与第二个元素进行比较,以此类推直到找到正确的元素为止。

过程验证:如上图所示,假如随机数最终为82,那么首先将82与第一个元素50比较:82>50,因此应该将82-50=32与第二个元素25进行比较:32>25,因此应该将32-25=7与第三个元素20进行比较:7<20,那么第三个元素被选中,相对应的事件发生。

2:使用随机数打乱数组顺序

这个案例应用的最好场景就是纸牌游戏中的洗牌操作,思想也比较简单,就是依次将数组内的每个元素与一个随机序号的元素进行交换。代码如下:

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

3:使用随机数在数组中无重复的选择元素

在概率论中我们常常见到这样题目:一个球队10个人,要选择5个人去参加比赛。在游戏中的应用场景为你希望在几个不同的点随机生成一个不相同的NPC。例如需要在10个NPC中随机选择5个,第一个NPC被选中的概率为5/10,如果第一个被选中了那么第二个被选中的概率就变成了4/9,如果第一个被淘汰那么第二个被选中的概率就为5/9

Transform[] spawnPoints;
Transform[] ChooseSet(int numRequired)
{
Transform [] result=new Transform[numRequired];
Int numToChoose=numRequired;
for(int numLeft=spawnPoints.Length;numLeft>;numLeft--)
{
float prob=(numToChoose+0.0)/(numLeft+0.0);
if(Random.value<=prob)
{
numToChoose--;
result[numToChoose]=spawnPoints[numLeft-];
if(numToChoose==)
break;
}
}
return result;
}

过程描述:扫描待选择的NPC数组,如果生成的随机数小于被选中的概率则表示该元素被选中,直到所需要的元素个数都被选中。

注意点:进行选择的时候应该先将待选择的NPC数组进行“洗牌“操作。

Unity3D中随机函数的应用的更多相关文章

  1. 【Unity3d游戏开发】Unity3D中的3D数学基础---向量

    向量是2D.3D数学研究的标准工具,在3D游戏中向量是基础.因此掌握好向量的一些基本概念以及属性和常用运算方法就显得尤为重要.在本篇博客中,马三就来和大家一起回顾和学习一下Unity3D中那些常用的3 ...

  2. Unity3D中可中途释放的单例

    Unity3D中可中途释放的单例 使用静态类,静态变量的坏处是从程序加载后就一直占用内存,想要释放比较麻烦,可是之前使用的单例,没有提供释放的方法,那是不是也同静态的一样直到程序结束菜释放?那单例的好 ...

  3. 图文详解Unity3D中Material的Tiling和Offset是怎么回事

    图文详解Unity3D中Material的Tiling和Offset是怎么回事 Tiling和Offset概述 Tiling表示UV坐标的缩放倍数,Offset表示UV坐标的起始位置. 这样说当然是隔 ...

  4. unity3d中 刚体(Rigidbody) 碰撞体(Collider) 触发器(Is Trigger)

      刚体(Rigidbody)的官方(摘自Unity3d的官方指导书<Unity4.x从入门到精通>)解释如下: Rigidbody(刚体)组件可使游戏对象在物理系统的控制下来运动,刚体可 ...

  5. Unity3D中Update()与FixedUpdate()的区别

    Unity3D中Update()与FixedUpdate()的区别是什么呢?从字面上理解,它们都是在更新时会被调用,并且会循环的调用.但是Update会在每次渲染新的一帧时,被调用.而FixedUpd ...

  6. Unity3D中C#和js方法相互调用

    通过查找资料,Unity3D中C#和js要相互调用彼此的方法,js文件必须放在"Standard Assets". "Pro Standard Assets" ...

  7. 在unity3d中使用opencv

    1.首先下载opencv2.4.10,解压缩后放在合适的地方,然后根据自己的电脑(32位或64位)选择X86或X64,我的是32位,将“opencv存放路径\build\x86\vc12\bin”加入 ...

  8. Unity3D 中 用quaternion 来对一个坐标点进行旋转的初步体会

    在unity3d中,用四元数来表示旋转,四元数英文名叫quaternion . 比如 transform.rotation 就是一个四元数,其由四个部分组成 Quaternion = (xi + yj ...

  9. 【转】Unity3D中Layers和LayerMask解析

    http://blog.csdn.net/yupu56/article/details/50441151 Unity中是用int32来表示32个Layer层.int32表示二进制一共有32位(0-31 ...

随机推荐

  1. dubbo 多协议和多注册中心

    一.配置dubbo多协议模式 1.默认协议 Dubbo缺省协议采用单一长连接和NIO异步通讯,适合于小数据量大并发的服务调用,以及服务消费者机器数远大于服务提供者机器数的情况.Dubbo缺省协议不适合 ...

  2. 139. Word Break (String; DP)

    Given a string s and a dictionary of words dict, determine if s can be segmented into a space-separa ...

  3. 165. Compare Version Numbers比较版本号的大小

    [抄题]: Compare two version numbers version1 and version2.If version1 > version2 return 1; if versi ...

  4. linux 版本号的查看

    1.# uname -a   (Linux查看版本当前操作系统内核信息)   Linux localhost.localdomain 2.4.20-8 #1 Thu Mar 13 17:54:28 E ...

  5. struts2框架值栈的概述之问题一:什么是值栈?

    1. 问题一:什么是值栈? * 值栈就相当于Struts2框架的数据的中转站,向值栈存入一些数据.从值栈中获取到数据. * ValueStack 是 struts2 提供一个接口,实现类 OgnlVa ...

  6. part1:9-windows与Linux文件共享

    1.winSCP 它是一个windows环境下使用SSH的开源图形化SFTP客户端.同时支持SCP协议.它主要功能就是在本地与远程计算机间安全的复制文件. 前提:Linux与windows能相互pin ...

  7. pyspider示例代码五:实现自动翻页功能

    实现自动翻页功能 示例代码一 #!/usr/bin/env python # -*- encoding: utf- -*- # Created on -- :: # Project: v2ex fro ...

  8. 【JS】点击页面判断是否安装app并打开,否则跳转下载的方法

    应用场景 App产品在运营推广上有一个需求,就是要求可以让用户在访问我们的推广网页时,就可以判断出这个用户手机上是否安装了我们的App,如果安装了则可以直接在网页上打开,否则就引导用户前往下载.从而形 ...

  9. Django模型层(2)

    https://www.cnblogs.com/yuanchenqi/articles/8963244.html from django.db import models class Author(m ...

  10. arduino 驱动电调

    #include <TimerOne.h> #define PPMPIN 7 ; //0-9 ; void setup() { // put your setup code here, t ...