Shooter応用Chapter.11.5「コンセプトを考える」11.5.コンセプトを考える前回の記事を書いた後、大事な手順を忘れていたことに気づいた。「このゲームをどんなゲームにしたいか」というコンセプトの確認だ。危うく開発が迷走するところであった。次の実装に入る前に、コンセプトの整理と先に挙げた5つの要素がそれに沿っているか、過不足はないか確認しよう。このゲームの醍醐味をどこに置くかこのゲームは、何を面白いと感じてもらうものなのか何をどうしてどうするためのゲームなのかなぜこのゲームを作りたいと思ったのか、このゲームで何を伝えたいのかコンセプトはワンピースにおけるログポースだ。桃鉄における目的地だ。母を訪ねて三千里における母だ。このコンセプトがなければゲーム開発は迷走する。チームでの開発ならいわずもがな、たぶん個人でも規模が大きくなれば何が正解かわからなくなってくるはずだ。その時に立ち返るためのものである。今回のSurvivalShooterでは、コンセプトを下記の通り定義する。襲ってくるたくさんのゾンビを、命からがら全滅させるゲームなんてことないコンセプトだと思うかもしれない。下記のようなコンセプトを立てた場合と比べてみてほしい。イメージできるゲームの完成図はだいぶ違うのではないだろうか。武器を持たない一般人がゾンビに見つからないように、朝が来るまで生き残るゲーム圧倒的な数のゾンビを、圧倒的な火力で蹂躙するゲームゾンビがうろつくマップを、限られた資源だけで何日生き残れるか競うゲームコンセプトから実装項目を考えるコンセプトによって実装すべき機能、優先度が変わる。今回のコンセプトでは、どんなゲームデザインをすべきだろうか。襲ってくるたくさんのゾンビゾンビは自分に向かって進んでこなければならない。ゾンビの同時出現数も多くなるだろう。命からがら全滅させるゲームライフは貴重なものになる。そもそもダメージを食らわないようなプレイングに対してメリットを設けるべきだろう。全滅させるための手段を用意する必要がある。ゲームクリアの条件になるのはゾンビの全滅だ。今回順序が逆になってしまったが、前回の記事で挙げた項目とコンセプトとが一致しているかを確認しよう。11.敵の出現をWaveで管理するゾンビの出現数を管理することは必須である。プレイ開始直後から100体のゾンビに襲われてはかなわない。難易度のデザイン、ゲームクリアに欠かせない機能であるため、(Waveという形にするかはさておき)これは最優先で実装すべきだ。12.射撃にリロードを設ける無制限に攻撃できる場合、(敵が一方的に強くならない限り)プレイヤーは命の危機を感じないし、ゲームプレイにも工夫を凝らさない。攻撃のあとに必ず「逃げなければいけない」フェーズが訪れることで、プレイヤーに「(生き残るために)今攻撃すべきかどうか」の駆け引きを強いることができる。これも欠かせない機能といえるだろう。13.敵に射撃がヒットした時、ノックバックする敵に攻撃を当てたことへの何よりの報酬は、敵が死ぬことだ。一発で死んでしまっては面白くない。いえ、死ぬまで何の報酬がもたらされないのもストレスだ。中間の報酬として「逃げるのが有利になる」ノックバックを与えるのは悪くない。15.敵の個性を強くするたくさんのゾンビを撃ち殺しているうちに、プレイヤーは飽きてくるだろう。彼らに刺激を与えるために「5発撃っても死なないゾンビ」や「遠いところから攻撃してくるゾンビ」を追加しよう。油断していたプレイヤーたちは目を醒まし、再び対策に頭をひねるだろう。14.武器変更と武器強化アイテムを出現させる夢中になって意地悪なゾンビを追加しているうちに、プレイヤーの持つ武器では対処しきれないモンスターを作ってしまうかもしれない。これではプレイヤーはストレスや理不尽を感じてしまうだろう。フェアなゲームとするために、彼らにも新たな武器を与えよう。嬉々としてゾンビ狩りに精を出してくれることだろう。さあ実装しよう前回挙げた実装項目の中には、幸いアテを外しているものはなかった。自分の中でコンセプトは割としっかり固まっていたようだ。実装を進める中できっと「これも入れたら面白いだろうな」と思う機能が出てくるだろう。いくつか新しいアイデアは生まれている。すべての機能を実装することは時間の面でも根気の面でも不可能だ、取捨選択をしなければならない。その時、ここでコンセプトを明文化していたことが役に立つであろう。2件のコメントオフ会用の名刺をいますぐ120円で作る方法あ!名刺つくらなきゃ!急遽あるオフ会に参加することにしたので、名札代わりの名刺を作ることにしました。業者に頼んでいては間に合わないので、コンビニのプリントサービスを利用したところ1時間でゼロから名刺がつくれました。費用は120円/10枚。「すぐ作りたい」「名刺の新しいデザインを試したい」ような時にはオススメ。「大量に作りたい」「急がないからコスパ優先」みたいな時には素直にラクスルなどのサービスを利用したほうが良いでしょう。PCでデザインする&pdfで保存こちらのサービスを利用しました。http://www.labelyasan.com/インストール不要で使えるWeb版がラクチンです。新規作成>名刺用>必要な用紙サイズ(僕は「品版51164」を使いました)>好みのデザインテンプレートを選んだら、名前と必要な情報を追加するだけで名刺のデザインは完成です。右上の「レイアウト」に進み、「選択面のコピー」は「全て」を選んだら「印刷」に進み、「PDF出力」を行います。出力されたファイルをご利用のオンラインストレージ等を経由してスマホに転送しておきましょう。これでPCでの作業は終わりです。コンビニで印刷pdfファイルをコンビニのプリントサービスで印刷するには専用のアプリをインストールしておく必要があります。http://www.sharp.co.jp/multicopy/prsm/UIが親切なので、コンビニのプリンタの前で指示に従えばスムーズに進みます。用紙は「A4光沢紙カラー」(\120)を使いましょう。一般的な名刺ほどではありませんが、コピー用紙よりもしっかりした紙です。カットおうちに帰ったらカッターやハサミを使ってきれいにカットしましょう。この工程が一番難しいかもしれませんw完成!できました。調べる+デザインの時間も込みで1時間なので、それがサクッと終われば30分もかからないと思います。普通の名刺の紙に比べたらペラいので、あくまで緊急用か、自分のように名札としての利用が良いと思います。今回からは、「こうやったらより面白くなるんじゃないかな」というポイントをいくつか挙げて、自分流にアレンジしていくよ。具体的には以下の5つを実装していこうと思う。11.敵の出現をWaveで管理する12.射撃にリロードを設ける13.敵に射撃がヒットした時、ノックバックする14.武器変更と武器強化アイテムを出現させる15.敵の個性を強くするそれぞれを実装する理由は各記事で解説していくよ。始めよう![追記]コンセプトの整理を忘れていたので次回の記事で、各項目の実装理由を整理しまする。11.敵の出現をWaveで管理する面白いゲームプレイには、だんだん上昇していく難易度と目標が不可欠だ。現状では敵の出現は散漫かつやむことがなく、自身が力尽きるまで悪夢が終わることはない。出現する敵の種類、数を一つのWaveとしてパッケージングし、この問題に対処しよう。spawnPoints[0].rotation);}これで、各GameObjectに設定したPrefabのエネミーをスポーンさせることができる。hellephant;//zomBunnyがInstantiateされるSpawn(zomBunny);//zomBearがInstantiateされるSpawn(zomBear);//hellephantがInstantiateされるSpawn(hellephant);Wave毎にメソッドを用意し出現する敵を決める例えばWave1のLevel1で出現する敵を呼び出すメソッドはこうなる。i++){Spawn(zomBunny);}}超シンプルですね。このメソッドの実行はどこから呼び出そうか?そのアプローチが次。Waveクリアを判定し次のWaveへ進むこれには、EnemyManagerクラスのみならずEnemyHealthクラスにも手を加える必要がある。言うと「Levelの初めにスポーンした敵を倒して残りが0体になったら、次のレベルのSpawnWaveメソッドを実行する」という実装です。ちなみに、Wave1-1はStartメソッドからInvoke関数で実行してます。EnemyManagerクラスがコチラ。※Levelと命名すべきところもWaveと命名して実装してしまってます。実装時は”Wave1-1′′でいいや~と思ってましたが、ブログにまとめる段になって”Wave1-1“を説明する言葉がないと不便なことに気づき急遽Levelと呼ぶことにしたためです。//StartNextWaveでの判定に使う。//そのLevelでスポーンするエネミーの数。エネミーが死ぬたびに減少する。}12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849//StartNextWaveでの判定に使う。i++){Spawn(zomBunny);}//そのLevelでスポーンするエネミーの数。エネミーが死ぬたびに減少する。3;}そしてEnemyHealthクラスの調整がコチラ。(){(略)//Wave中に倒した敵のカウント用//EnemyManagerの各Waveメソッドにて、次Waveの呼び出し条件に利用EnemyManager.numEnemy--;}ここまでできれば機能の実装はほぼ終わったようなもの。あとはWave開始を知らせるUIとクリア画面を作って表示するだけです。Wave開始を知らせるUIのアニメ作成とその表示チュートリアル内でゲームオーバー画面を作った時と同じ要領で、AnimationのClipを追加する。完成形はこんな感じHUDCanvas下にWaveTextを追加し、見た目を整える。HUDCanvasのアニメータにWaveClipを追加して、WaveTextが左から登場して右に消えていくようアニメを作る。ここで一瞬詰まったのが、テキストの位置を動かすときにPosition(Z)でなくAnchoredPositionをプロパティにしなければならないということ。Unity3D理由を考えるに、画面サイズが変わった時にPositionで指定していると意図しない挙動になりそうだから、とかかしら。アニメータのNewStateからWaveClipへのTransitionを引き、Waveトリガーを作成しくっつける。WaveClipからNewStateへ戻るTransitionも忘れずに。こちらのTransitionはHasExitTimeにチェックをつけておこう。1";(略)}クリア画面のアニメ作成とその表示こちらもWave表示とやることは同じ。クリア画面の完成形HUDCanvas下にClearTextを追加。設定はこうClearClipを作成。Animatorを設定。Transitionは一方通行でOK。Levelクリア処理に、「最終Levelをクリアした時」の条件分岐を追記。ついでにスペースキーでリトライもできるようにしておく。true;}これで実装は終わり!次は武器の残弾とリロードをやっていくぞ![追記]コンセプトの整理を忘れていたので、次回はそれを挟む。2件のコメント2019年がやって来たヤァ!ヤァ!ヤァ!2019年明けましておめでとうございます。最高にテンションの上がらないこのタイミングで、2018年の振り返りと2019年の目標を整理しておこうと思い立ち。まとめるつもりでしたが芋づる式に書きたいことが浮かんできてしまったので、なんのために働くのか、どんなゲームが作りたいのかについても一緒に整理しておこうと思います。2018年は、自分の将来のために時間を使う、ということを意識し始めることができた一年でした。その中でなにより大きいのは、Unityでのゲーム開発(&勉強)を改めて再始動させたこと。これは大きな前進だったと思っています。17年の4月ころに、新卒から4年間勤めた会社を退職し、規模20人程度の現職へ転職。職種もプロジェクトマネージャから企画職へ転じ、要するに市場価値がほとんどない状態のチャレンジでした。残念ながらこのチャレンジは順調とは行かず、18年頭ころは再転職を視野に己の身の振り方を考え直さねばならなくなりました。これが非常に苦しかった―――。―――僕がまだ小学生だったころ、”真・三國無双2”というゲームが発売されました。僕の母親はゲームそのものに対してあまり良い感情を持っていなかったようですが、このゲームをきっかけに三国志にハマる僕を見ていろいろ本を用意してくれました(逆に”グランドセフトオート3”をプレイしている時の僕を見る母はしかめっ面でした)。この体験が大きく作用し、僕は中国文学の専攻を念頭に志望大学を決めました。6年前(!)、僕も就職活動をする時期でした。無事に中国文学の研究室に潜り込むことはできていましたが、それに対する興味はかなり衰えていました。いま振り返るなら、幼い子供がウルトラマンや恐竜、電車の種類を覚えることに夢中になるような一過性のものだったのでしょう。進学という選択肢はありませんでした。起業ということは露ほども考えていませんでしたので、まあ無難に就職活動。それでも一本、軸は通さねばと建てたのが「好きなことを仕事にする」でした。なんとも曖昧ではありますが、今考えても悪くはなかったかなと思います。ラジオとマンガとゲームが好きでしたので、ラジオ局と出版社をつまみつつ、ゲーム会社をメインに就職活動していました。「私は、幼いころからテレビゲームが好きです。テレビゲームをきっかけに、別の世界への扉を開くこともできる。世間のゲームに対する風は依然冷たいままです。私はこれが悔しい!古くは小説、20世紀に入ってからは映像がその文化的価値を上げてきたように、ゲームという文化の価値も上げていきたい。」ゲーム会社への志望動機はこれをベースに固めました。当時の任天堂社長だった岩田聡も、こんなようなことを言っていました(と解釈してました)。テレビゲームがお母さんに受け入れてもらえる文化にならなければならない、と。(ちょっと古いですがこの辺)この気持ちを一本小脇に抱え、企業研究して向こうに合わせていくようなことはせず、「俺はこれがやりたいんだ、どうだ?」という攻め方でした。なんとも具体性を伴わない志望動機な上に図々しいやり方でしたが、一社だけ内定を出してくれたところがありました。任天堂は書類で落ちました。ゲーム会社に内定をもらえたといっても、当時の僕は自分にゲームが作れるとは露ほども考えておりませんでしたから、非開発職です。プログラミングなんか文学部には無理無理。いえば営業とか人事とか総務とか経理とかパブリシティとかライセンスとかです。いう仕事で、この思いを実現したいと考えていました。入社後の面談でもそういったことを伝えていきました。研修終了後、発表された配属は”プロジェクトマネージャ”でした。何ですかその仕事は?ワケが分かりません。......ふむふむなるほど。開発の現場を直で知らないとオハナシになりませんよと。プロマネというのはプロジェクトを俯瞰する立場で全体を見渡すので、非常に勉強になりますよと。なんか難しそうだけど大丈夫なのかしら―――?えっちらおっちらプロマネをやっていた時のことを書くのはまた別の機会に譲るとして、4年経ったころに僕はこんなことを考え始めるわけです。・プロマネだけ続けててもやりたいことできねえな・ゲーム業界、偉くなれるのは実際に作れた奴だけだな・ゲームを娯楽以外の目的に応用する”シリアスゲーム”って分野があるらしい担当していたプロジェクトの切れ目が重なったこともあり、僕は本格的に転職活動を始めます。最終的な転職タイミングでは間も悪く、当時の上長が図ってくれた異動の便宜もぶち壊すグダグダな退職になりました。自分の本意に沿うという意味では転職活動は成功でしたが、上述の通り18年初に改めて自分を見つめなおす必要性に迫られます。企画職としての経験は充分とは言えず、プロマネにも戻りたくない。自分のやりたいことも捨てたくない。なると転職先は非常に限られます。いや、限られるどころか自分の意志を曲げないで済むことはできないように思われました。そんなときオフィスの本棚に”Unityの教科書”を見つけました。(急に胡散臭いブログっぽくなってきたな......)Unityは、前職の末期にすこし勉強を始めていましたが、転職活動のバタバタでめっきりご無沙汰になっていました。一本自力でゲームを作り切ることができれば、企画職としてレベルアップできるだろうと一念発起、この窮状を打破すべく藁にも縋る思いで、Unityを使ってゲーム開発を始めました。プログラミングも始めてみれば全く歯が立たないなんてこともなく、勉強すればしただけ前に進める確かな実感がありました。僕が2018年、Unityを使ってゲーム開発を始めたのはこんな経緯があったのでした。2019年も幸運なことに、僕のやりたいことは新卒当時のまま変わりません。本業の方はなかなか苦しいままですが、本業と個人開発とでうまく経験値稼ぎの両輪を回しつつやっていければとポジティブにとらえることができるようになっています。2019年の目標を掲げておきましょう。・個人で「これは面白い」と自分で思えるものをリリースする・遊んだ人がフラットな評価で「面白い」と言ってくれるものをリリースする・遊んだ人が「役に立った」と言ってくれるものをリリースする・個人で1円以上のマネタイズに成功する2019年が僕にとって、読んでくれた皆さんにとって良い年になりますよう。Shooter日本語実践Chapter.1010.GameOverとうとう最終章。今回はプレイヤーの体力が0になった時のゲームオーバー処理を実装してする。画面UIをアニメーションさせる方法が今回のキモ。ゲームオーバー画面の下準備ゲームオーバー画面背景HUDCanvas下にImageオブジェクトを作成、名前をScreenFaderとする。Anchor:Altをクリックしながら一番右下を選択する。これによってCanvas領域全体に画像を引き延ばす。Color;いい感じの水色に設定する。これがゲームオーバー画面の背景となる。ゲームオーバー画面テキストHUDCanvas下にTextオブジェクトを作成、名前をGameOverTextとする。Over!Font:LuckiestGuyFontSize:50Allignment:中央真ん中Color:白Shadowコンポーネントを追加し、EffectDistance(2,-2)HUDCanvas内の配置順整理Scene内のオブジェクトは、Hierarchy画面で上にあるものから順に重ねて描画される。上のものが一番奥に、一番下のものが一番手前に描画されることになる。オブジェクト内の子オブジェクトも同様だ。HUDCanvas内には、ゲームオーバー画面に表示したいものとそうでないものがあるため、配置順を下記の通りに整理する。(上から)HealthUIDamageImange-ここから下がゲームオーバー画面に表示したいもの-ScreenFaderGameOverTextScoreTextゲームオーバー画面のアルファ値をゼロにゲームオーバー画面にかかわるパーツ(ScreenFaderとGameOverText)のColorからアルファ値をゼロにして透明にしておく。ゲームオーバー画面のアニメーション作成Animation作成なんと!UnityのAnimationはキャラクターのモーションだけでなくUIその他なんでもアニメにできるのだ!今回はUIのアニメを作成するぞ。HUDCanvasを選択した状態でメニューバーからWindow>Animation>Animationを選択する。このAnimationはGameビューの表示位置にドッキングさせておくと便利らしい。Unity2018ではAddCurveのボタンがAddPropertyになっているので注意。RecordModeをオンにしておくとSceneビューで直接動きをチェックしながら作れて便利っぽい、が今回は特に利用しないっぽい。AddPropertyからアニメさせる要素を追加していく。GameOverText.Text.Color:30フレーム目でアルファ値を1に設定GameOverText.RectTransform.Scale:0フレーム目で(0,0,0)、20フレーム目で(1.2,1.2,1.2)、30フレーム目で(1,1,1)に設定ScreenFader.Image.Color:30フレーム目でアルファ値を1に設定ScoreText.RectTransform.Scale:30フレーム目で(0.8,0.8,0.8)に設定ゲームオーバー画面表示処理に移行してから全体で30フレームですべてのアニメが終了するのは早すぎるので、アニメの開始タイミングを1秒と30フレーム後に変更。Animationウィンドウの要素の意味は大体こんな感じなんてこった......!たったこれだけで、「90フレームかけて透明から水色の背景に遷移しつつ、白のゲームオーバーテキストを色・大きさ共にフェードインさせ、ついでにScoreTextの大きさもちょっぴり小さくして動きのメリハリをつける」アニメーションが完成しちまったぜ!あとはこのアニメを再生するタイミングを制御するだけだな!オッといけない、このAnimationはLoop設定がOnになっているから、GameOverClipからLoopTimeのチェックを外すのを忘れないようにしないといけない。AnimatorControlleのHUDCanvasをダブルクリックで開き、空のStateを作成したらそれがデフォルトStateとなるよう設定。そこからGameOverClipへのTransitionをつなぎ、遷移条件のParameterとしてTriggerのGameOverを作成、設定しておく。/>//playerHealthクラスを格納。//ゲームオーバー画面表示からリスタートまでの時間。Unity2018ではこの部分がなかったので要追加。//Unity2018ではこの部分がなかったので要追加。UnityEngine.SceneManagement;を追加してSceneManager.LoadScene(int)を使った。/>//playerHealthクラスを格納。playerHealth;//ゲームオーバー画面表示からリスタートまでの時間。Unity2018ではこの部分がなかったので要追加。Time.deltaTime;//0になってからの時間がrestartDelayで設定した時間を超えたら現在のシーンをロードしなおす//Unity2018ではこの部分がなかったので要追加。UnityEngine.SceneManagement;を追加してSceneManager.LoadScene(int)を使った。EnemiesPrefab化したEnemyを、プレイ中にスポーンさせる処理を実装する。チュートリアルや教本でよく見るオーソドックスな方法がベースになっているものの、スポーンする種類の増やし方や複数のスポーン地点の設定など、今後のために押さえておきたいポイントも含まれている。2.1f1)では、PrefabにZomBearとHellephantが存在しなかったため、Complete-Gameフォルダからその2つのPrefabをコピーしてきた。その際、ScriptはComplete-Gameフォルダ内のものを参照していたため一度リムーブし、MyProject内のScriptに付け替えた。ZomBear,HellephantにAnimatorを設定ZomBearの場合ZomBunnyと同じアニメーション、ステート、パラメータを流用できるため、ZomBunnyと同じEnemyACをそのままAnimatorのControllerとして設定する。Hellphantの場合モデルの大きさや骨格、関節が異なるためEnemyACをそのまま流用することができない。Controllerである。Projectパネル内で新たにHellephantAOCを作成したら、InspectorのControllerに基となるAnimationControllerをD&Dで設定する。するとその下に、ステートの一覧と上書きするアニメーションを設定するカラムが表示される。今回は、Hellephantのモデル内にあるMove,Idle,Deathのアニメをそれぞれ上書きする。最後にHellephantのAnimatorコンポーネントのControllerにHellephantAOCを設定して準備完了。何が同じアニメーションで、何がそうでないのか、については一度3Dのモデリングを学んだほうが理解が深まるような気がする。今の時点では、BunnyとBearは大きさも骨格も同じだから表面のテクスチャだけ張り替えてアニメを流用してるんだろうな、というくらいの理解で流しておく。いうかそうしないとドツボにはまりそう......。空のGameObjectを作成し、EnemyManagerとリネームする。スクリプトEnemyManagerが用意されているのでそれをアタッチし中身を確認しておく。//playerHealthクラスの格納。InspectorにD&amp;DするのはPlayerオブジェクトでOK。勝手に判定してplayerHealthクラスを入れてくれる。//スポーンさせる敵のPrefabを入れる。//スポーンする場所の設定。配列になっているので、スポーンする場所を複数設定できる。本チュートリアル内では行わない模様。playerHealth;//playerHealthクラスの格納。InspectorにD&amp;DするのはPlayerオブジェクトでOK。勝手に判定してplayerHealthクラスを入れてくれる。enemy;//スポーンさせる敵のPrefabを入れる。spawnPoints;//スポーンする場所の設定。配列になっているので、スポーンする場所を複数設定できる。本チュートリアル内では行わない模様。//プレイヤーの体力が0を割っていたらそこでメソッドを抜けて、もうエネミーはスポーンさせない。0f){return;}//プレイヤーの体力が0を割っていたらそこでメソッドを抜けて、もうエネミーはスポーンさせない。spawnPointsに代入するため、EnemyごとにSpawnPointを準備する必要がある。ZomBunnyのSpawnPointを設定するため、空のGameObjectとしてZombunnySpawnPointを作成する。空のGameObjectを視覚化するため、Inspectorの名前の横から色を設定することができる。ZonbearSpawnPoint,HellephantSpawnPointも同様にコピーペーストして作成し、それぞれ既定のPositionへ置く。EnemyManagerの設定EnemyManagerのPublicな変数にInspectorから値を設定して行く。PlayerHealthは、前述したようにPlayerオブジェクトをそのままD&D。EnemyはまずZomBunnyのPrefabをD&D。(つまりEnemyの数だけEnemyManagerスクリプトをアタッチし設定する必要がある)SpawnTimeは3のままでOK。SpawnPointsは一見D&Dする場所が無いように見えるが、先ほど作成したEnemySpawnPointをD&Dすれば配列の1要素として設定することができる。二個目をD&Dすれば配列の二個目として、どんどん追加していける。ZomBear,Hellephantの分もEnemyManagerスクリプトをアタッチ、設定したら今回の作業は完了だ。おっと、HellephantのSpawnTimeをちょっと短くするのを忘れずに。実装確認いろんなところからいろんな敵が出てくるようになった。ゲームの様相を呈してきたぞ。ゾンビゲーらしくラッシュとかあってもいいなあ。points今回は、Enemyを倒したときにスコアを獲得する処理を実装する。大きく分けて下記の段取りだ。1.スコアを表示するUIを準備2.Enemyを倒したとき、そのUIを書き換えるスクリプトを実装スコアを表示するUIを準備HUDCanvasの子オブジェクトとしてUIのTextをオブジェクトを作成。アンカーを中央上部に設置したら、Positionを(0、-55,0)に設定。Widthを300、Heightを50、textのColorを白、FontをLuckiestGuy、FontSizeを50に設定。Alignmentも真ん中中央に揃え、テキストの内容を”Score:0′′に変更しておく。文字に影をつけるためShadowComponentをアタッチしたら、EffectDistanceを(2,-2)に設定しておく。これは、文字の影を本体からどのくらいの場所に置くか、の設定であり、数字を大きくすればその分だけ影が文字から離れていく。Enemyを倒したとき、そのUIを書き換えるスクリプトを実装ScoreManagerをScoreTextにアタッチ。ScoreManagerの中身を確認しよう。score:獲得したScoreを格納する。staticの説明はちょっと適切にできる自信がないが、下記のように解釈している。staticでない変数は、このスクリプト≒クラスがアタッチされたオブジェクト毎に生成されている(この生成すること、生成されたものがInstance)。オブジェクトAでは100という値をとっていても、オブジェクトBでは200という値をとっている、ということがあり得るわけだ。staticな変数はクラスに紐づいて生成されている。複数のオブジェクトにスクリプトがアタッチされていようと、オブジェクトAで100という値を記録すれば、オブジェクトBでも100という値に書き換えられる。そのため他クラスから参照する際にFindでオブジェクトを指定する必要がなく、クラスから直接呼び出すことができる。あと、シーンが変わっても破棄されない。これも、オブジェクトでなくクラスに紐づいているから。いままでStaticを使ってきた感じと、この動画の中での解説を統合して以上のように解釈してる。間違ってたらゴメンナサイ。text:ScoreTextのtextコンポーネントを格納。GetComponent():ScoreTextのtextコンポーネントを格納。“と整数scoreを代入EnemyHealthメソッドの修正Enemy死亡時に実行されるメソッドStartSinkingの中にコメントアウトされていた下記一文をコメント解除。次回、ZonBunnyのスポーンを実装する。それに備えてZonBunnyをPrefab化し、Hierarchyから削除しておく。