EasySave3でローカルハイスコア機能を作ろう

この記事の要旨

定番アセット”EasySave3″を使って、シンプルなハイスコアの記録と表示の機能を作る。記録や読み込みのタイミングは”Arbor3″でのステート管理を利用。

概観

下記の3つのクラスで実装しました。
  • ScoreManager.cs
    • 一回のプレイのスコアを記録するクラス
  • HighScoreManager.cs
    • 上記のスコアを、保存されているハイスコアと比較し、必要なら上書きして保存するクラス
  • HighScoreDescriber.cs
    • 保存されたハイスコアをUI上に表示するクラス

一回のプレイのスコアを記録する

みなさん各自のゲームで実装されていると思うので参考程度に。
HighScoreDescriberクラスをStart()でなく独自のタイミングでGetComponentでキャッシュしているのは、HighScoreDescriberクラスを付与したオブジェクトがPrefab化されており、リザルト画面へ遷移したタイミングで生成されるようにしているためです。
生成後のタイミングでRefreshLevel1HighScore()をArborのSendEventGameObjectを使って呼んでいます。
RefreshLevel1HighScore()では、後述する「ハイスコアの更新確認」「UIへの反映」も合わせて呼んでおり、このメソッドがハイスコア周りの処理の根っこになっています。

結果のスコアを、保存されているハイスコアと比較

とりあえず10個までをハイスコアとして保存するようにList<int>を作成し、デフォルトのスコアデータも入れておきます。
Loadメソッドでは、EasySave3に用意されているES3.Loadメソッドを用いて保存されているハイスコアをロードしています。
CheckLevel1HighScoreメソッドに、結果スコアを引数として渡します。
まずは、FindIndexを用いて、ロードされたハイスコアの中から”結果スコアより大きい値のうち最小値が格納されているインデックス”を探します。
それが存在すれば=ハイスコアにランクインしていれば、Insertで結果スコアを挿入し、はみ出た末尾の要素を削除後、上書きでSaveメソッドを実行します。

存在しなければ例外処理の方に進み、保存されているハイスコアには手を入れずそのまま値を返します。(一応Saveを入れてますがいらなかったかも)

Saveメソッドの中ではEasySave3に用意されているES3.Saveメソッドを用いて、”level1″という名前のキーにハイスコアを保存しています。

保存したハイスコアをUI上で表示

10個のハイスコアを保存してあるものの、レイアウトめんどくさい3個表示しておけば十分という判断をしました。
DescribeHighScoreメソッドで、渡されたハイスコアを頭から3つ、スコア表示用のオブジェクトに放り込んでいます。

できたのがこちら

1回目のプレイ結果である「21」というスコアが、2回目のプレイの結果時にも残っていることがわかります。

参考記事

DoozyUIとArborで開発しやすくリッチなUIを作ろう

この記事の要旨

DoozyUIで作ったイケてるアニメーションのUIボタンの挙動を、Arborで制御して、画面遷移をラクに作ろう!

DoozyUIの操作

DoozyUI自体の最初のイントロダクションは、下記Qiitaが参考になります。
https://qiita.com/da-1/items/36fa311c09d3bbe9fdc0
DoozyUIを触ってみた
というかこの記事に書かれてるママですね、ボタンを作って、好きなアニメーションをつけましょう。 ボタンを作ったらPrefabにして、Arborの操作にうつります。

Arborの操作

UIButtonTransitionに、生成したボタンのインスタンスを演算ノード経由で渡してあげれば、そのボタンを押した時に遷移する先を制御できます。こんな感じ。かんたーん。
終わり!

EngineのDocumentsを勝手に和訳してみる:How to install the TopDown Engine

おつぎはインストール方法 やってきまーす

イントロダクション

どのバージョンのUnityを利用していようとも、かならず空のプロジェクトにこのアセットをインポートしてください。そうすれば、エンジンのプロジェクト設定がきちんとインポートされます。 本アセットの機能は、Unityパッケージのものをいくつか利用しています。インポートしただけではいくつかエラーがでるでしょうが、その解消方法がこのページに書いてあります。

アセットをインポートする

下記の手順で本アセットをインポートしてください。
  1. Unity Hubから新しいプロジェクトを作成:Unityバージョンは2019.1で、3Dプロジェクトで作成してください。
  2. アセットストアから本アセットをインポートしてください。(くれぐれも空のプロジェクトに)
  3. インポートすると、CinemachineおよびPostprocessingの参照エラーが表示されるでしょうが、パニックにならず、落ち着いてこの記事を読んでください。:)

Unity 2019.1以上の場合

インストールすると、大量のエラーに見舞われるでしょう。大丈夫です、そういうものです。エラーを修正するためには、ファイルエクスプローラから(Unityからではなく) TopDown Engineのルートフォルダに あるmanifest.jsonファイルをコピーしあなたのプロジェクトのPackagesフォルダへペーストしてください。(もし既に存在する場合は上書き)Unityを再起動するか、Packagesフォルダを再インポートする必要があるかもしれませんが、大体はそのまま動きます。

LWRP, HDRP あるいはマニュアルでのパッケージ管理

マニフェストファイルを置換すると、簡単かつ迅速に本アセットを動かせるようになりますが、この方法にはいくつか問題が残ります。例えば、LWRPやHDRPといった、利用するパッケージを自分自身でコントロールしたい場合です。そういった場合は、依存するアセットを全て手動でインストールすると良いでしょう。その場合に必要なアセットはCinemahine,2D Pixel Perfect, PostProcessing Stackの3つです。

Unity 2018.3以下の場合

空のプロジェクトへのアセットインポートが完了したら、TopDown Engineは準備完了です。 CinemachineかPostProcessingに関するエラーが出ている場合は、こちらからアセットのプロジェクトセッティングとパッケージマニフェストをダウンロードしてください。Unityを終了し、これらのファイルをダウンロードしたらあなたのプロジェクトへコピーしてください。manifest.jsonファイルはproject/Packagesディレクトリへ、ProjectSettings.assetファイルは ProjectSettingsディレクトリへ格納してください。これら2つのファイルを上書きしたら、再度Unityをひらけばうまくいくはずです。 それでもダメなら、あなたがこれまで行った手順、起こったことをサポートへメールで送ってください。あなたの助けになれたら嬉しいです。

どうしてこれらのエラーが出るの?

本件は、Unityがアセット制作者に対し、アセットストアへのProject Settingsフォルダ(入力設定や品質などを含む)のアップロードは許可しているものの、どのアセットを使用するか記述するmanifest.jsonファイルのアップロードを許可していないために発生する問題です(今回の例で言えばPostProcessingとCinemachine)。近い将来修正されるようですが、しばらくの間は上記の手順を踏んでください。

カメラがズームインしすぎてる

Unityのバージョンが2018.3以下の場合、いくつかの設定が失われてしまうために発生することがあるようです。でも心配なく。2Dの場合は、MainCameraのPixel Perfect CameraコンポーネントのAssets Pixels Per Unitの値が16になっていること、仮想カメラのorthographic sizeが6.9となっているか確認してください。3Dの場合は、仮想カメラ(大体の場合CM vcam1という名前)を選択し、field of viewの値を40に設定してください。

TopDown EngineのDocumentsを勝手に和訳してみる:Introduction to the TopDown Engine

はじめに

自分の理解を深める&備忘録としてTopDown Engineのドキュメントを和訳してみます。

公式でもなければ英語ネイティブでもないので参考程度に。

まずは“Introduction to the TopDown Engine”から。

はじまるよー

TopDown Engineのイントロダクション

TopDown Engineのドキュメントへようこそ。あなただけのトップダウンビューゲームを作りましょう。そのために必要な全ての知識がここにまとまっています。
  • TopDown Engineってなに?
  • インストールしたらエラー出たんだけど / カメラがうごかないんだけど!
  • どこからはじめればいいの?

TopDown Engineってなに?

TopDown Engineはトップダウンビューゲームの制作のためのフレームワークです。Corgi Engineの制作者によって開発され、Unity Asset Storeから購入できます。

非常に軽快で、機能が多く、モバイルでも作りやすく、安定しておりかつ拡張性も持ったゲームエンジンとして、クオリティとプレイフィールを重視しています。Unityを使っていますぐ、あなたオリジナルのトップダウンビューゲーム(2Dでも3Dでも!)を作り始めましょう。

あらゆるトップダウンビューゲームの基礎として動作するようデザインされています。例えば、Binding of Isaacのようなダンジョンを探索するものから、レトロなゼルダのようなアドベンチャーゲーム、ファイナルファイトのような敵をすべて殲滅するものや、Hotline Miamiのような銃を使うゲームまで、ゲーム画面を上部から移すようなカメラ配置のゲームならあらゆるものが制作できます。

軽快、本番リリースにも利用可能、万能、軽量、拡張も容易なので、あなたのプロジェクトをグンと加速させてくれます。

インストールしたらエラー出たんだけど / カメラがうごかないんだけど!

アセット内にある”IMPORTANT-HOW-TO-INSTALL.txt”ファイルのinstall instrucionsを確認してください。パートごとに分かれたドキュメントも用意してあります。

どこからはじめればいいの?

ドキュメントのすべてに目を通す必要はありません。このエンジンはUnityの練習となることも念頭に置いて制作されており、多くのヘルプも詰め込まれています。これがあなたの初めてのUnityプロジェクトでないなら、おそらく自分で解決できるでしょう。もし何かわからないことがあれば、いつでもここに戻ってきてください。

左側にあるメニューから各項目へ進むことができます。このドキュメントは機能にフォーカスしています。もしコード自体に疑問点があれば、API Documentの方を参照するのが良いでしょう。また、コードのコメントを直接読むのもおすすめです。たいていの疑問は、コメントでカバーしています。

機能のリストがほしかったり、「この機能はあるのかな?」と思ったら、こちらのページを見てください。変更履歴や、そのほか役に立つものがあります。

ビデオチュートリアルもあります。

それでも解決しなければ、いつでもアセットストアサポートリンクからメールで連絡してください。

TopDown Engine 使ってみる【インストールと最小構成】

TopDown Engineとは

TopDown Engine は見下ろし型のアクションゲームを簡単に作るためのスクリプトやデモ素材が含まれる有料アセットです。

敵AIやマップ、インベントリなどの仕組みを組み合わせることで、オールドスタイルのゼルダやホットラインマイアミライクなゲームを作ることができます。

具体的にどんなことができるかは、公式のツアーガイドを見たり、アセット内に含まれるデモシーンをプレイしてみるとわかってきます。

インストール方法

アセットストアからインポートするだけではエラーが表示されてしまいます。

ChinemachineとPostProcessingをPackageManagerからインストールすることで解消されますので焦らずに。

最小構成

このアセットを使ってゲームを作るには、「かならずシーンにこれを置いてね!」という最小構成のオブジェクトがあります。

公式ドキュメントMinimal Scene Requirements

空っぽのシーンにまずはこれを配置しましょう。Demos>Minimal2Dに置いてあるオブジェクトをまるっとシーンにコピーにするだけでなんとかなりました。

これだけでもう、シーンにキャラクターが登場し、移動したりインベントリを開いたり、銃を撃って攻撃することができます。再生して色々やってみましょう。

いつもだったら三日くらいはかけてそうな処理がたった十分程度でできてしまいました。

丸いコアラのやつは、試しに置いてみたマトです。

次回は、NPCキャラクターの設置とそのAIを作っていきます。

公式チュートリアルSurvival Shooter WITH PK Chapter.21「敵の強さ、登場数、キャラクターの成長をデザインする」

21.敵の強さ、登場数、キャラクターの成長をデザインする

いよいよ大詰め、ウェーブごとに登場する敵の強さ、種類や数、それに加えて、ウェーブが進むごとにキャラクターも強くなっていくようデータを調整していきます。
ここ次第で、いままで一生懸命作ってきたゲームがおもしろくなるか、どうしようもないくそげーになるかが決まるといっても過言ではないフェーズ。

 

大まかな方針を立てる

まずは「どういう状態になっていてほしいか」を文章で表します。これは、ウェーブごとのコンセプトを立てるようなもの。ゲーム全体に「どういうゲームにしたいか」コンセプトを立てたように、より細かい粒度で「どう遊んでほしいか」のイメージを言葉にしていきます。

それを実現するためのデータを仮組する

「どう遊んでほしいか」を実現するためのデータを仮組していきます。ここで組んだデータは、後ほどプレイする過程でほぼ100%かわるので、この時点では肩ひじ張って悩む必要はないと思います。繰り返しますが「どう遊んでほしいか」のイメージを自分で構築しておくことが大事。

試す&調整する

仮組ができたらそれをゲームに流し込んでプレイしましょう。自分の「どう遊んでほしいか」という体験を実現できていますか?理想の状態に近づくまでなんどでもプレイし、データを調整しましょう。ここでやりがちなのは、難しくしすぎてしまうこと。慣れた自分では適切な塩梅がわからなくなりがちです。「自分だったら鼻ほじっててもクリアできるわー」くらいの難易度を目指しましょう。

今回ボクの作った「Suvival Shooter WITH PK」はコチラから遊べます。案の定難しくしすぎてますが、よかったら遊んでみてくださいね。

以上、21+1回にわたってお付き合いいただき、ありがとうございました。

前回はコチラ

Unity公式チュートリアルSurvival Shooter WITH PK Chapter.20「弾切れ、リロード中、武器チェンジ中をわかりやすくする」

問題作「MCバトルOnline」は如何にしてコケたか?@第11回Unity1week「つながる」

第11回Unity1weekに参加した

2019年03月11日(月)〜03月24日(日) に開催された第11回Unity1weekに参加しました。
今回制作したゲーム「MCバトルOnline」は「対戦相手とオンラインで、ラップのように韻をつないでいく」というゲームです。
「ほう、どれいっちょ遊んでみっか!」と思ってくださった菩薩のようなあなた。本当にありがとうございます。ですが、お気持ちだけで結構です。なぜかというとおそらく遊べません

だって対戦相手がいないから

今回制作したゲームは、完全オンラインの1対1、対戦相手がいないと成立しません。あなたがこの記事を読んでいる今この瞬間に他の誰かがあなたと同時にゲームをはじめていない限り、あなたはロビーで延々と対戦相手を待ち続けることになるでしょう。心優しいあなたの貴重な時間をそんなことで浪費させると思うと、僕はキーボードを濡らさずにはいられません。
さてどうしてそんなゲームを作ってしまったのか、それをこれから一緒に紐解いていきましょう。

お題発表

お題を確認し、アイデア出しを始めます。月曜中に企画が固まれば、前回の経験もあるし御の字だろうと考えてました。


これは企画のブレストメモ。いくつか面白そうな候補はありましたが、新しいこととしてオンラインもやってみたかったので「韻を踏んで言葉をつなげていく」というアイデアに決まりました。
逆につながらない「逆連想ゲーム」とか、「つながらない文学」とかは一発ネタとしてちょっと面白そうですね。「世代をつなぐ」系のネタも面白そうだと思いましたが、1週間ではまとまらないと判断してます。

順調に固まる企画

よさそうなアイデアが見つかったので、これを固めていきます。


さきほどのアイデアをもとに煮詰めていった企画メモ。

右上の「気になること」を見る限り、「もろもろ心配はあるものの作ってから考えろ!」というスタンスだったようです。じつに男らしい。ほかにも観戦や投票など、大きな夢を見ていることが窺えます。

コンセプトを整理している最中に頭に浮かんでいたのは、すけどんさん@stamina_techの「575オンライン」がヒットした事実でした。あのライブ感、ハプニング感に、即興の緊張感、韻を踏むこと自体のリズム感を乗せることができれば、間違いなく面白くなるだろうという確信がありました。

PUN完全に理解した

上記の企画をもとにさっそくPUNを使ってオブジェクトの実装に成功しているのが下記の動画。コンビニは特に関係ないんですが、手ごろな素材がなかったので。

そして次の時点で水曜日。企画も固まってるしオンラインも思ってたより簡単に動かせるし、この辺完全に調子乗ってます。

↓は調子乗ってて絶対面白いと思ったのに鬼ほどスベったツイート

プロトタイプが出来上がっていくのは早かったです。作っていても楽しいですね。
ただ、そのおかげで進捗が順調だと勘違いしています。

BGMも付きました。土曜日の夜。作業は進んでいると本人錯覚してますがさっきのツイートと比較すると見た目にはほとんど進んでないのがわかります。


ガンバローじゃねぇよ!おめえもがんばんだよ!

余裕のApexLegends

突然ですがみなさんはApexLegendsというゲームをご存知ですか?2019年2月4日に電撃リリースされて以来、新世代のバトロワFPSとして世界を席巻しているタイトルです。リリースされてからというもののその面白さに、家にいる時間はUnityを触っているかApexLegendsをやっているかという状態でした。さすがに1week期間中は自粛しようとDiscordでちゃんとフレンドたちに、イン率が下がることを宣言しています。えらいですね。

ちなみにこの後1時間だけプレイしました。チーターがはびこっていて全く面白くありませんでした。


次の日。風呂にも入らずしっかり誘ってプレイしてます。


夢の中でもプレイしていたようです。意識高いですね。


金曜の夜にはApex(あぺ)やりたくて禁断症状が出ています。進捗がでている(と錯覚している)ので余裕ですね。


土曜の夜です。かける言葉が見当たりませんね。

阿鼻と叫喚の週末

時間というのは不思議なもので、いつもそこにあるのに本当に必要な時に限って足りなくなるんです。「最後に余った時間をとってやろう」と思っていたことは落ちます。これは100パーです。

エモすぎるコミットログ


バグを巻き戻したいのに、うまくできなくてパニクってます。ブランチの名前とかコメントからそれが手に取るように伝わってきますね。作者の感情が強く表現されている、非常にエモいコミットログです。

罪悪感とロスタイム

日曜20時を迎え、リザルトへ遷移しないバグがあることを確認したままビルドをアップロード。


殊勝なこと抜かしてますがApexしなければもっと整ったと思います。


謝罪の気持ちを見せてますがApexしなければ直っていたバグと思います。

リアルタイムのオンラインゲームという性質上、自然流入で遊んでもらうのはむつかしいということは分かっていました。狙っていたのはぱふもどきさん@PafuOfDuck全ゲーム遊ぶ生放送。要するにここで取り上げられるタイミングまでに体裁を整えればいいわけです。大人って汚い。ご本人に確認したところ、オンラインゲームは木曜か土曜になるとのこと。

ここから、己のスパゲティコードと戦う地獄のロスタイムが始まりました。

心(蔵)震える実況生放送

幾度もの「PUNなんもわからん」夜を超えいよいよ迎えた放送当日。まだ多少バグは残っていたものの、最低限遊べるところまでは持っていくことができました。この時点では「面白くなるぞ」という自信と「理解してもらえるだろうか」という不安との間で針がゆらゆら揺れてました。

結果は惨敗。コメント欄やリアクションを眺める限り、そもそも「韻を踏む」ということが伝わっていなかった、伝わっていても非常に難しかった、という感じが窺えました。これが「肩ごしの視線」というやつですね。


放送終わってからなんだかもやもやしてました。


でもあそんでツイートまでしてくれたお二方、本当にありがとう!!

結果発表


放送のリアクションを見る限り全く期待していなかったのですが、どうにか斬新さ部門で4点、24位にランクインできました。
遊んでくださった方、評価をつけてくださった方、本当にありがとうございます。

斬新さ4点というのは絶妙で「(面白いかは分からんけど)ほかに見ないから4点、でも面白いか分からんし5点はつけられないかな」という評価だったのかなと解釈してます。そもそも遊べなかった人は点数つけられないでしょうし。
バグをとって「絵作り」「雰囲気」を整えて完成度を高めれば、結果的に「楽しさ」につながるし「斬新さ」のところにも評価が入りやすくなるだろうと思っています。

浮き彫りになった弱点

ひとつは実装スピード。作り方の引き出しといっていいかもしれません。「こういうことをしたいときは、こういうパターンがあるよ」というテンプレを習得し、なるべく頭と時間を浪費せずに実装していけるようになる必要があります。時間が余ればそれだけ、絵作りや全体的な統一感、バグ修正にパワーを割くことができます。
自分で一から実装するだけでなくアセットストアの活用も。今回DOTweenを使ってみましたが、動きのある絵が5分で作れて感動しました。
もう一つは世界観づくり。アート、サウンド、UI全てから受け取る印象ですね。今回は時間がなくてやれなかった、というのは確かに間違いありませんが、時間があったとてクオリティを出せたかというと、おそらくそんなことはなかったでしょう。普段からその練習してませんからね。

これからのUnity1weekへの挑み方

「ゼロから新しい技術、表現に挑戦する場」というよりも、「練習したものを披露する場」としてとらえていこうかなと。今回新たに挑戦したPUNは、非常に簡単で、かつ程よくハマりました。1week中はその復習をする時間が取れないのでハマったところをゴリ押しで突破して放置しがちというのもよくない。

次のunity1week(たぶん7月くらい?)でもこの形式が続くのであれば
* 評価100人
* 総合トップ10
を目指します。

トップ10きついかな?トップ30くらいがいいかな?表向きはトップ10にしといてそれは努力目標ということにしておこうかな?

まとめの中期目標

これから3か月間は、細かく作って出してのサイクルを加速させていきます。新しい技術や設計、思想、テーマの検証→3週間でそれをリリース、を繰り返していくイメージ。
並行してアートや3Dモデルの勉強も始めていきます。3Dでつくってみたいゲームがあるんですよね。その辺も、この検証期間を使ってゲームに落とし込んでみたいと思います。


これ以降めんどくさくなったのでやってません。

ご意見ツッコミあればお待ちしています。

Unity公式チュートリアルSurvival Shooter WITH PK Chapter.20「弾切れ、リロード中、武器チェンジ中をわかりやすくする」

20.弾切れ、リロード中、武器チェンジ中をわかりやすくする

大きく分けて下記の三つをまとめて実装します
* 弾切れ中に左クリックしたらカチカチ鳴って弾切れしているとわかる
* リロード中、HUDにその情報を表示する
* 武器チェンジ中、HUDにその情報を表示する

弾切れ中にカチカチ鳴らす

サウンドファイルは適当なものを用意してきます。実装は下記の通り

うーんイケてない。「おしっぱで射撃できていい」という仕様と「おしっぱでカチカチならすと音がうるさい」という問題とがバッティングしてしまっているため、わざわざInput.GetButtonDownで判定を取り直しています。きれいにできそうな気もするんですけどまあええかまずは完成させたろの精神でスルー!

リロード中のHUDを表示

これも適当な画像を作ります。この画像を、リロード中の待ち時間の間表示します。

これはシンプルですね。リロードが始まったら表示してWaitForSecondsが終わったら消す。ちなみにこの画像はCanvas内に設置しています。次の武器チェン表示も要領は同じ。

武器チェンジ中のHUDを表示

こちらも適当な画像を用意。

おんなじですね。今回はこれで終わり!

次回はコチラ

公式チュートリアルSurvival Shooter WITH PK Chapter.21「敵の強さ、登場数、キャラクターの成長をデザインする」

前回はコチラ

Unity公式チュートリアルSurvival Shooter WITH PK Chapter.19「照準を表示する」

Unity公式チュートリアルSurvival Shooter WITH PK Chapter.19「照準を表示する」

19.照準を表示する

射撃がどこに飛んでいくかの目安となる照準(レティクル)を表示します。

画像を用意する


今回は32*32pixelで画像を書きました。これをCanvas上に設置し、マウスカーソルの位置を追うようにします。

Reticleクラスの実装

Reticleクラスを作成し中身を実装していきます。

超シンプルですが、ほぼ意図通りの挙動です。

バグ

射撃は、GunBarrelEndオブジェクトの正面に向かって真っすぐ飛んでいく実装になっています。
ただ、射撃の始点であるGunBarrelEndオブジェクトがPlayerの正中線よりやや右に設置されているため、レティクルの位置と実際に射撃が飛んでいく位置がずれてしまっています。
GunBarrelEndオブジェクトの位置を調整してみようと試行錯誤したのですがうまくいかず。このバグは仕様にしようそうしよう。

次回はコチラ

Unity公式チュートリアルSurvival Shooter WITH PK Chapter.20「弾切れ、リロード中、武器チェンジ中をわかりやすくする」

前回はコチラ

Unity公式チュートリアルSurvival Shooter WITH PK Chapter.18「カメラシェイク」

Unity公式チュートリアルSurvival Shooter WITH PK Chapter.18「カメラシェイク」

18.カメラシェイク

カメラシェイクとは、カメラ=画面が小刻みにぶるっと震える演出のことです。ダメージを与えた、受けた、壁に激しくぶつかったなど視点が揺れるときの演出として使います。今回はダメージを与えた時に画面が揺れるようにしてみましょう。かなり臨場感が増しました!

CameraShakeクラスの実装

新しくCameraShakeクラスを作成し、MainCameraにアタッチします。
ShakeTimeの値が正の間カメラが揺れ続け、Update内でShakeTimeの値を減らしています。負の値になると揺れが止まります。
PlayerShootingクラスのShootメソッド内で、ダメージを与えるタイミングでShakeTimeに揺らしたい秒数を入れることでカメラシェイクを実行しています。

public class CameraShake : MonoBehaviour {

public float ShakeTime { get; set; }

private void Start()
{
ShakeTime = 0.0f;
}

private void Update()
{
if (ShakeTime > 0.0f)
{
ShakeTime -= Time.deltaTime;
ShakeCamera();
}
else if(ShakeTime <= 0.0f)
{
ShakeTime = 0.0f;
}
}

public void ShakeCamera()
{
//カメラの揺らし幅
float x = Random.Range(-0.1f, 0.1f);
float y = Random.Range(-0.1f, 0.1f);

//カメラを揺らす
transform.position += new Vector3(x, y, 0);
}
}

次回はコチラ(執筆中)

前回はコチラ

Unity公式チュートリアルSurvival Shooter WITH PK Chapter.17.5「リファクタリング」