■ゲームを管理するクラスについて
- ここでいうゲームを管理するクラスとは、プレイヤーの挙動とは別に、ライフや時間といったゲームの進行を管理するクラスのことである
- Instantiateで呼び出すこと前提のプレハブは、呼び出されるまでHierarchyの情報を参照できない。そのため、「弾丸が当たった時ライフを1減らす」といった処理をするためには、ゲームを管理するクラスをFindWithTagなどで見つけ出す必要がある。
- 今回はManagerクラスを集約したゲームオブジェクトを一つ作り、このオブジェクトにManagerタグをつけた。これにより、複数のManagerクラスを1つのオブジェクト、1つのタグだけで管理できるようにした。
- 「敵の遠隔攻撃①」や「アイテム」で紹介したスクリプトなどもFindWithTagでManagerタグから必要としている管理クラスにアクセスしている
■uGUIによる可視化
- uGUIとはUnity4.6から実装された、Unity独自のGUI(Graphical User Interface)のことである。Unity4.6以前は、有志の開発したnGUIが推奨だったのでそれと区別するためにuGUIと呼ばれる。
- 今回、タイトル画面やゲームオーバー画面はCanvasの子オブジェクトとして作成し、このオブジェクトのアクティブを切り替えることで表現している
- Canvasの子要素はTransformではなくRectTransformとなっており、アンカーと呼ばれる概念が追加されている。これは親オブジェクトのどの位置をPivotの位置にするかというものである。これを利用することで矩形の計算が楽になるほか、解像度が変わってもレイアウトを崩れにくくすることができる。
- Pivotはどの位置をRectTransformの原点にするかというものである。値の範囲は0~1である。(0, 0)なら左下、(0.5, 0.5)なら中央、(1, 1)なら右上である。これだけ見ると何が何やらといった気分になるが、要はxy座標系の位置で考えている。例えば、左上を原点にしたい場合はPivotを(0, 1)にすれば良い。
- Canvasはシーンビューでは巨大に表示される。そういうものなので驚かないこと。また、シーンビュー及びゲームビューに表示されるCanvasの大きさは、現在表示しているゲームヴューの大きさに連動している。640x480の画面ではどうなっているかなどを確認したい場合は、ゲームビューをその大きさにするか、その大きさを入力したオブジェクトを作って要素を中に入れるか、ゲームを再生して確かめことになる。
- uGUIをスクリプトで扱う場合は名前空間(NameSpace)にusing UnityEngine.UIが必要になるので忘れないこと!(例)
- 今回作ったCanvasの中身は次のようなもの
■スコアとタイム
■ライフ
- スクリプトは こちら を参考のこと
- ライフを示すハートの画像は初めから8個用意しておき、不要な分は非アクティブにしている
- Colorは不透明なものと半透明なものを初めから用意しておき、これを切り替えることでダメージ・回復を表現している。なお、Colorクラスは一部の値だけを変えることができない。そのためnew Colorで書き換えるか、今回のように差し替えるか、もしくはVector3のように加減算することになる。当初はα値の加減算で表現していたが、Colorは0~1以外の値も持ててしまうので不具合が多かった。(参考記事)
- LayoutGroupを活用している。ハートの配置はHorizontalLayoutGroupを使い、さらにこのハート群と「じょうげん:8」の文字の配置にはVerticalLayoutGroupを使っている。矩形の計算をしなくて済むので便利。
■GameOver画面のノウハウ
- Animationを利用している(参考)
- アニメーション後の配置をシーンビューで見れるようにしたかったので、当初は最終的な配置の状態で描画系を非アクティブにしておき、Animationの0.1秒目で配置をアニメーションの初期値に移動させ、0.2秒目で描画系をアクティブに戻すようにしていた。ただし、これだと解像度の変更に対応できない。結局、初めからアニメーション前の配置にしておき、アニメーション後の配置を見たいときはアニメーションを再生することにした。
- uGUIにおけるCanvasの要素はHierarchyの順に描画される。今回はスコアだけGameOverの背景の上に表示されるようにした。
- 吹き出しは9 Sliceという機能を利用している(参考:公式動画の1:50から)。今回のように丸みのある複雑な画像でも、1ピクセルをひたすら引き延ばすというという荒技が使える。
0 件のコメント:
コメントを投稿