Unity3D中随机函数的应用
2013-09-07 01:47
246 查看
电子游戏中玩家与系统进行互动的乐趣绝大多数取决于事件发生的不可预知性和随机性。在unity3D的API中提供了Random类来解决随机问题。
最简单的应用就是在数组中随机选择一个元素,使用Random内置的方法可以进行选择。代码如下:
Floatelement=myArray[Random.Range(0,myArray.Length)];
Random.Range方法的两个参数代表了选择数据元素的范围。
很多时候,游戏中运用更复杂的随机事件,下面描述几种常见的随机事件案例
1:随机选择具有不同概率的事件
当你你需要选择具有不同发生概率的事件元素时。运用的场景为在游戏中玩家遇到NPC时,NPC在系统内部有好几种与玩家交互的方法。但是这些方法发生的概率并不相等。例如有50%几率进行问好;25%几率跑开;20%几率攻击玩家;5%几率为玩家提供礼品。
学过概率统计学的同学,一定做过在连续时间内发生事件概率的模型。我们也可以将上面描述的需求抽象为一个模型,我们将整个NPC与玩家交互系统看做一个纸带,按照事件发生的概率将纸带分为若干段,将大概率事件排在前面,小概率事件排在后面。当玩家遇到NPC时代表在这个纸带上随机选择一个点。抽象结果用图如下:
随机选择的点在哪个事件范围内就会发生相应的事件。将这个模型用代码表示为:
过程描述:首先检查随机数是否小于第一个元素,如果小于那么第一个元素就被选择了。否则用随机数的值减去第一个元素的值然后与第二个元素进行比较,以此类推直到找到正确的元素为止。
过程验证:如上图所示,假如随机数最终为82,那么首先将82与第一个元素50比较:82>50,因此应该将82-50=32与第二个元素25进行比较:32>25,因此应该将32-25=7与第三个元素20进行比较:7<20,那么第三个元素被选中,相对应的事件发生。
2:使用随机数打乱数组顺序
这个案例应用的最好场景就是纸牌游戏中的洗牌操作,思想也比较简单,就是依次将数组内的每个元素与一个随机序号的元素进行交换。代码如下:
3:使用随机数在数组中无重复的选择元素
在概率论中我们常常见到这样题目:一个球队10个人,要选择5个人去参加比赛。在游戏中的应用场景为你希望在几个不同的点随机生成一个不相同的NPC。例如需要在10个NPC中随机选择5个,第一个NPC被选中的概率为5/10,如果第一个被选中了那么第二个被选中的概率就变成了4/9,如果第一个被淘汰那么第二个被选中的概率就为5/9
过程描述:扫描待选择的NPC数组,如果生成的随机数小于被选中的概率则表示该元素被选中,直到所需要的元素个数都被选中。
注意点:进行选择的时候应该先将待选择的NPC数组进行“洗牌“操作。
最简单的应用就是在数组中随机选择一个元素,使用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=0; Foreach(float elem in probs ) Total+=elem; } //Random.value方法返回一个0—1的随机数 float randomPoint=Random.value*total; for(int i=0;i<pros.Length;i++ ) { if(randomPoint<probs[i]) return i; else randomPoint-=probs[i]; } return probs.length-1; }
过程描述:首先检查随机数是否小于第一个元素,如果小于那么第一个元素就被选择了。否则用随机数的值减去第一个元素的值然后与第二个元素进行比较,以此类推直到找到正确的元素为止。
过程验证:如上图所示,假如随机数最终为82,那么首先将82与第一个元素50比较:82>50,因此应该将82-50=32与第二个元素25进行比较:32>25,因此应该将32-25=7与第三个元素20进行比较:7<20,那么第三个元素被选中,相对应的事件发生。
2:使用随机数打乱数组顺序
这个案例应用的最好场景就是纸牌游戏中的洗牌操作,思想也比较简单,就是依次将数组内的每个元素与一个随机序号的元素进行交换。代码如下:
void Shuffle(int[] cards) { for(i=0;i<cards.Length;i++) { int temp=cards[i]; int randomIndex=Random.Range(0,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>0;numLeft--) { float prob=(numToChoose+0.0)/(numLeft+0.0); if(Random.value<=prob) { numToChoose--; result[numToChoose]=spawnPoints[numLeft-1]; if(numToChoose==0) break; } } return result; }
过程描述:扫描待选择的NPC数组,如果生成的随机数小于被选中的概率则表示该元素被选中,直到所需要的元素个数都被选中。
注意点:进行选择的时候应该先将待选择的NPC数组进行“洗牌“操作。
相关文章推荐
- Unity3D中随机函数的应用
- Unity3D中随机函数的应用
- Unity3D中随机函数的应用
- Unity3D中随机函数的应用
- Python random模块sample、randint、shuffle、choice随机函数概念和应用
- SQL Server 中随机函数应用举例 推荐
- Unity3D中Android应用的退出脚本如下:
- 第四周上机实践项目 项目3--随机函数应用游戏(1)猜数字游戏
- Unity3d AndroidJNI两篇应用示例。羽化的文章。
- Unity3D-应用内打开AppStore某个应用详情方法(iOS应用内下载、应用内评星)
- [unity3d]unity中C#委托的应用
- Unity3D之Quaternion学习与应用
- Unity3D——Mecanim动画 AnimatorTransitionInfo和AnimatorStateInfo 在角色移动和待机平滑切换中的应用
- Unity3d-protobuf简单应用
- 【xbox开发】如何通过unity3d发布xbox one应用
- java中随机函数的使用及简单应用
- 移动平台Unity3D 应用性能优化
- 初尝用Unity3D配合Vuforia开发适合Cardboard的AR(增强现实)应用
- Unity3D 开发 之 加载Android应用的环境
- 解决Unity3D 创建UWP应用出现Exception: Failed to build Visual Studio project using arguments