ほとんどのタワーディフェンスゲームでは、ゲーム内の時間が経過するごとに、カレンシー(通貨)が蓄積されていき、
それを各キャラごとに設定されているコスト分消費することによって、キャラをゲーム内に配置できるようになっています。
(各用語はゲームにより異なりますが、システム的な挙動は同じです。カレンシーがマナという名称であったりします)
すでにキャラを配置する処理は出来ていますので、この部分にコストの確認と支払いの機能を追加し、
コストを支払ってはじめてキャラを配置できるように修正を行います。
今回の手順の設計では、このコストの支払いに利用できるカレンシーの要素を実装することが目的です。
次の手順で、このカレンシーを利用して、コストを支払ってキャラを配置する処理を実装するようにしていきます。
このように新しい機能の実装は、複数の異なる機能の実装の積み重ねと、それらを上手く組み合わせてロジックを作ることによって実装されます。
まずはカレンシーの要素について、処理の全体の流れを考えていきます。その後、設計のロジックを考えましょう。
スクリプトを書くのは、これらが完成し、処理の全体が出来上がってからになります。
イメージを作っていくことが非常に重要になりますので、想像力をふんだんに働かせてください。
カレンシーを管理するには、カレンシーだけではなく、それに関わるいくつかの情報が必要です。また、この情報をどのクラスに用意して管理させるかも一緒に考える必要があります。
特にカレンシーを管理しているクラスを参照することが困難であると、スクリプトからカレンシーを参照することが難しくなるためです。
そのため、カレンシーを利用したいクラスがどの位あるのか、その場合、そのクラスにカレンシーの情報があったら便利か、という観点で設計をしていく必要があります。
カレンシー、および、カレンシーに関連する情報をまとめます。
・カレンシー ゲーム内の時間の経過に合わせて加算され、コストを支払う際に充当される値
・タイマー ゲーム内の時間の経過を計測する値
・タイマー目標値 ゲーム内の時間の経過をタイマーで計測した際、タイマーの値が目標とする値。この値を超えることで、カレンシーに加算処理が入る
・カレンシーの加算値 タイマーの値がタイマー目標値を超えるたびに、カレンシーに加算される値
・カレンシー最大値 カレンシーの最大値。この値以上には加算されないように制御する
値をどのように利用するかは設定しました。
あとは、これらの情報を使ったロジックを考えて、カレンシーの値がゲーム内の時間経過に合わせて加算していく処理を考えてみてください。
これらの情報は、すべて同じクラスに管理させる、というものでもありません。
この値はどのクラスにあればいいか、という風に考えながら処理とつなげていく必要があります。
例えば、タイマーの値は、すべてのクラスで利用する情報ではありませんので、実際にゲームを管理している GameManager に用意する、といった形です。
次は、先ほどのカレンシーの情報を変数として作成する場合には、どのような型で、どのような変数名にするべきかを考えていきます。
参考までにご紹介しますが、ご自分のわかりやすい名称を採用してください。
[Header("カレンシー(コスト用の通貨)")]
public int currency;
[Header("カレンシーの最大値")]
public int maxCurrency;
[Header("タイマー目標値(カレンシー加算までの待機時間)")]
public int currencyIntervalTime;
[Header("カレンシーの加算値")]
public int addCurrencyPoint;
int timer;
続いては、これらの値を使ったロジックの作成です。
どのようなロジックにすれば、
これらの情報を元にして一定時間経過後にカレンシーの値を加算していく処理が実装できるかを考えてみてください。
主な手法としては、Update メソッドを活用する方法と、コルーチンメソッド内で while 文を活用する方法があります。
while 文の場合は yield return null の処理を組み合わせることにより、疑似的な Update メソッドのようなフレーム単位でのタイマーの計測が可能になります。
特に while 文を利用する場合には、無限ループ状態の発生によってゲームがフリーズしないように気を付けてください。
紙などにロジックをフローチャートのようにして書いていくと処理を可視化して確認できますので、ロジックを作りやすくなると思います。
また、このロジックを組み込みたいスクリプトの候補が浮かんでいるのであれば、そのスクリプト内にフローチャートのコメントを順番に書いておくといいでしょう。
実装したい処理を細かくコメント化しておくと、プログラムを作っていく際に役立ちます。
カレンシーの値を一定時間ごとに加算する処理のロジックが完成したら、次は、その情報をゲーム画面に表示する処理を考えてください。
内部的にカレンシーの値が加算されていても、ゲーム画面上に現在のカレンシーの値が表示・更新されていないとユーザーはカレンシーを認識できません。
よって UI としてゲーム画面に表示することが大切です。
表示する位置や、表示を更新するタイミングなども考慮してください。例えば、一定時間ごとにカレンシーの値が加算されるのであれば、
Update メソッドで常時カレンシーの表示を更新する必要はありません。加算されたり、コストが支払われたりして、カレンシーの値に変更があったタイミングで
画面のカレンシーの値が更新される方が適切な処理であるといえます。そういった観点で処理の更新についても考えてみてください。
UI の管理については、カレンシーの加算処理を行っているスクリプト内でもよいですし、新しく UI 管理用のマネージャークラスを作成してもいいです。
今後、UI の表示が増えることを考えた場合には、UI 管理用のマネージャークラスを作成しておいた方が管理はしやすくなります。
ここまで完成したら、あとは実際にロジックをプログラムとして組み込んでいく作業になります。
ロジックを使った処理を作るために、必要になる情報を作成することから始めます。
今回であれば、カレンシーに関連する値をスクリプト内に新しく追加する部分です。
既存のスクリプトに書くのか、新しくクラスを作るのかはすでに決まっているはずですので、そちらにカレンシー関連の変数を追加します。
この部分を完成させてから、最後に、この値を利用したロジックを作成していきます。
なぜなら、必要な情報がなければロジックを組むことができないためです。
続いて、UI 関連の処理に移ります。カレンシーの値を表示するゲームオブジェクトを作成します。
また、UI 管理用のマネージャークラスを作成を行います。