2/1ライフの増減の仕組みができたので今度はダメージを受けたときの処理を作りましょう。2Dのダメージ表現の定番といえば高速点滅ですね。作っているうちになんで2Dゲームのダメージは点滅表現なんだ?ってしょうもない疑問を抱くようになりつつも実装しました。2Dゲームをやってきた人間からするともはや常識ともいえる点滅というダメージ表現。いざ実装するとなるとどうやるんだ......?ってなるのも事実。頭のいいひとならここで三角関数が浮かんでサイン波つかえばいいな!ってなります。今回は三角関数のsinを使って点滅表現を作ります。調べているとこれが定番のようですね。ゲームを作っていると数学の知識がとても重要に感じてきますので私も日々勉強するようにしています。状態異常は基本的に0か1で管理するので真偽値の配列にしてしまいましょう。State_Playerのインスタンス変数とそのプロパティを作りましょう。}プロパティであるゲッターとセッターですが、配列の時ってどうやるのが正解なんですかね......ゲッターの場合は配列そのものをやり取りできるようにして取得した側で添え字にアクセスすればいいですが、セッター側の場合は配列そのものを差し替える形になってしまうので処理的にどうなのでしょうか。ゲッターで取得した配列の値を書き換え、その配列をセッターにセットするという形がベストなのか......それともセッター作らずに専用関数を書いて引数にindexと値を渡して更新させるようにするのがベストなのか......このあたりはもうちょっとC#についてもっと勉強しないといけないなと感じました。脱線しましたが状態異常の配列が出来上がりました。次はダメージを受けたときにこの配列の0番目をON状態にして、そのON状態の時に動く仕組みを作ります。点滅処理を作る状態異常配列を使って点滅処理を制御しましょう。ダメージを受けたときにHPを減らしていた箇所に状態異常を変更する処理を書きます。}これでダメージを受けたときに状態異常を変更することができました。この状態異常がONになっているときは基本的にダメージを受けない無敵状態にしたいですね。ないと連続してダメージを受けてしまいかなりのハードモードどころか理不尽な状態になります。次にこのステータスがONになっているときに駆動する点滅関数を作ります。Damage_Playerのコードをすべて張ります。}}_DamageFlash関数がメインです。0.5f;この部分が点滅処理のキモですね。Timeクラスのtimeはアプリケーションからの経過時間(ms)が格納されています。最後のフレームからの経過時間が格納されているTime.deltatimeでは都合が悪いのでコチラを使っています。それをMathf.Sin関数に渡すと-1.0f~1.0fの範囲で値が返ってきます。なんでだ?って思う方は三角関数を勉強してください。アルファ値はColor関数だとint型で0~255の値が必要になります。取れた値は-1.0f~1.0fの範囲なのでダメですね。Color関数のRGBAのあるうち1つだけを取り出すとfloat型の0.0f~1.0fの範囲で指定できるようになります。取れる値はマイナスがついてしまっていますのでマイナス補正をする必要がありますね。値を半分にしてみましょう。0.5fという感じに結果を2で割ると範囲が半分になりますよね。これだとまだマイナスが出てしまっています。0.5f;という計算式になります。これをアルファ値にしてやるとめちゃくちゃゆっくりとフェードインフェードアウトします。これでは点滅といえないので速度を早くしてやる必要があるわけですね。0.5f;sin関数は値を増やし続けても-1~1の範囲で波を打っているわけなのでその速度を上げてやればいいわけです。やった感じ100倍速ぐらいがよくある2Dゲームの点滅になりました。ここを変数化しておいて点滅速度を調整できるようにしておくと大本をいじらなくていい感じですね。あとはその数値をもとに透明度を適用していくだけです。点滅カウントを増やし、点滅カウントが60以上になったらステータスとカウントを戻して透明度も中途半端な状態だとダメなので255にしてリセットしてやります。カウント60なのかというと60FPSでみてるからですね。大体1秒ぐらいになると思います。30FPSのゲームの場合は30にしましょう。点滅はフレーム単位で行っているので動画にしちゃうとフレームレートによっては点滅しているようにみえないので今回は動画にはしていません。簡単に実装できるのでご自分で確かみて見ろ!コルーチンを使った点滅処理の実装ここまでで完成はしたのですが、他にも調べてみるとどうやらコルーチンで実装するのが取り回ししやすそうな感じでしたので先輩たちにならって組み替えてみましょう。コルーチンを使ったことがないという人にも、コルーチン入門的には最適なんじゃないでしょうか?それではさっそく作っていきましょう。}FlashStopWait1sCountというIEnumerator関数を作り、ダメージを受けたときにStartCoroutineで呼び出しましょう。呼び出すときは関数名を文字列にして渡します。関数の最初に「WaitForSeconds(1)」でyieldしているので一旦コルーチンの処理を止めて1秒間経ってから次の処理を行うといった感じです。その間に点滅処理が行われており、1秒後に点滅リセット処理が動いて止まるというわけですね。することで点滅用のカウント変数が不要になりましたので削除しましょう。今回はここまでにしましょう。ハートの処理も書こうと思ったのですが思ったより長くなったので次に回します。最後に今回のソースコードと参考にさせていただいたURLを載せておきます。12/2なおキーヌ某なんでも屋企業のシステム管理者を務めつつリーマンからの解放を目指して奮闘中。FE&BE開発・Webデザイン・DTPデザイン・SEO・Webライティング等一人である程度のクオリティで大体のことが出来るなんでもエンジニア。小学校の夢でもあったゲームクリエイターを目指して2019年から少しずつ積み上げています。ゲーム作りの参考書TOP。