今までの解説で、2Dアクションの通常ステージができました。今回はボス戦を作っていきます。
この記事は本のように順を追って解説しています。この記事は途中のページになります。
この記事を見ていて、現在の状況がわからない場合や忘れてしまった事などが出てきたら↓のリンクから目次ページへ飛べますので立ち戻って見てください。
<Enumを使ってみよう>
ボス戦と雑魚戦の違い
さて、ではボス戦を作っていくのですが、ボス戦と雑魚敵の違いってなんでしょう?
今まで雑魚敵を作ってきたので、それらと同じようにすればボス戦も作れそうです。(↓今まで作成してきた雑魚敵)
ボス戦は動きや、行動などのパターンの多さや難易度の上昇などが有りますが、「作り方」としては雑魚敵と正直大差ないです。
よくよく冷静に見ると雑魚敵もボスも、戦闘の内容自体が変わらない場合がほとんどだと思います。その場合、強かったとしても「作り方」は変わりません。
というか、企業のゲームでも序盤のボスが後半雑魚敵として出てくるというのはよくあることなので、作り方の堺なんて、あってないようなものです。
中には倒すのに仕掛けを使うギミックボスなんかも居たりしますが、今までギミックの作り方も解説してきたので、それらを組み合わせれば作れそうです。
というわけで、今まで解説してきた内容を使えばボス戦を作ることができると思います。
さて、戦闘の作り方としては雑魚敵とボスはほとんど変わりませんが、ボス戦はプレイヤーが「これは強敵だ」と認識させる必要があると思います。
例えば、雑魚敵はその辺をウロウロしていたりしますが、ボス戦は
ボスが登場する演出が入る
↓
ボスと戦う
↓
ボスを倒した演出を行う
という風に、演出を入れることで、特別感を出すことが多いです。この敵は普通の敵より強いんだぞということがプレイヤーに伝わればいいわけですね。
では、これらを、bool型で状態を切り分けて、実装してもいいのですが、今回はenumという便利なものを使って実装してみようかと思います。
enumで状態を切り分けよう
enumというのは、「列挙型」と呼ばれるもので、数値に自分の好きな名前を付けて、まとめることができる機能の事を言います。
説明だけではわかりづらいと思うので、実際にやってみると↓のように書きます
private enum BossState //←「BossState」の部分はenumの名前(自分で定義する) { StartEnsyutu, //←好きなように名前をつけることができる Battle, ClearEnsyutu, }
enumでボスの状態を定義します。
・ボス登場演出中
・戦闘中
・ボスを倒した演出中
みたいな感じです。
このように、自分の好きな名前で定義することができるのがenumのいいところです。好きな名前で定義できるので、状態の管理を行うのに便利です。
使い方としては↑で定義したenumの変数を用意します。
private BossState nowState = BossState.StartEnsyutu;
↑のように変数を用意し、その中に現在の状態を入れることで、処理の切り分けができそうです。
例えば
private void Update() { switch(nowState) //←nowStateには現在の状態が入っている { case BossState.StartEnsyutu: //登場演出時の処理を書く break; case BossState.Battle: //戦闘中の処理を書く break; case BossState.ClearEnsyutu: //クリア時の処理を書く break; } }
という風にすれば処理の切り分けが簡単に行えます。あとは、切り替えたいタイミングでnowStateの中身を変えてあげればいいだけです。
例えば登場演出が終わった際に
nowState = BossState.Battle;
と書けば、状態を登場演出→戦闘中に切り替えることができます。
こんな感じでenumで状態を切り替えていけば、わかりやすくプログラムが書けそうですね。
↑ではボスの状態を3種類にしていますが、もちろん、自分の作るゲームに合わせて好きなように定義してもらえればと思います。
演出について
演出ですが、今まで解説してきたものを使えばもう作れると思います。
例えば↓の記事ではAnimationCurveを使って演出を作っていましたし
↓の記事ではキャラクターのアニメーションを作っていますが、演出用のアニメーションも同じように作ることができます。
↑と全く同じものの作り方は、ちょっと文章では難しいので、この記事の一番上にある動画の方で解説します。いろいろなやり方があるし、いろいろな魅せ方もあると思うので、皆さんも自分の好きなように作ってみてください。
AnimationCurveであればTime.deltatimeを足して一定の秒数過ぎれば終了判定が取れますし、アニメーションファイルであれば↓の記事で終了判定の解説をしています。
演出が終わったらnowStateを次の状態にすればOKです。
戦闘について
戦闘中の挙動についても、今までの解説で作れるようになっていると思うので、自由に作ってもらえればと思います。
とりあえず、自分は単純に左右を往復し、端についたら巨大化、反対側に行くにつれ小さくなっていく敵というのを作ってみました。
両端の位置が分かっていれば、速さ=道のり÷時間ですので
(右端のX座標ー左端のX座標)÷ 何秒で端へ行かせたいか
で速さが求められるので
Rigidbody2D.velocity = 算出した速さ;
とすれば移動させることができますし、段々小さくなる処理も、移動にかかる時間が分かっているなら
transform.localScale = Vector3.one + Vector3.one * 加算する大きさ * (何秒で端へ行かせたいか – 移動中の時間)
で巨大化した状態から移動に伴って小さくすることができます。
巨大化した状態だと踏みつけることができませんが、小さくなってきたら踏みつけが可能になるという感じです。
と、まぁ、こんな形で、今までの解説で出てきたものを使えばいろんなボスを作れると思うので、みなさん好きなように作っていただければと思います。
そして、ボスにダメージを与えた際に
if(damage) //ボスにダメージを与えた場合(踏みつける等) { --hp; if(hp <= 0) { nowState = BossState.ClearEnsyutu: } else { //点滅してしばらく無敵になるとか //(点滅のやり方はプレイヤーのスクリプト参照) } }
こんな感じにして、敵のHPが0になったらクリアー演出に行き
ボスが倒れるなどのクリアー演出が終わったら
using UnityEngine.SceneManagement;
SceneManager.LoadScene(次のステージなり、エンディングなりへ);
で次のシーンへ飛ぶ、もしくは、閉じていた扉が開く(扉.SetActive(false);)などすれば次へ進むことができます。
はい、というわけで、ボス戦はこれで完成です。戦い方や処理の中身は皆さんのお好みで作ってください。わからない方は今までの解説を見直していただければと思います。
あとは、今まで作成したステージと繋ぎ合わせればゲームは完成です。
ステージ数や長さなどもお好みで作ってもらえればと思います。
次回は、できたゲームをビルドして公開するところまで解説して、入門講座の最終回としたいと思います。