我有4种颜色。我想这样做,以便玩家可以连续两次使用相同的颜色。当玩家与对象发生碰撞时,会调用RandomColor()
。因此,在游戏过程中多次调用此函数,有时玩家不会改变颜色。
using UnityEngine;
public class ColorManager : MonoBehaviour {
public SpriteRenderer player;
public string playerColor;
public Color[] colors = new Color[4];
private void Awake()
{
RandomColor();
}
public void RandomColor()
{
int index = Random.Range(0, 4);
switch (index)
{
case 0:
player.color = colors[0]; //colors[0] is orange
playerColor = "orange";
break;
case 1:
player.color = colors[1]; //colors[1] is pink
playerColor = "pink";
break;
case 2:
player.color = colors[2]; //colors[2] is blue
playerColor = "blue";
break;
case 3:
player.color = colors[3]; //colors[3] is purple
playerColor = "purple";
break;
}
}
}
尝试使用while循环,执行while循环,但我显然做错了,因为我有时会连续两次收到相同的颜色。如果有人弄清楚并解释它是如何/为什么有效的话会很棒,因为我在这个问题上度过了很长一段时间而我非常好奇。
答案 0 :(得分:3)
首先,您需要一个可以生成带有排除的随机数的函数。以下是我用于此的内容:
int RandomWithExclusion(int min, int max, int exclusion)
{
int result = UnityEngine.Random.Range(min, max - 1);
return (result < exclusion) ? result : result + 1;
}
每次调用它时,都需要将结果存储在全局变量中,以便下次再次调用时将其传递给exclusion
参数。
我修改了这个函数,这样你每次调用时都不必这样做。新的RandomWithExclusion
函数将为您完成。
int excludeLastRandNum;
bool firstRun = true;
int RandomWithExclusion(int min, int max)
{
int result;
//Don't exclude if this is first run.
if (firstRun)
{
//Generate normal random number
result = UnityEngine.Random.Range(min, max);
excludeLastRandNum = result;
firstRun = false;
return result;
}
//Not first run, exclude last random number with -1 on the max
result = UnityEngine.Random.Range(min, max - 1);
//Apply +1 to the result to cancel out that -1 depending on the if statement
result = (result < excludeLastRandNum) ? result : result + 1;
excludeLastRandNum = result;
return result;
}
<强>测试强>:
void Update()
{
Debug.Log(RandomWithExclusion(0, 4));
}
最后一个号码永远不会出现在下一个函数调用中。
对于您的具体解决方案,只需替换
即可int index = Random.Range(0, 4);
与
int index = RandomWithExclusion(0, 4);
答案 1 :(得分:0)
如果RandomColor返回与上一个颜色相同的颜色,您需要做的是添加一个判断,只需再次调用它,对吗?