‫如果有一件事是对一个无限的跑步者来说最重要的, 那就是无限｡
‫为了创造一个无限的世界, 我们需要一个程序性的创造｡
‫我们需要程序化地创建它, 这意味着我们需要通过代码, 通过代码来创建它｡
‫所以我们不想创造一个巨大的世界, 我不知道, 10亿个不同的道路元素或道路部分｡
‫我们希望通过编程来实现这一点, 我们可以通过程序化的方式来实现这一点｡
‫我现在要做的是, 首先, 我想设置我的晶体, 我想改变晶体,
‫而不是在世界的某个地方或我放置它的任何地方｡
‫我要你在公路上｡
‫让我们把晶体放在这里｡
‫我们把它放在我们的道路上｡
‫顺便说一句, 我们把其他的水晶都扔掉吧｡
‫删除｡
‫还有, 让我们把我们的道路部分也删除掉｡
‫现在让我们把水晶拖到我们的游戏里｡
‫所以我们大致说这里是一个好位置｡
‫让我们看看它是否只是在上面｡
‫就在上面｡
‫是啊, 这是罚款｡
‫这很好｡
‫我想把水晶放在路上, 现在我要关闭水晶｡
‫所以现在, 正如你所看到的, 它不再可用｡
‫我们必须激活它｡
‫现在, 道路部分将是一个新的预制件｡
‫因此, 让我们将该道路部分拖动到prefabs文件夹中, 我们希望稍后按程序创建多个这些道路部分｡
‫好吧, 我会的
‫在我们这样做之前, 有一个基本的一块, 我们的游戏, 将永远是相同的｡
‫所以从某种意义上说, 这将是我们的道路｡
‫顺便说一句, 我们把水晶也扔掉吧｡
‫现在我们可以复制水晶并相应地移动它｡
‫所以前几步都是一样的, 然后我们就开始移动到一边｡
‫所以这首曲子永远都是一样的｡
‫让我们来看看游戏视图｡
‫是啊, 总是这样｡
‫他们总是这样移动｡
‫还有下一个｡
‫好吧, 我会的
‫这就是我们地图的起点｡
‫现在我们要继续, 使它程序化, 这样的作品, 他们是自动和无限的创建｡
‫为了做到这一点, 让我们为我们的道路创建一个新的脚本｡
‫现在, 让我们转到我们的道路, 添加组件和新脚本, 我们称之为一条道路｡
‫现在, 我们打开一个, 这里需要修复预制件, 公共游戏对象道路预制件,
‫让我们统一真实的分配, 因此道路脚本需要道路预制件, 让我们将脚本拖到脚本文件夹中｡
‫现在让我们去我们的｡
‫写了现在需要的道路脚本或道路部分游戏对象｡
‫好了, 我们到了｡
‫还是预制的？
‫差不多吧｡
‫好吧, 我会的
‫接下来, 我们将需要知道我们希望从哪一点开始创造我们的世界？
‫所以我这里有一个错误｡
‫角色部分11是不需要的, 所以让我们删除它｡
‫是这样｡
‫所以从第十条路开始, 我想继续创造新的道路部分｡
‫所以从这一点上｡
‫因此, 我需要创建新路段时的位置｡
‫该位置是我们的道路部分的位置或变换位置｡
‫如果我们看一下, 它在007的位置｡
‫09让我们检查一下那个位置｡
‫我将把它拖回到我们的路演脚本中｡
‫我想拥有那个职位｡
‫我将创建一个新的公共向量, 在最后三个位置, 我将调用它, 并将它添加到这里｡
‫原来是007｡ 9或09｡
‫那是我们最后一段路的位置｡
‫现在我们需要知道的是, 我们需要移动物体多少｡
‫因此, 这个道路部分, 让我们把它放在外面, 现在让我们移动它或复制道路的力量,
‫并移动它与控制和换档｡
‫我们可以看到它移动了0｡ 707.
‫这就是区块的宽度或者说位置的变化, 它也应该是宽度｡
‫好吧, 我会的
‫让我们回到我们的路线脚本, 这里我们需要知道偏移｡
‫所以我们创建一个新的公共浮点偏移量, 它是0｡ 707作为浮体｡
‫现在让我们创建一个方法｡
‫我将去掉start方法｡
‫我将创建一个新方法, public void, 创建新的道路部分｡
‫我现在要做的只是调试调试日志, 创建新的路部分｡
‫在update方法中, 我将检查用户是否按下了按钮｡
‫因此, 输入点得到键下来, 我想要哪个键的代码｡
‫键码点空格｡
‫所以每当玩家按空格键时, 我就想创建一个新的道路部分｡
‫我们现在就开始吧｡
‫让我们进一步创建该方法｡
‫因此创建新的道路部分｡
‫我们需要什么？
‫我们需要生成位置向量3｡
‫所以我们称之为spawn post向量3｡ 0, 即位置000｡
‫这就是我们开始的产卵位置, 然后我们要有一个几率, 它是一个0到100之间的随机变量.
‫如果几率小于50, 我就往左边产卵, 否则我就往右边产卵.
‫所以如果几率小于50, 我需要正偏移量, 否则需要负偏移量.
‫所以spawn的位置是新的向量3, 它是最后一个位置点x加上偏移量和最后一个Y位置｡
‫所以最后一个帖子在Y｡
‫最后是最后一个位置, 但z加上偏移量｡
‫这意味着它会移动我们的位置,
‫或者创建一个向量为3的繁殖位置, 或者指定一个向量为3的繁殖位置, 我们稍后将使用它来繁殖我们的游戏对象, 也就是我们的道路片段或道路部分｡
‫所以我希望它是新向量3的位置, 最后一个位置x减去偏移量｡
‫最后一个立柱Y和最后一个立柱z加上｡
‫现在, 让我们继续创建游戏对象｡
‫我将把它命名为G, 实例化它, 这样我们就可以在我们的统一世界道路预制件中创建它, 在哪个位置,
‫在哪个位置, 我们想要有什么标准｡
‫我们使用标准点圆, 这意味着我们用0旋转它｡ 45和0, 因为我们的游戏对象也是旋转的, 我们希望我们的道路也是旋转的,
‫我们希望它们也在这里旋转｡
‫而现在我们需要最后一个位置或者说需要设定最后一个位置, 也就是g要变换的位置｡
‫因为那是新职位, 对吧？
‫我们需要知道新游戏对象的最后位置｡
‫因此, 我们从手动设置的最后一个位置开始, 现在我们总是使用创建的位置进行设置｡
‫因此, 新道路部分具有特定位置, 我们保存其保存在最后一个post变量中｡
‫好吧, 我们试试看｡
‫我回到Unity, 创建了分屏｡
‫这是有道理的, 因为我们想看到的是场景中发生的事情｡
‫所以让我真实的地去掉声音, 尽管它很棒｡
‫现在我们进入游戏视图, 按空格键｡
‫正如您在场景视图中所看到的, 我们的世界现在是基于我们的选项卡创建的, 但当然我们希望这样做,
‫而不是基于我们一直在单击｡
‫我们希望它发生的基础上, 我们的立场｡
‫现在, 让我们回到编写脚本｡
‫所以让我们自动创建它｡
‫我们在这里使用私有的void wake方法, 然后调用repeating或者调用方法, 撤销repeating.
‫我们要调用什么来重复？
‫创建新路段的方法, 我们希望在1/2之后执行该操作, 我们希望每秒执行该操作｡
‫所以我们就试试看｡
‫让我们保存游戏, 看看现在会发生什么｡
‫让我们试试看｡
‫我们可以看到每一秒都有一个新的路段被创造出来｡
‫好吧, 我会的
‫但这并不是我们想要的｡
‫我们不希望它在我们清醒的时候就被创建出来, 因为现在可能发生的是, 我们没有启动游戏,
‫它只是在运行, 我们仍然在每一秒都创建一个巨大的世界｡
‫但我们想做的是, 只有当游戏开始时, 我们才想要创造那些｡
‫那我们该怎么做呢？
‫这里我们不使用唤醒方法, 但我们使用另一种方法, 我们将创建另一种方法,
‫我们称之为开始, 开始构建.
‫它不是私有的, 而是公共的, 因为我们想从游戏管理器访问它｡
‫当然, 我们现在不再需要更新方法,
‫因为我们会根据按键创建新的道路部分｡
‫让我们进入游戏管理器, 找到start game方法, 因为在这里我们启动游戏,
‫这是创建这些对象的最佳点.
‫我们来找一个类型为的对象, 然后找一个道路对象.
‫我们有一个叫做Start Building的方法, 这就是我们要调用的.
‫好吧, 我们来测试一下｡
‫我们来看一下我们的博弈, 我得到了一个空引用异常.
‫这和我不再有游戏经理有关｡
‫让我们看看如何改变这种状况｡
‫让我们创建一个新的游戏管理器｡
‫如果你也是这样的话, 我会在这里创建一个游戏管理器,
‫然后拖动或者重置它, 然后把我的游戏管理器拖到这里, 因为不管什么原因, 它消失了｡
‫所以我现在要保存这个场景｡
‫在我们测试之前, 我们需要分配分数文本和高分文本｡
‫那就这么办吧｡
‫现在让我们再试一次｡
‫现在, 我们不应该得到错误｡
‫好了, 现在我们回到正轨了｡
‫我一定是把它删了｡
‫现在让我们来尝试一下｡
‫哦, 让我们试试｡
‫我们开始吧｡
‫正如你所看到的, 游戏是在后面按程序创建的, 有点太慢了.
‫所以我们比我们的游戏更快地创造出那些棋子｡
‫因此, 让我们创建新的道路部分快一点｡
‫顺便说一下, 例如, 我们可以每隔0创建一个｡ 5秒, 所以我们来做0｡ 这应该能解决那个问题｡
‫我觉得中场休息没问题｡
‫我们来看看｡
‫让我们开始游戏, 看看它是否创造了足够的｡
‫然而, 我不喜欢的是, 我仍然可以看到它是如何产生这些碎片的｡
‫好吧, 现在我摔倒了, 所以这意味着我可以解决它是相当简单的｡
‫我可以简单地｡
‫我们把这条路和那条路都去掉吧｡
‫好吧, 我需要那个｡
‫让我们把它带回我们的道路｡
‫我可以简单地复制这一部分, 并进一步移动它｡
‫实际上, 我们把它移到这里｡
‫再复制一次｡
‫所以我可以简单地把世界变大一点｡
‫所以现在让我们来保存它｡
‫现在我不应该再看到它是在哪里创造的了｡
‫我们来玩个游戏吧｡
‫现在, 当然, 我们有一个问题, 我们不再有正确的终点了, 因为它在哪里？
‫我们的道路需要有最后的位置｡
‫所以最后一个位置的偏移量应该是这个｡
‫所以我们的道路部分14现在是最后一个｡
‫所以, 让我们改变这里的值, 并从我们的道路上取Z值, 并在这里输入它｡
‫好吧, 现在我们再试一次｡
‫让我们看看这些碎片是在哪里创建的｡
‫正如你所看到的, 它们是在正确的位置上创建的｡
‫好极了｡
‫现在我不知道我的世界是在哪里创造的｡
‫我觉得是0｡ 5秒应该没问题, 因为现在它创造的速度比我走的还快｡
‫好吧, 我会的
‫那就好｡
‫现在让我们再加一次晶体, 因为我们没有晶体｡
‫现在怎么办？
‫我们确实想要水晶｡
‫让我们来看看我们的路演脚本｡
‫在这里, 在创建新的部分, 我们希望每五步或每五条路有一个晶体｡
‫我们来创建一个私有的int路数, 它是零, 然后增加我们创建的每一条路的路数｡
‫所以路数加加｡
‫然后我们检查一下, 如果路数除以5, 那么模5等于0, 然后我们要激活晶体｡
‫所以g变换点, 在零位置得到子对象, 然后加上我们自己, 得到游戏对象, 并将其设置为活动状态.
‫是的｡
‫所以现在每隔五条路就有一个活性晶体｡
‫好吧, 我会的
‫现在让我们保存脚本｡
‫让我们回到Unity, 看看它是否有效｡
‫所以开始的碎片不会有任何晶体｡
‫所以我们手工制作的那些将不会有任何晶体｡
‫所以玩家必须通过这里的某个部分才能得到任何水晶｡
‫哦, 现在我们有一个小问题在这里, 虽然｡
‫如您所见, 动画不再正常工作, 也许您可以猜到原因｡
‫好吧, 这与我们的球员在某个时刻在空中或接触空气的一瞬间有关｡
‫就在那时他开始不能正确地移动, 或者说, 不能正确地制作动画｡
‫所以我们来解决这个问题｡
‫我们可以用两种方法解决这个问题｡
‫一种可能是在某一点上, 在其间存在一些空间, 使得块彼此不完全成一直线｡
‫所以这可能是另一个问题的原因之一, 或者另一种解决方法是,
‫在我们的角色动画中添加一个新的过渡, 从下落过渡到奔跑,
‫而这个过渡将基于我们还没有创建的条件｡
‫我们来创建一个新参数, 并调用这个触发器不再下降｡
‫但这并不是完美的解决方案｡
‫所以更好的解决办法是检查我的棋子之间是否有空隙｡
‫但这是一个选择｡
‫不再往下掉了｡
‫那就这么办吧｡
‫让我们回到这里的脚本, 我们可以在更新方法中的图表控制器中转到这里, 我们可以说,
‫如果红色投线不再位于此位置, 我们可以继续并将触发器设置为不再下降｡
‫我想我是这么称呼它的｡
‫让我们来看看｡
‫让我们把它改成不再坠落｡
‫这是正确的说法｡
‫所以让我们回到统一的状态, 把它改变为不再坠落｡
‫现在让我们来看看这个问题是否解决了｡
‫我们来玩这个游戏吧｡
‫我们可以去我们的现场, 也许找到一个更好的看法这样的事情｡
‫现在让我们开始游戏吧｡
‫所以现在我们来收集一些｡
‫正如你所见, 他在那里倒下了｡
‫有一点差距, 这是一个差距, 从我们的开始｡
‫我手动创建了这个字段, 然后我们开始按程序进行操作｡
‫所以两者之间肯定有一点差距｡
‫我刚才展示的解决方案之一就是一个补丁, 一个小补丁｡
‫你不应该真的使用这些当去现场｡
‫所以你应该找到我们在那里的小差距｡
‫但我觉得给你看细节太无聊了｡
‫那么现在我们来看下一章｡
‫哦, 我错过了｡
‫正如你所看到的, 我们的游戏做了它应该做的｡
‫我们有完没完？
‫我觉得我们有声音了｡
‫我们可以收集这些点｡
‫我们很好, 我们有一个很高的分数, 等等｡
‫我认为最重要的是我们的程序世界｡
‫现在, 挑战可能会更高一些｡
‫当然, 你可以一步一步地改变玩家的速度｡
‫然后, 当然, 您还必须更改创建程序贴图的克里思｡
‫就这样
‫好极了｡
‫所以我想这已经足够让你看到我连接26点和下一章, 我们要创建下一个游戏｡
‫所以我希望你被炒作了, 我希望你把这个游戏, 使它变得更好｡
‫所以你让它变得更好｡
‫因此, 请继续添加功能, 你认为会使这个游戏看起来更好, 或什么使这个游戏只是惊人的｡
‫所以, 请继续做这件事, 并与我们分享｡
‫好吧, 我会的
‫所以下一章再见｡