‫無限ランナーにとって最も重要なことが1つあるとすれば､ それは無限であることです｡
‫そして､ 無限の世界を作るためには､ プロシージャルの作成が必要です｡
‫それを手続き的に作る必要がある｡ つまり､ コードで､ コードでやる必要があるのだ｡
‫ですから､ 10億個の異なるロードエレメントやロードパーツの巨大な世界を作りたくはないのです｡
‫それをプログラム的に行いたいのですが､ 手続き的な方法で行うことができます｡
‫それで､ 今やりたいことは､ まず､ クリスタルをセットして､ 世界のどこか､ 自分が位置づけたところではなく､
‫クリスタルを変えたいんです｡
‫道のりを歩んでほしい｡
‫では､ この水晶をここに配置しましょう｡
‫道路の経路に配置しよう｡
‫では､ ついでに他のクリスタルも全部処分してしまいましょう｡
‫削除してください｡
‫あと､ ロードパーツの削除もついでにやってしまいましょう｡
‫そして､ そのクリスタルをゲーム上にドラッグしてみましょう｡
‫では､ 大体ここがいい位置だとしましょう｡
‫上だけかどうか見てみましょう｡
‫上だけでいい｡
‫ええ､ 大丈夫です｡
‫だからいいんです｡
‫そして､ 道路部分にクリスタルを貼りたいのですが､ 今度はクリスタルを非活性化させます｡
‫だから今は､ ご覧のように使えなくなったのです｡
‫起動させなければならないだろう｡
‫そして､ 今度はその道路部分が新しいプレハブになる｡
‫そこで､ この道路パーツをプレハブフォルダにドラッグして､ 後で複数の道路パーツをプロシージャルに作成したいと思います｡
‫わかりました｡
‫その前に､ いつも変わらない基本的な部分があります｡
‫それがある意味､ 私たちの道になるわけです｡
‫では､ ついでにクリスタルも処分してしまいましょう｡
‫そして､ 今度はクリスタルを複製して､ それに合わせて動かしてみましょう｡
‫だから､ 最初の数歩はいつも同じで､ その後に横に移動するようになるんです｡
‫だから､ この作品はずっと変わらない｡
‫では､ ゲームビューを見てみましょう｡
‫ええ､ いつも同じです｡
‫いつもあんなに動いているんですよ｡
‫そして､ 次の作品｡
‫わかりました｡
‫これで地図のスタート地点に立ったわけです｡
‫そして､ 今度はこれを手続き型にして､ ピースを自動的かつ無限に作り出せるようにしたいと思います｡
‫そして､ そのために､ 道路用の新しいスクリプトを作りましょう｡
‫では､ 道路に行き､ コンポーネントと新しいスクリプトを追加し､ その1つを道路と呼ぶことにしましょう｡
‫それでは､ 1つを開いてみましょう｡ ここには修理プレハブが必要です｡ パブリックゲームオブジェクトの道路プレハブを､
‫Unity ですばやく割り当てましょう｡
‫では､ 私たちのところに行ってみましょう｡
‫道路スクリプトまたは道路部分ゲームオブジェクトを書き､ 現在必要です｡
‫よし､ これでいいんだ｡
‫それともプレハブ？
‫かなりね｡
‫わかりました｡
‫次に､ どの時点から､ どのような世界を作ってもらうか｡
‫だから､ ここでエラーになるんです｡
‫役割の部分11は必要ないので､ 削除しましょう｡
‫だから
‫だから､ ロード10から先は､ 新しいロードパーツを作って行きたいと思います｡
‫だから､ ここからが本番です｡
‫だから､ 新しい道路パーツを作りたいときからの位置が必要なんです｡
‫ポジションとは､ 道路部分の位置や変形位置のことです｡
‫そして､ それを見てもらうと､ 007の位置にあるのです｡ 09 では､ その位置を確認してみましょう｡
‫ロードスクリプトに引きずり込むつもりです｡
‫そのポジションを持ちたい｡
‫だから､ 私は新しいパブリックベクター3最後のポストを作成するつもりです､ だから私はそれを呼び出すと､ 私はここでそれを追加するつもりです｡
‫007だったんですね｡ 9か､ ああ9か｡
‫それが､ 前回のロードパーツの位置です｡
‫さて､ ここで知りたいのは､ 物体をどれだけ動かせばいいのか､ ということです｡
‫そこで､ この道路部分を外に配置して､ 今度はその道路パワーを動かしたり､ 複製して､ コントロールとシフトをしながら動かしてみましょう｡
‫そして､ 0ずつ動いているのがわかります｡ 707.
‫だから､ それはかなり私たちのブロックの幅や位置の変化､ そしてそれは幅であるべきです｡
‫わかりました｡
‫では､ ロードスクリプトに戻りましょう｡ ここでは､ オフセットを知る必要があります｡
‫では､ 新しくpublicなfloat offsetを作り､ それを0とします｡ 707をフロートとする｡
‫そして､ 今度はメソッドを作ってみましょう｡
‫スタート方式を廃止するつもりです｡
‫public void, create new road part という新しいメソッドを作ってみます｡
‫そして､ とりあえずデバッグのデバッグログと､ 新しいロードパーツの作成だけしておこうと思います｡
‫そして､ updateメソッドの中で､ ユーザーがボタンを押したかどうかをチェックすることにしています｡
‫そこで､ dot get key downを入力し､ どのキーコードが欲しいか｡
‫キーコードドットスペース
‫そこで､ プレイヤーがスペースを押すたびに､ 新しい道路部分を作りたいと思います｡
‫今はそれで行こう｡
‫そこで､ さらにそのメソッドを作ってみましょう｡
‫そこで､ 新しい道路部分を作成します｡
‫ここで必要なのは何でしょうか？
‫ベクトル3である位置をスポーンする必要があります｡
‫そこで､ スポーンポストベクトル3と呼ぶことにします｡ 0となり､ 位置000となる｡
‫これがスポーン位置で､ 次に､ 0から100のランダムな範囲変数であるチャンスを設定します｡
‫そして､ chanceが50より小さい場合は左側に､ そうでない場合は右側にスポーンしたいのです｡
‫つまり､ chanceが50より小さい場合は正のオフセット､ そうでない場合は負のオフセットにしたいのです｡
‫つまり､ スポーン位置は､ 最後の位置のドットXにオフセットと最後のY位置を加えた新しいベクトル3になります｡
‫だからYで最後の投稿｡
‫そして､ いよいよ最後の投稿ですが､ Zプラスオフセットです｡
‫つまり､ ベクター3のスポーン位置を作成するか､ ベクター3のスポーン位置を割り当てて､
‫後でそれを使ってゲームオブジェクト（道路部品）をスポーンします｡
‫そうでなければ､ 新しいベクトル3つの最後の投稿xからオフセットを引いたものに等しいスポーン位置にしたいのです｡
‫ラストポストYとラストポストZを加えたもの｡
‫それでは､ ゲームオブジェクトを作成してみましょう｡
‫これをGと呼び､ インスタンス化して､ ユニティワールドロードのプレハブ内に作成し､
‫スポーン位置で､ どの基準を持つようにするか｡
‫基準点ularを使うので､ 0で回転させるということです｡ 45と0は､ ゲームオブジェクトも回転しているので､ 道路も回転させ､
‫ここでも回転させたいからです｡
‫そして今度は､ 最後の位置が必要､ または最後の位置を設定する必要があり､ これは位置を変換するためのgです｡
‫だって､ それが新しいポジションなんでしょう？
‫新しいゲームオブジェクトの最後の位置が何であるかを知る必要があります｡
‫そこで､ 最初は最後に手動で設定したポジションで､ 今は常に作成されたもので設定するようにしています｡
‫そこで､ 新しい道路部分は特定の位置を持ち､ それを最後のポスト変数に保存しています｡
‫よし､ じゃあやってみようか｡
‫Unityに戻り､ 分割画面を作りました｡
‫私たちが見たいのは､ シーンで起きていることですから､ ここでは理にかなっています｡
‫だから､ 音は素晴らしいのに､ 本当に早くなくしてしまいましょう｡
‫では､ ゲームビューに入り､ 今度はスペースキーを押してみましょう｡
‫そして､ このシーンビューでご覧いただけるように､ 私たちの世界はタブをもとに作られています｡ もちろん､ 私たちが常にクリックすることを前提にしているのではなく､
‫そうなることを望んでいます｡
‫私たちの持っているポジションをベースに実現してほしいと思っています｡
‫さて､ スクリプトの話に戻ろう｡
‫では､ これを自動で作ってみましょう｡
‫ここで private void wake メソッドを使って､ repeating を呼び出すか､ revoke repeating というメソッドを呼び出すことにしましょう｡
‫そして､ 何をリピートして発動させたいのか｡
‫新しい道路を作るメソッドは､ 1/2秒後に行いたいし､ 1秒ごとに行いたいんです｡
‫では､ それを試してみましょう｡
‫ゲームを保存して､ 今どうなっているか見てみましょう｡
‫では､ それを試してみましょう｡
‫そして､ 毎秒ごとに新しい道路部分が作られているのがわかります｡
‫わかりました｡
‫でも､ それは私たちが望んでいるものとはちょっと違うんです｡
‫というのも､ ゲームを起動せずにそのままにしておくと､ 毎秒､
‫巨大な世界が作られてしまうからです｡
‫しかし､ 私たちがやりたいのは､ ゲームが開始された場合のみ､ それらを作成することです｡
‫では､ どうすればいいのか｡
‫ここでは､ awakeメソッドを使用せず､ 別のメソッドを使用します｡ ここでは､ start
‫start buildingと呼ぶ別のメソッドを作成します｡
‫そして､ ゲームマネージャーからアクセスしたいので､ 非公開ではなく､ 公開にする予定です｡
‫そしてもちろん､ キーを押したことに基づいて新しい道路パーツを作成するキーダウンを使えば､
‫もう更新メソッドは必要ないでしょう｡
‫ここではゲームを開始するので､ これらのオブジェクトを作成するには絶好の場所です｡
‫では､ 型のオブジェクトを探し､ 道路のオブジェクトを探しましょう｡
‫そこにStart Buildingというメソッドがあったので､ これを呼び出すことにします｡
‫よし､ さっそくテストしてみよう｡
‫では､ ゲームにアクセスしてみると､ ヌル参照例外が発生しました｡
‫そしてそれは､ 私がゲームマネージャーを持たなくなったことと関係があります｡
‫では､ どうすればそれを変えられるのか､ 見てみましょう｡
‫新しいゲームマネージャーを作ろう
‫もしあなたもそうなら､ ここにゲームマネージャーを作り､ ドラッグするか､
‫最初にここでリセットして､ ゲームマネージャーをここにドラッグしてください｡
‫ということで､ 今からシーンを保存します｡
‫そして､ それをテストする前に､ 当然ながらスコアテキストとハイスコアテキストを割り当てる必要があります｡
‫では､ そうしましょう｡
‫そして今度は､ もう一度やってみましょう｡
‫これで､ エラーは出ないはずです｡
‫さて､ これで元に戻りましたね｡
‫なんとなく削除してしまったようです｡
‫では､ 次に試してみましょう｡
‫あ､ やってみよう｡
‫ゲームを始めましょう｡
‫そして､ ご覧の通り､ 奥のほうでそこそこプロシージャルにゲームが作られていて､ ちょっと遅すぎるくらいです｡
‫だから､ 私たちのゲームはそれらのピースを作成するよりも速いです｡
‫そこで､ もう少し手早く新しい道路パーツを作ってみましょう｡
‫ちなみに､ 例えば､ 0ごとに作成することも可能です｡ 5秒だから､ その0にしよう｡ 5 F これで問題は解決したはずです｡
‫間隔も問題ないと思います｡
‫見てみよう｡
‫ゲームを開始し､ 十分な作成ができるかどうか見てみましょう｡
‫では､ 何が気に入らないかというと､ やはりそういう作品を生み出すのが目に見えていることです｡
‫まあ､ 今は転んでしまったので､ どうすれば解決できるかというと､ とても簡単なことです｡
‫シンプルにできた｡
‫こことあそこの道路路をなくそう｡
‫まあ､ それはそれで必要なんですけどね｡
‫我々の道路に戻そう｡
‫そのピースをここに複製して､ さらに移動させるだけでいいんです｡
‫実は､ ここに移動させましょう｡
‫もう一度複製してください｡
‫だから､ 私は単純に世界を少し大きくすることができたのです｡
‫では､ 今度はそれを保存しましょう｡
‫そして今はもう､ どこで作成されたものなのか､ 見てはいけないのです｡
‫では､ ゲームを始めましょう｡
‫そして今､ 当然ながら､ 正しい終点がわからなくなってしまったという問題があります｡
‫私たちの道は､ 最後のポジションを持つ必要があるのです｡
‫つまり､ 最後の位置のオフセットで､ 今はこの位置にあるはずです｡
‫というわけで､ 今のロードパート14はラストスパートです｡
‫そこで､ ここで値を変更し､ 道路からZの値も取ってここに入力しましょう｡
‫さて､ ではもう一度やってみましょう｡
‫ピースがどこに作られるのかを見てみよう｡
‫そして､ ご覧のように､ 適切な位置に作成されています｡
‫完璧です｡
‫そして今､ 私の世界はどこに創造されたのかがわからないのです｡
‫そして､ 0と思う｡ 今は歩くより速いスピードで作成しているので､ 5秒でいいはずです｡
‫なるほど｡
‫それはいいことだ｡
‫さて､ クリスタルがないので､ もう一度クリスタルを追加してみましょう｡
‫さて､ どうする？
‫私たちはクリスタルを持ちたいと考えています｡
‫では､ ロードスクリプトに行きましょう｡
‫そして､ この新規作成部分で､ 5段目､ 5本目の道路ごとにクリスタルを配置したいと思います｡
‫そこで､ プライベートなint型road countを作成して0とし､ 道路を作成するごとにroad countを増やしていくことにしましょう｡
‫だから､ ロードカウント・プラス・プラス｡
‫そして､ ロードカウントを5で割って､ モジュロファイブがゼロになったら､ クリスタルをアクティブにします｡
‫つまり､ g transform dotはゼロポジションで子供を取得するので､ 自分自身を追加し､ ゲームオブジェクトを取得し､ それをactiveに設定します｡
‫本当です｡
‫これで､ 5本目の道路にはすべてアクティブクリスタルが設置されることになります｡
‫わかりました｡
‫そして､ このスクリプトを保存してみましょう｡
‫Unityに戻り､ 動作確認をしてみましょう｡
‫だから､ スタートピースには結晶がない｡
‫そのため､ 手動で作成したものには結晶がつきません｡
‫つまり､ プレイヤーはここのある部分をクリアしないと､ クリスタルを手に入れることができないのです｡
‫ただ､ ここでちょっと問題が発生しました｡
‫ご覧の通り､ アニメーションが正しく動作しなくなっていますが､ その理由はお分かりいただけるでしょうか｡
‫それは､ 選手が空中にいた､ あるいは一瞬だけ空中に触れたという事実と関係がありますね｡
‫その頃から､ 動きがおかしくなったり､ アニメーションがうまくいかなくなったりするようになったんです｡
‫だから､ それを直そう｡
‫それを解決するには､ 2つの方法があります｡
‫ひとつは､ ある時点でブロックとブロックの間に隙間ができてしまい､ ブロック同士が完全に一直線にならないことが考えられます｡
‫また､ キャラクターアニメーションに新しいトランジションを追加して､
‫転倒から走行へのトランジションを作成し､ そのトランジションは､ まだ作成していない条件に基づいて行われます｡
‫そこで､ 新しいパラメータを作成し､ そのトリガーをnot falling anymoreと呼ぶことにしましょう｡
‫しかし､ それでは完璧な解決策とは言えません｡
‫ですから､ 私の作品の間に隙間がないかどうかを確認することが､ より良い解決策になると思います｡
‫でも､ それはそれでひとつの選択肢になるのではないでしょうか｡
‫もう落ちない｡
‫では､ そうしましょう｡
‫スクリプトに戻り､ チャートコントローラのupdateメソッドで､ 赤いキャストがこの位置に来なくなったら､
‫is not falling anymoreにトリガーをセットすることができます｡
‫そう呼んでいるのだと思います｡
‫では､ 確認してみましょう｡
‫もう落ちないに変えよう｡
‫というのが正しい表現でした｡
‫だから､ 統一して､ もう落ちないように変えよう｡
‫そして今､ その問題が解決されたかどうかを見てみましょう｡
‫では､ ここでゲームをしてみましょう｡
‫私たちの現場に行けば､ もっといい見方ができるかもしれない｡
‫そして､ さっそくゲームを始めてみましょう｡
‫では､ 次に集めてみましょう｡
‫そして､ ご覧の通り､ そこで倒れていたのです｡
‫少し隙間ができて､ スタートから隙だらけになってしまった｡
‫まあ､ 手動でフィールドを作ったところと､ プロシージャルでやり始めたところ｡
‫だから､ 少し間が空いてしまったのでしょう｡
‫ですから､ 今お示しした1つまたは2つの解決策は､ 単なるパッチ､ 小さなパッチなのです｡
‫本番では､ そういうのは本当に使わない方がいい｡
‫だから､ そこにある小さな隙間を見つけてほしい｡
‫でも､ それを詳しく紹介するのは､ あまりにつまらないことだと思うんです｡
‫それでは､ 次の章をご覧ください｡
‫ああ､ 懐かしいですね｡
‫このように､ 私たちのゲームはあるべき姿をしています｡
‫ゲームの完成形があるのか？
‫音は出ていると言っていい｡
‫そのポイントを集めればいいのです｡
‫私たちは......ハイスコアを出したりしています｡
‫そして､ 一番大事なのは､ 私たちのプロシージャルの世界だと思います｡
‫今なら､ もう少し高いチャレンジができるかもしれません｡
‫もちろん､ プレイヤーのスピードを段階的に変えていくことも可能です｡
‫それから､ 当然ながら､ プロシージャル・マップを作るテンポも変えなければなりません｡
‫そして､ そこに私たちはいます｡
‫素晴らしい｡
‫というわけで､ 26のポイントをつないで､ 次の章では次のゲームを作るというところを見ていただけたと思います｡
‫だからハイテンションで､ このゲームをさらに良いものに仕上げてほしいですね｡
‫だから､ さらに良くするんですね｡
‫だから､ このゲームをもっと良くするために､ あるいはこのゲームをもっと素晴らしいものにするために､ あなたが考える機能を追加していってください｡
‫だから､ ぜひそれをやって､ 私たちと共有してください｡
‫わかりました｡
‫では､ 次の章でお会いしましょう｡