神々のトライフォースのリンクの攻撃処理を実現するには
こんにちは。なおキーヌです。
ブログ毎日更新は274日目になります。
ファミコンからスーパーファミコンになって色々驚きを受けた世代なので
現代になってもいまだに古いゲームが好きな懐古厨です。
しかし自分一人でゲームを作ろうとすると世の中に出てるようなうすごいクオリティのゲームを
作ることなんてかなりハードルが高いわけですね。
そこにたどり着くには必然的にファミコンースーパーファミコンで使われた処理を
最低限できなければゲームクリエイターとしては伸びにくいかと思います。
もちろん、3Dと2Dは別物なので勉強する分野はかなり変わってきますが、
2Dで身につけた処理は2Dにも応用できるので覚えておいて損はありません。
今回は私が現在Unityで作っているゼルダの伝説風アクションRPGを作るために
神々のトライフォース(以下神トラ)のリンクの攻撃や動きを研究しています。
その中で1回の攻撃でココまで細かい処理をしてるんだなぁと感動したので
今回記事にしてみました。
リンクの剣による攻撃の種類を洗い出してみよう
リンクと言えば、剣による攻撃です。
道具も使いますが基本的には斬撃・突撃がメイン攻撃になります。
神トラの場合はBボタンを押すとリンクは剣を水平に振ります。
そして長押しすると剣を構え、リンクの得意技「回転斬り」の準備に入ります。
溜めが終わりボタンを離すと回転斬りが発動しますね。
シリーズにもよるのですが、回転斬りをするには剣を前方に突き出して
その判定に触れるとリンクは溜めを中断して突き攻撃に切り替えます。
以上のことからリンクの攻撃は以下の種類になります。
- 斬り払い
- 回転斬り
- 突き
とてもシンプルですね。
スマブラであればここに兜割(ジャンプして剣を下に向けて落下する攻撃)や上突き・後方斬り・三段斬りなど様々な技が増えています。
しかしトップビューのゼルダの場合は基本的にこの3つの攻撃に絞られます。
絞られるのは作る側としても楽ですね(笑)
ちょい押しと普通押しで条件分岐している
実は神トラのゼルダ、やったことがある人ならすぐにわかると思うのですが
Bボタンちょい押しと長押しで剣のモーションが切り替わります。
普段ゲームをしているとあまり意識しないでプレイできるのですが、
状況によってはBボタンを連打する時があります。
その時に剣を最後まで降っていると、剣の判定のない場所に入り込まれた場合
リンクはダメージを受けてしまいます。
次々と迫ってくる敵に対応するために、プレイヤーはリンクになりきって
剣を連続して振るために連打をし始めます。
ここでちょい押しと普通の押しで攻撃を切り替えてる恩恵が発動するわけですね。
ちょい押し攻撃というのは角度で言えばざっくり90°剣を振るモーションになります。
そして普通の押しの場合は180°剣を振る攻撃モーションです。
多分素人がゲームを作ろうとした場合、ちょい押しと普通押しの処理を分けずに作るので
なんか微妙なゲームが出来上がってしまうのだと思われます。
こう言った微妙なボタンの変化を取り入れることで完成度を高めることができます。
長押しで回転斬りをするための準備に入る
普通押しをして剣を降った後にまだボタンを押し続けていると、
リンクは溜めモードに切り替わり回転斬りの準備に入ります。
そして一定時間経った後にボタンを離すと回転斬りが発動しますね。
内部的なことを言うとボタンを押している間は数値が増え続けます。
その数値を毎フレーム監視しておき規定の値が溜まったら条件を満たす。
という風に処理を作っています。
コードにすると以下のような感じですね。
カウントが100になったら回転斬りできる準備が整ったことにしましょう。
' ボタンカウント変数
VAR BUTTON_COUNT = 0
' ボタンが押されてるかどうかのフラグ
VAR BUTTON_PRESS = #FALSE
' 回転斬りができるかどうかのフラグ
VAR SP_ATTACK = #FALSE
LOOP
' ボタンが押されてるかどうか
IF BUTTON_PRESS THEN
' ボタンカウントが100以上になったかどうか
IF BUTTONCOUNT > 100 THEN
' 回転斬りフラグをON
SP_ATTACK = #TRUE
ELSE
' 回転斬りフラグをOFF
SP_ATTACK = #FALSE
ENDIF
' 回転斬りの準備ができていなければカウントをためる
IF !SP_ATTACK THEN
INC BUTTON_COUNT
ENDIF
' ボタンカウントによって攻撃モーションを切り替える関数(処理内容割愛)
PLAYER_ATTACK(BUTTON_COUNT)
ELSE
' ボタンが押されてないならカウントをリセット
BUTTON_COUNT = 0
' 回転斬りフラグがONになっていれば
IF SP_ATTACK THEN
' 回転斬りを発動
PLAYER_SP_ATTACK
ENDIF
ENDIF
ENDLOOP
こんな感じでしょうか。
ボタンカウントによって様々な条件を分岐させています。
ボタンを押した時に攻撃モーションを切り替える「PLAYER_ATTACK」を少し説明すると
ボタンカウントが1の時は90°斬るモーションを動かし、一定フレーム数押されていたら
途中で180°斬るモーションに切り替えたりします。
そしてボタンが押されていたらカウントがどんどん溜まって
100になったら回転斬りフラグがONになり、ボタンを離したときに
そのフラグをみて回転斬りをするか否かを決めます。
実際のゼルダはもうちょっと複雑な処理をしていると思うのですが、
基本的にはこのコードの考え方で大丈夫です。
あとはゲーム制作ツールやプログラミング言語によって色々かわりますね。
武器を出している時に剣に触れると突き攻撃になる
先ほどの攻撃処理のコードに条件分岐を加えるとより一層神トラゼルダに近づきます。
リンクは攻撃ボタンを長押しすると剣を振り終わった後に前方に剣を突き出します。
この時点で溜め処理が入るのですが、剣は前方に突き出しているため衝突判定が出ています。
その溜めている状態で衝突判定の範囲に入るとリンクは溜め流のをやめ突き攻撃に即座に切り替えます。
そしてボタンカウントはリセットされるといった感じですね。
この突きは攻撃するためだけではなく、怪しい壁を探したりもできます。
このようないろんな処理を含むのでゼルダの伝説は剣を振ってるだけでも面白いゲームになっています。
ここまででリンクの攻撃1つで様々な処理が判明しましたね。
開発者目線になるといろんな分岐があることに気づきますが、
プレイヤー目線だとそんな複雑な分岐を一切気にすることなく遊べるのがすごいところですよね。
実際に遊んでみて、そしてそれを作ろうとしてみると開発者のプレイヤーに対する配慮が感じられます。
実際に自分でゲームを作っていて、なんかちがうんだよなぁ…
ってなることがとても多いです。
というのも、おそらくはこう言う細かい処理を作り込んでいないせいだと思います。
面白いと思うゲームを作るには、自分が面白いと思ったゲームの処理をじっくりと観察してみることをオススメします。
クオリティの高いゲームを作られるように日々研究です!