i-school - RPG要素を設計する

成長要素を設計する

 プレイヤーがゲームを通じて手ごたえを感じる手段は色々あると思いますが、それらは数字的、あるいは外見的な変化などによって
成長した証として提示する方法が最も一般的です。ユーザーがPlayerに対して思い入れを深め、それをゲーム内に反映・投影できれば、ゲームはより楽しいものになります。

 そういった中では、例えば成長要素を用いることが分かりやすく、またゲームの内容的にも利用しやすい情報であるといえます。

・レベルという概念があり、敵を倒すことで経験値が加算され、一定値を超えるとレベルがアップする

 テーブルトークRPGの時代より使われている概念ですが、それが現在でも通用しているのは、その分かりやすさであると考えます。
数字が大きくなるにつれて、プレイヤーの能力が上昇していく過程を楽しみながら、明快に成長を実感できることも大きいでしょう。
もちろん、レベルの要素がなくても充分に成長要素を組み込んでいくことが出来ます。
 そういったことを念頭に置きながら、このゲームにおける成長要素とはなにか、それはどういったものであればユーザーは満足して楽しめるのかを考えていきましょう。

 大まかに考えていきますと、アクションゲームにおいては、レベルアップ以外においては、以下の要素が主な成長要素となりうるのではないでしょうか。

・新しいアクションを覚えて、操作可能になる(例:2段ジャンプ、スライディング、側転回避、落下攻撃、など)
・徐々に強いアイテムが入手/購入できる(例:装備品によって敵を倒しやすくなる、倒せない敵を倒せるようになる、など)
・ゲームを進行できるようになるアイテムが入手/購入できる(例:行けなかった場所に行けるようになる、以前は発見できなかったものを見つけられるようになる、など)
・徐々に魔法や特技などを習得できる(レベルに応じて習得、スキル用のツリーで自由に習得、など)

 これはどのアクションゲームにも組み込める要素であると思います。あとは、自分のゲームの世界観に上手くマッチさせていくことが重要です。
 プレイヤーの疑似体験を通じて、プレイヤー自体もゲーム内で一緒に成長を感じることが出来れば、それは最高のゲーム経験になります。

 今回のアクションゲームでは、以下のように設計をします。
1.敵を倒すごとに経験値を取得し、その値が現在のレベルによって設定された目標値を超えるとレベルが1つ上昇する。最大レベルは100とする。
2.目標値とは (100×現在のレベルの二乗 - 現在の経験値)とする。獲得した経験値はレベルが上昇してもリセットされない。
3.敵から獲得できる経験値は20〜50前後。クリティカルして倒した場合には、経験値×クリティカル倍率獲得できる。
4.レベルが1つ上昇すると、プレイヤーの能力値を上昇させる。
5.上昇する能力値は「最大HP」と「攻撃力」で、上昇幅は5〜10とする。

 順番に、実装の手順を考えていきましょう。

実装を考える

 

1.敵を倒すごとに経験値を取得し、その値が現在のレベルによって設定された目標値を超えるとレベルが1つ上昇する。最大レベルは100とする。

 経験値とレベル、それから敵の経験値について、実装を考えます。
いずれもint型で用意すればよいと思いますが、それぞれをどこのクラスで管理をさせるかも考えます。

 経験値は敵を倒すたびに取得できる値ですので、こちらはPlayerControllerに用意、管理をさせます。
レベルについても同じクラスでよいでしょう。

 敵の経験値は、敵のクラスに管理させたいと思いますので、EnemyControllerに用意します。

 レベルの最大値は100とします。これ以上には成長しませんのでオーバーしないように処理を考えます。

2.目標値とは (100×現在のレベルの二乗 - 現在の経験値)とする。獲得した経験値はレベルが上昇してもリセットされない。

 現在のレベルを基準に、次のレベルまで必要な経験値を目標値として設定します。
レベルが上がると自動的に計算するように処理を考えます。

 目標値は(100×現在のレベルの二乗 - 現在の経験値)として計算して算出します。
また、レベルがアップしても経験値はリセットされずに加算される方式にします。

 たとえば、経験値が0の場合、レベル1から2になるには100 - 0 = 100が必要な目標値となります。
経験値100の場合、レベル2から3になるには400 - 100 = 300が必要になります。
 

3.敵から獲得できる経験値は20〜50前後。クリティカルして倒した場合には、経験値×クリティカル倍率獲得できる。

 EnemyControllerクラスに経験値(int exp)を用意します。値は20〜50の間で、敵を生成時にランダムで設定されるように処理を追加します。

 またクリティカルして敵を倒すことが出来た場合には、獲得できる経験値は、クリティカルの倍率を乗算した値にします。
例えば、経験値30でクリティカル倍率が2.5である場合、クリティカルして敵を倒した場合には70の経験値を獲得できるように処理を追加します。

4.レベルが1つ上昇すると、プレイヤーの能力値を上昇させる。

 まず、敵を倒したタイミングでプレイヤーには経験値が加算されるように、PlayerControllerクラスに処理を追加します。
その処理の中で、経験値が目標値を超えているかチェックし、目標値を超えている場合にはレベルアップ処理を行うようにします。

 また一度に複数のレベルがアップする可能性もありますので、レベルがアップするチェックは1回だけではなく
経験値が目標値を上回っている分だけ行うようにします。

5.上昇する能力値は「最大HP」と「攻撃力」で、上昇幅は5〜10とする。

 今回は2つの能力値のみを成長させるようにしましたが、他にも能力値がある場合には、それらを含めてもいいと思います。
また、すべての能力値を上昇させる以外にも、ランダムで能力値を1つ、あるいは複数個を選択し、その値をさらに、ランダムな幅で上昇させます。

 たとえば、クリティカル発生率は1〜3の値、他の能力値は5〜10の値の中から選択されるようにします。
今回は固定値として5〜10を用いますが、これらを外部で設定できるようにしておいて、上がり幅を調整できるようにしておいてもいいでしょう。

EnemyControllerに経験値と経験値の加算処理の呼び出しを実装する(3の処理)


 これらの点を踏まえて、EnemyControlerクラスを修正していきます。
また、OnTriggerEnterの中の処理が長くなりましたので、処理をわかりやすくするために、TakeDamageというメソッドを作成しています。

 <= +ボタンを押すと開きますので、自分なりの実装を行った上で確認をしてみましょう。


PlayerControllerに経験値加算処理とレベルアップ処理と能力値上昇処理を追加する(1,2,4,5の処理)


 PlayerControllerに、設計した処理を実装していきます。


 <= +ボタンを押すと開きますので、自分なりの実装を行った上で確認をしてみましょう。