我目前正在Unity工作,而在学校主修游戏开发。我遇到了用于地图生成的种子问题。我可以选择打开或关闭随机种子生成,如果关闭,我可以输入种子来生成地图。然而,我遇到的问题是,当我关闭随机生成并输入种子时,用户输入的种子尽管与随机生成的种子相同,但产生与随机生成的种子不同的地图。
例如,假设我的随机种子生成器脚本吐出字符串"空心美味的木板路"。我得到该字符串的哈希码并将其打入System.Random()。但是,如果我关闭随机生成并键入"空心美味木板路"手动,代码仍然只是获取哈希码并将其放入System.Random(),但生成的地图完全不同。
以下是用于为随机生成器设定种子的代码:
public string seed;
public bool useRandomSeed;
public SeedGenerator gen;
if (useRandomSeed)
{
gen.GenerateSeed();
seed = gen.seed;
}
System.Random pseudoRandom = new System.Random(seed.GetHashCode());
如果useRandomSeed为false,我只是在编辑器中给它一个值,因为它是公开的。就像我之前提到的那样,让我们举个例子,我的GenerateSeed()方法将gen.seed设置为" prickly swift hatbox"。这反过来又将我的MapGenerator脚本中的种子设置为" prickly swift hatbox"并使用它来查看随机数生成器。但是,如果我手动将种子设置为" prickly swift hatbox"从Unity编辑器(或者,我计划将来做游戏中的文本窗口),生成的地图完全不同。
我怀疑它与GetHashCode有关,因为我可能误解了它是如何工作的(我对此仍然很陌生)。如果是这种情况,我不能确定将种子字符串转换为随机生成器可以使用的int的简单解决方法。任何人都可以帮我确认这个问题和/或指出一些资源来解决这个问题吗?我非常坚持使用单词字符串作为种子,因为它比一块数字更加用户友好。提前谢谢!
编辑:问题实际上出现在我的SeedGenerator脚本中。所以基本上,它会从文本文件生成一个单词列表,其中\ n分隔条目。无论是在文本文件中还是在创建短语的代码中,都存在一个不可见的字符,它有效地使随机生成的种子与用户输入的种子完全不同,因为用户无法看到/键入该不可见的字符。现在我只需要找出那个角色的位置以及如何阻止它!
编辑2:问题出在我的形容词文本文件本身(问题不会出现在名词中)。文本文件中的每个单词用"输入"按下键,当文件被读取时,它被" \ n"分开。出于某种原因,这会在每个单词的末尾留下一个额外的,不可见的字符。但是,在我的名词文本文件中,所有内容似乎都以" shift + enter"分隔,之后它们没有不可见的字符。
现在,在这里,事情变得有趣。复制/粘贴" shift + enter"将单词分隔成新的文本文件会将" shift + enter" s更改为plain"输入" s,导致不可见的字符出现。这是我最初/无意中导致此错误的地方,因为我的形容词是从我在Google上找到的各种常见形容词列表中复制/粘贴的。在从文件中读取并将单词拼接成字符串数组后,在foreach循环中使用String.Trim并不会切断不可见的字符,因此不行。有趣的是,复制/粘贴隐形字符会将其变成正常的空间"。我不知道为什么。到目前为止,我能想出的唯一解决方案是手动进入我的形容词文件并用" shift + enter"重新间隔所有约400个条目。
编辑3:我的杂乱但功能正常的修复是手动浏览我的形容词列表并用空格替换每个返回,并让我的脚本将文件拆分为' '而不是' \ n'。