标签:gen 时间 泛型 eric 特性 else 直接 筛选 一个
当我最初写游戏时,我经常使用标准Random()函数,然后写一堆if和else条件来我获得预期结果。如果结果不太好,我会写更多的条件进行过滤或者筛选,直到我觉得游戏变得有趣。最近我发现有更好的方法。内置的Random类并没有问题,问题是使用内置的Random类很难达到我们的预期效果。
现实生活中,以抛硬币为例,时而会抛出连续多次花或者字。那么如果在游戏中,可能表现为多次连续的暴击或是硬直,尽管有时暴击和硬直的概率很低,但依旧有可能连续出现,让人感觉诡异。那么为了解决类似的问题,前辈们想了很多种方法,比如说特殊值过滤等等。我们今天介绍的是Shuffle Bag技术,可以让你的随机数不那么随机,由你掌控。
Shuffle Bag是一项让我们可以控制随机数分布的技术。
其主要原理为:
using System.Collections.Generic;
using UnityEngine;
public class ShuffleBag<T> {
private List<T> data;
private T currentItem;
private int currentPosition = -1;
private int Capacity { get { return data.Capacity; } }
public int Size { get { return data.Count; } }
public ShuffleBag(int initCapacity)
{
data = new List<T>(initCapacity);
}
public void Add(T item, int amount)
{
for (int i = 0; i < amount; i++)
data.Add(item);
currentPosition = Size - 1;
}
public T Next()
{
if (currentPosition < 1)
{
currentPosition = Size - 1;
currentItem = data[0];
return currentItem;
}
var pos = Random.Range(0,currentPosition);
currentItem = data[pos];
data[pos] = data[currentPosition];
data[currentPosition] = currentItem;
currentPosition--;
return currentItem;
}
}
在我的项目中,我希望NPC播放受伤动画的概率为十分之一,并且我不希望看到他偶尔连续播放受伤动画多次,也不想长时间不播放受伤动画。
ShuffleBag<bool> hurtBag = new ShuffleBag<bool>(10);
hurtBag.Add(false, 9);
hurtBag.Add(true, 1);
//当触发受伤时,调用以下逻辑
if(hurtBag.Next())
{
Play();
}
附上参考的原文链接 Shuffle Bags: Making Random() Feel More Random 英文好的同学可以直接看原文 。另外,这个原文题目有些让人疑惑,所以我的译文标题做了一些更改。
标签:gen 时间 泛型 eric 特性 else 直接 筛选 一个
原文地址:https://www.cnblogs.com/tangzhenqiang/p/8891712.html