【发布时间】:2016-04-04 07:55:28
【问题描述】:
我正在制作一个“建塔”游戏。在我的游戏中,我随机地对立方体侧面进行纹理处理,因此每个新立方体的每一面都有随机纹理。新立方体由附加到“gamemanager”空游戏对象的脚本创建。此游戏管理器将“TextureController”脚本附加到每个新立方体。该脚本负责创建纹理图集并为立方体的每一面拾取 UV。纹理被加载并存储在“TextureContainer”脚本(也附加到“gamemanager”)中,该脚本具有返回随机纹理数组的方法。这很好用,并且按计划进行,除了一件事。第一个(基础)立方体不是由脚本创建的,而是由我设置的。它有一个不同的脚本(我们称之为“baseCubeTextures”),它必须从“gamemanager”获取数组,创建自己的纹理图集并将 UV 设置到立方体的侧面。但问题是基础立方体的纹理始终与脚本创建的第一个立方体相同。为了更清楚一点:
GameManager 有一个脚本 GameManagerScript,其方法为 CreateNextCube(),其中有一行:
playerCube.AddComponent<TextureController>().atlasTextures = GetComponent<TextureContainer>().getTextures(TextureSize.Ten);
它还附加了一个TextureContainer 脚本。
TextureContainer 有一个返回随机纹理数组的方法:
public Texture2D[] getTextures(TextureSize textureSize)
{
switch (textureSize)
{
case TextureSize.Ten:
textures[0] = textures10x6[Random.Range(0, textures10x6.Length)];
textures[2] = textures10x6[Random.Range(0, textures10x6.Length)];
textures[4] = textures10x6[Random.Range(0, textures10x6.Length)];
textures[5] = textures10x6[Random.Range(0, textures10x6.Length)];
break;
case TextureSize.Eight:
break;
case TextureSize.Six:
break;
case TextureSize.Four:
break;
case TextureSize.Two:
break;
case TextureSize.One:
break;
default:
break;
}
textures[1] = topBottomtextures[Random.Range(0, topBottomtextures.Length)];
textures[3] = topBottomtextures[Random.Range(0, topBottomtextures.Length)];
return textures;
}
基本立方体有一个或多或少看起来像这样的脚本:
public GameObject gameController;
private Texture2D[] atlasTextures = new Texture2D[7];
private Texture2D atlas;
Mesh mesh;
Vector2[] originalUVs;
private Rect[] atlasUVs;
// Use this for initialization
void Start()
{
atlasTextures = gameController.GetComponent<TextureContainer>().getTextures(TextureSize.Ten);
// code for setting UVs
}
那么为什么我的 getTextures() 方法有相同的纹理?是不是因为我几乎同时调用了这个方法(在两个脚本的 Start() 中都调用了这个方法)?我读到随机数生成器可能会发生这种情况。在这里可以避免吗?
【问题讨论】:
-
你在哪里定义随机?通常,人们会创建一个实例(例如静态实例),以避免您所描述的问题(2 个 RNG 产生相同的一组数字,因为它们使用相同的时间作为它们的种子)。
-
@RB., Random 是一些 Unity 的东西。
-
textures10x6.Length 的值是多少?您是否尝试过调试解决方案?
-
Random.Range 从参数中定义的范围返回 int。我知道单个实例可能会有所帮助(类似帖子的一些答案建议),但我不知道在 Unity 中是否可行。 textures10x6.Length 没有问题
-
它总是返回相同的值吗?还是只是有时? (因为在后一种情况下,这将是预期的行为。)
标签: c# arrays random unity3d return-value