Unityでダメージを受けたら点滅させ一定時間無敵にする

アクションゲームやシューティングゲームで敵に当たると自機が点滅して一定時間無敵になる、なんていう処理は良く見かけます。
今回はとてもシンプルにそれを作ってみたいと思います。

処理の流れはこのように考えてみます。

  1. 敵にあたったら
  2. 点滅して一定時間動けない
  3. 点滅したまま一定時間無敵になる
  4. 通常に戻る

それではUnityの新しい2Dプロジェクトを作りやっていきます。
今回もサイズは960*540で作ってます。
ちなみになぜいつもこのサイズかと言いますとUnityRoomのデフォルトのゲームの画面サイズが960*540なのでこれにしています。

Unityスキルアップ、
始めるなら今

パズル、脱出、RPG...目標のゲームを完成させよう!

人気のUnity講座はこちら

Udemy講座

プレイヤーとエネミー設置&設定

まずHerarchyにPlayerとEnemyとなるゲームオブジェクトを設置します。
シンプルに四角を2つおいてそれぞれPlayerとEnemyにしました。
プレイヤーとエネミー設置&設定

続いてそれぞれのInspectorを調整していきます。
PlayerにはBoxCollider2DとRigidBody2Dを追加します。
今回重力は関係ありませんのでRigidBody2DのGravityScaleを0にしておきます。
BoxCollider2DとRigidBody2D

Enemy側も設定していきましょう。
位置を少し下にずらし、色を赤にしておきました。
そしてPlayer同様BoxCollider2Dを追加しisTriggerにチェックを入れておきます。
BoxCollider2DのisTrigger

ゲームビューではこんな感じになっています。
Unityエディタゲームビューの確認

プレイヤーにスクリプトをアタッチ

続いてスクリプトをPlayerにアタッチします。
以前こちらの記事で作成したPlayerControllerを改造していきます。

最初に必要となる変数等の宣言とStart関数でSpriteRendererとBoxCollider2Dを変数に代入しておきます。
Update関数内ではPlayerの移動を実装しています。
コードはこのような感じです。

忘れないうちにPlayerのInspectorからspeed、flashInterval、loopCount等を設定しておきましょう。
Playerの各種パラメタ設定

これでPlayerが動くようになりました。

エネミーにあたったらプレイヤーを点滅させる

次にEnemyにPlayerが当たったら点滅させてみます。
点滅方法はcolorを変えるなど色々方法があるかと思いますが今回はシンプルにPlayerのSpriteRendererのオンオフで点滅を実装します。
OnTriggerEnter2D関数を使いEnemyと接触したらコルーチンで点滅させることにします。
具体的にはこんな感じになりました。

では実際にEnemyに接触してみます。
このような感じで点滅してくれました。

これで点滅は実装できました。次にプレイヤーのステートを操作してダメージ中は一定時間動けない、無敵中はコライダーをオフにする等を実装していきます。

無敵時間の実装

プレイヤーのステートは通常、ダメージ、無敵の三種類定義しました。
それぞれの状態の時にどうなって欲しいか整理してみます。

  1. 通常(NOMAL)→動ける、ダメージ受ける
  2. ダメージ(DAMAGED)→動けない、ダメージ受けない
  3. 無敵(MUTEKI)→動ける、ダメージ受けない

こんな風になっていてくれたらいいのかなと思います。
ではPlayerが動けない時はダメージ中なのでUpdate関数内に少し追記します。

これでPlayerのstateがDAMAGEDなら動けなくなりました。
次にstateをDAMAGEDに変更します。
変更するタイミングはenemyに当たったタイミングです。
OnTriggerEnter2D内に記述しましょうか。

これで大丈夫かと思います。

続いて無敵時間を作りましょう。
コルーチン_hit()内に記述していきますが、流れを確認します。
わかりやすいように本来やらなくても良い色の変更処理も追加します

  1. 当たり判定をオフにする
  2. ダメージ中(動けない時)は黒にする
  3. 点滅ループ開始
  4. 点滅中、一定時間経過後にstateをMUTEKIにする
  5. MUTEKI中は緑にする
  6. 点滅ループ終了
  7. stateをNOMALにする
  8. 当たり判定をオンにする
  9. 色を白にする

ダメージ中と無敵中の色を追加したので少し長くなりましたがこんな感じでしょうか。
実際の_hit内の処理はこんな感じになりました。

実際に動かしてみましょう。

期待していた動きになってくれたかなと思います。

ここで一つ不要な変数が出来ました。
boolのisHitです。

OnTriggerEnter2Dでダメージ処理になるのはstateがNOMALの時です。
なのでisHit変数を削除し最終的にはこのようなコードになりました。

これ以外にもっとスマートな点滅&無敵方法はあると思いますが、僕はこんな感じで実装してみました。

おすすめUnityオンライン学習

一人でゲーム開発が不安な方はオンラインスクールで学習すると効率が良いと思います。
以下に当てはまる人は検討してみると良いかもしれません。

「ゲーム作りけど何から初めればいい?」
「入門書をの次に何をしたらいいの?」
「疑問や問題を一人で解決出来ない。。」
「ゲームを完成させる自信がない。。」
「気軽に質問できる環境が欲しい。。」

自分で学習することに限界を感じたら
オンライン学習しましょう!

Udemy

Udemy
特徴:教材動画買い切り型
レッスン方法:動画教材/Q&Aで質問
習得スキル:教材動画によって異なる
コース概要: ピンポイントで作りたいゲームジャンルの動画を見つけることができるかもしれません。 また頻繁にセールを開催していますのでゲーム開発講座が1500円~で購入することも可能です。
ゲームジャンル別おすすめ講座はこちら Udemy 詳細

テックアカデミー

テックアカデミー
特徴:現役エンジニア伴走型レッスン
レッスン方法:チャット(週2回)/テキストチャット/課題レビュー
習得スキル:オリジナルゲームアプリの作成
コース概要: 途中で挫折しないためにメンター(相談者)が週2回、マンツーマンであなたの質問・相談に答えてくれるので、ゲーム開発・プログラミング未経験の人でも安心してゲーム開発に取り組めます。転職したい人向けのサポートもあります。無料体験もあります。
テックアカデミー 詳細

テックスタジアム

テックスタジアム
特徴:ゲーム開発の為のオンラインスクール
レッスン方法:動画教材,Slackでの質問(24時間)
習得スキル: Unity,UnrealEngine、CG、企画、サーバー、AI、XR等
コース概要: ゲーム業界で必須な技術の習得が可能です。Slack上で待機している先生への24時間、何度でも質問できます。またIT・ゲーム業界への就職サポートが無料で受けられます。
ゲーム開発に特化したオンラインスクールですので、Unityはもとより、他のゲームエンジンやゲーム業界に興味がある方にはオススメです。
テックスタジアム 詳細

デジハリONLINE

デジハリONLINE
特徴:動画カリキュラム型レッスン
レッスン方法:動画講座/Slack/予約制Zoom相談
習得スキル:Unity基礎,実践/ハイクオリティ3Dゲーム
コース概要: デジタルハリウッド大学・大学院などを通じたデジタルコンテンツ業界とのつながりを活かし、最新かつ実践的なカリキュラムを提供しています。【基礎編】【実践編】とカリキュラムが分かれていて、それぞれに課題があり、ご自身の理解度を把握できます。最終的にはハイクオリティの3Dゲームが作れるようになります。
デジハリONLINE 詳細

関連記事

最後までご覧頂いてありがとうございました。

セール中!
2Dローグライトゲーム

2Dローグライトゲーム開発

Unityヴァンパイアサバイバーズ風講座