ITエンジニアのための勉強会・イベントレポート情報メディア

Unityで作ろう!ゲームアルゴリズム(16)ひっぱりアクションのアルゴリズムを作ってみる
skill

Unityで作ろう!ゲームアルゴリズム(16)
ひっぱりアクションのアルゴリズムを作ってみる

2018.03.08

 
  • このエントリーをはてなブックマークに追加

最近UniRxを使い始めました。
UniRxはリアクティブプログラミングを行うためのライブラリで、とっても便利&斬新なので「うわコレ使いこなしたい!」という気持ちがモリモリ湧いてきています。(リアクティブプログラミングの詳細は説明すると長くなるので、いずれ機会があればということで)
難点は学習コストがやや高いのと、クラス設計がちょこっと難しくなること。
ただ、リアクティブプログラミングはさまざまな開発言語でライブラリが出ていますので、いったん覚えちゃえば色々活用できますよ。

さて、今回はひっぱりアクションのアルゴリズムを作ってみましょう。

賀好 昭仁

ひっぱりアクションとは

ひっぱりアクションは「自キャラをひっぱって飛ばす」という直感的でシンプルな操作が特徴で、モンスト系ゲームとも呼ばれています。
タッチ操作との相性がとても良いので、スマホゲーム界での人気は今後も続くでしょう。

なお、とても有名なのでご説明する必要も無いかもしれませんが、モンスト(モンスターストライク)は経営赤字だったmixiを一発で黒字に押し上げた大ヒットスマホゲームです。

キャラを引っ張って飛ばすお手軽さにRPG要素が加わることで奥深いゲーム性を持ち、ライトユーザからヘビーユーザまで幅広く受け入れられています。マルチプレイも大きな魅力のひとつですね。

要件を考えてみる

Unityでひっぱりアクションを作るにあたって、必要な要件を洗い出していきましょう。今回はモンストを参考にしたゲームシステムにします。

ゲームのルール

まずはどのようなルールにするか検討します。

  • ・キャラを引っ張って飛ばし、敵にぶつけるとダメージを与えられる
  • ・自キャラが全滅したらゲームオーバー
  • ・敵キャラが全滅したらステージクリア
  • ・自キャラを一定回数飛ばすと、敵が行動する

といったところでしょうか。

ゲームオブジェクト

前述のルールですと、必要なゲームオブジェクトはこんな感じ。

  • ・プレイフィールド(枠)
  • ・自キャラ
  • ・敵キャラ

パラメータ

各キャラにパラメータを持たせる必要もありますね。

  • ・HP
  • ・攻撃力

があれば一応成り立ちますが、ちょっと寂しいので

  • ・スピード
  • ・すべりやすさ

などのパラメータも付与してみましょう。

余談ですが、筆者はとてもすべりやすいです。(あ、またすべった)

オマケ(必殺技)

せっかくなので、必殺技も実装してみましょう。

実装するのは

  • ・5回跳ね返るまではスピードが落ちない
  • ・ぶつかったときレーザーが出る

の2種類にします。

・5回跳ね返るまではスピードが落ちない必殺技
物理演算でスピードを落とさないためには、摩擦抵抗を無くしてあげる必要があります。氷の上を滑らせるようなイメージですね。

必殺技発動時にカウント「5」を持たせて摩擦抵抗を0にし、衝突判定のたびにカウントを減算。カウントが0になったら摩擦抵抗を元の値に戻してあげればOKです。

・ぶつかったときレーザーが出る必殺技
レーザーの演出であればUnityパーティクルシステムの得意とするところです。
ただ、当たり判定が必要なことを考えますと、パーティクルシステムを使わず衝突時にレーザーの画像をびよーんと伸ばしたほうが素直な実装になりそうです。

ひっぱりの実装方法を考えてみる

今回の実装のキモとなる、ひっぱりの実装を進めていきましょう。
(物理演算や衝突判定は特筆すべき処理がないので省略します。詳しくは後述のサンプルプロジェクトをご確認ください)

ひっぱりの判定は、Dragイベントを使うことで実現可能です。Event Triggerコンポーネントを使えばDragイベントがとれますので、こちらをキャラにアタッチしましょう。
https://docs.unity3d.com/ScriptReference/EventSystems.EventTrigger.html

OnBeginDrag()でタッチ開始座標を取得、OnDrag()で、現在のタッチ座標 - タッチ開始座標でひっぱりのベクトルを算出します。
このベクトルに応じて、キャラにひっぱりの強さの矢印を表示するイメージです。

キャラを飛ばすのはOnEndDrag ()で、ひっぱりのベクトルに応じてキャラのRigidbodyを操作しましょう。
AddForce()で力を加えるのも良いですが、velocityを直接変更した方がわかりやすいかもしれません。

うーむ、カンタンですね。

なお、ぶつかった相手のキャラが動くと軌道の予想がしづらくなります。ゲームをシンプルにするのであれば、飛ばすキャラ以外のRigitbodyをStaticにし、ぶつかっても動かないようにしておくと良いでしょう。

余談ですが、操作対象のキャラが決まっているのであれば、画面のどこをひっぱってもOKにした方が喜ばれそうです。

作ってみた

ということで、サンプルプロジェクトを作ってみました。
https://github.com/akako/gamealgorithm-hippari-action/releases/tag/for_algorithm16

シンプルな実装で、ちゃんとひっぱりアクションできていますね!

ちなみに、摩擦や衝突での減速処理はUnityの物理エンジンを活用するよりプログラム側で制御した方がそれっぽい動きになることがわかりました。物理エンジンも使い所次第ということですね。

余談:物理エンジンではビリヤードは再現できない
唐突ですが、ビリヤードを思い浮かべてみてください。

決められた形の台の上で、決められた弾を、決められたルールに従って落とす。
ただそれだけの遊びなのにビリヤードはたくさんの人を魅了し、その道のプロまで存在します。
ただ、「物理エンジンを使ってビリヤードのゲームを作ったら大ヒットするか」と問われると、答えはNOです。
なぜかというと、「どう身体を使うか」や「弾を突いたときの感触」など、物理エンジンでは表現できない要素が無数に存在するため、どうしても物足りなさを感じてしまうのです。

ここをカバーするため、デジタルゲーム化した場合に欠落しがちな要素を足してあげましょう。不足しがちな要素はいろいろありますが、「上達感」と「心地よさ」などです。

これらをカバーするために、例えば
・上達感:上達のためにさまざまなアプローチをとれる(工夫ができる)ようにする
・心地よさ:操作性/エフェクト/効果音にとことんこだわる

を盛り込むことができれば、きっと長く愛されるゲームになるでしょう。

まとめ

ゲームの実装は物理エンジンのお陰でとってもカンタンでした。(というか、カンタンすぎて「特筆するほどのアルゴリズムが無い」という大きな誤算がありました・・・。)

ひっぱりアクションは、ちょっと見方を変えてみると「おはじき」遊びに味付けをしたものと捉えることもできます。子供のころの遊びや、普段遊んでいるアナログゲームに少しデジタルなアレンジを加えることで、新しいジャンルのゲームを生み出すことができるわけです。

自分が新しいジャンルを生み出すって、ちょっとステキですよね。

次回予告

今回は処理の大部分を物理エンジンに任せちゃいましたので、次回はプログラムをガッツリ書く必要がありそうな定番カードゲームを作ってみますよ!

原稿: 賀好 昭仁
qnoteスマホアプリ開発チーム技術主任。PHP・Android・iOS・Unityなど複数のプラットフォームでの開発を行う。
しばしば7匹の先輩猫社員たちにイスを占領される。

Unityで作ろう!ゲームアルゴリズム(16)ひっぱりアクションのアルゴリズムを作ってみる

この記事はどうでしたか?

おすすめの記事

キャリアを考える

BACK TO TOP ∧

FOLLOW