今回は3Dアクションゲームの作り方講座の第15回目です。前回は敵の出現処理、ボス戦等ゲームステージの一連の処理を作成しました。
前回の記事:
第15回目は時間の計測、アイテムの取得の処理を作成しゲーム性を追加していきましょう。
アイテムを獲得しながら縦横無尽にフィールドを動き回り敵と戦闘。ボスを倒すまでのタイムスコアを競うゲームとしての形ができあがります。
経過時間の表示UIを作ろう
時間を計測しましょう。今回は特別に使用はしませんが、かかった時間を表示してタイムアタック的要素を足しておきます。制限時間などを設ける場合は応用してみましょう。
「GameController」に追記します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 |
using UnityEngine.UI; public class GameController : MonoBehaviour { ・・・ // ゲームクリア画面での時間表示テキスト. [SerializeField] Text gameClearTimeText = null; ・・・ // 通常時の画面に時間表示するためのテキスト. [SerializeField] Text timerText = null; ・・・ //! 現在の時間. float currentTime = 0; //! 時間計測フラグ. bool isTimer = false; ・・・ void Update() { if( isTimer == true ) { currentTime += Time.deltaTime; if( currentTime > 999f ) timerText.text = "999.9"; else timerText.text = currentTime.ToString( "000.0" ); } } // --------------------------------------------------------------------- /// <summary> /// 初期化処理. /// </summary> // --------------------------------------------------------------------- void Init() { ・・・ currentTime = 0; isTimer = true; timerText.text = "0:00"; } ・・・ // --------------------------------------------------------------------- /// <summary> /// 敵破壊時のイベント. /// </summary> /// <param name="enemy"> 敵. </param> // --------------------------------------------------------------------- void EnemyDestroy( EnemyBase enemy ) { ・・・ if( enemy.IsBoss == false ) { ・・・ } else { Debug.Log( "GameClear!!" ); isTimer = false; if( currentTime > 999f ) gameClearTimeText.text = "Time : 999.9"; else gameClearTimeText.text = "Time : " + currentTime.ToString( "000.0" ); // ゲームクリアを表示. gameClear.SetActive( true ); ・・・ } } // --------------------------------------------------------------------- /// <summary> /// ゲームオーバー時にプレイヤーから呼ばれる. /// </summary> // --------------------------------------------------------------------- void OnGameOver() { isTimer = false; ・・・ } ・・・ } |
まず、テキストを使用するために「using UntiyEngine.UI」を追記します。
変数は「SerializeField」属性で「Text」を「gameClearTimeText」と「timerText」という名前で作成します。これらは後ほどInspectorから設定します。
また「isTimer」という時間計測フラグと「currentTime」という時間計測用の変数を作成します。
次に「Update」関数を作成します。
1 2 3 4 5 6 |
if( isTimer == true ) { currentTime += Time.deltaTime; if( currentTime > 999f ) timerText.text = "999.9"; else timerText.text = currentTime.ToString( "000.0" ); } |
中の処理です。「isTimer」が「true」つまり時間計測するときに、まず「currentTime」に「Time.deltaTime」を足していきます。
「Time.deltaTime」は1フレームの時間を表すもので「Update」は1フレームごとに実行される関数であるため、1フレームごとに「Time.deltaTime」を足していくことで経過時間(秒)を計測することができます。
次に暫定的な処理ですが「if( currentTime > 999f )」つまり経過時間が999秒を超えた場合現在時間を「999.9」という固定表示にします。
「Text」コンポーネントの表示文字を変更するには「(Textコンポーネント).text」を変更します。
999.9秒以下の通常時は、現在時刻を表示するために同じように「Text」に現在時間「currentTime」を表示します。
このときの「ToString()」はstring型以外(文字列以外)のものを文字列に変換する関数です。その引数に「”000.0″」とすることで表示の形を0埋めのこの形に指定することができます。
1 2 3 4 5 |
例) float num = 123.45; float num2 = 67.89; num.ToString( "000.0" ); => 123.4 num2.ToString( "000.0" ) => 067.8 |
あとは、「isTimer」を「false」にします。タイミングはボスを倒したとき「EnemyDestroy」つまりゲームクリア時、またゲームオーバー時です。
ゲームクリア時はクリア画面に時間を表示するために、Updateと同じText表示処理を行います。
ではUnityに戻り、Textを作成しInspectorで実行中の時間表示テキストと、ゲームクリア時のテキストを設定しましょう。
参考用に画像を載せておきますので位置や色はお好きなように設定してみてください。
追記:Canvasのインスペクターから「gameClearTimeText」と「timerText」をアタッチするのもお忘れなく(2枚目の画像は講座完成の後に追加されたのでTimerまわり以外のインスペクター欄に違いがあるかもしれませんが気にしないでください)。
アイテムの取得
アイテムを拾って何らかの効果を得る機能を追加していきましょう。
今回は回復できるアイテムを取得できるようにしていきます。
回復ポッドオブジェクトの作成
まずはオブジェクトを作成していきましょう。
本来はアセットを用いていい感じにしたいですが今回は簡易的にプリミティブの「Capsule」とパーティクルを使って作成します。
まずはHierarchyでルートに「Empty」を作成し「HealPod」という名前にして、その子に「Capsule」と「ParticleSystem」を作成します。
1 2 3 |
HealPod ( Empty ) > Capsule ( Capsule ) > ParticleSystem ( Particle ) |
「Capsule」の「CapsuleCollider」を削除し、「HealPod」に「CapsuleCollider」を付与、その「isTrigger」をオン。また「ColliderCallReceiver」も付与します。
「Capsule」、「ParticleSystem」のTransformを下記のように変更します。「HealPod」は見やすい位置に移動しておきましょう。
1 2 3 4 5 6 7 |
Capsule Position ( 0, 0.5, 0 ) Scale ( 0.2, 0.2, 0.2 ) ParticleSystem Position( 0, 0.5, 0 ) Scale ( 1, 1, 1 ) |
次にProjectウインドウで「Assets/AppMain」に「Create/Material」で新しいマテリアルを作成し「Green」とします。そしてマテリアルを選択しInspectorで色を緑にしましょう。
次回の記事:
コメント
TimerTextのところで何も表示されずエラーが出てしまいます。こちらは何をアタッチすれば良いのでしょうか
質問ありがとうございます。
”変数は「SerializeField」属性で「Text」を「gameClearTimeText」と「timerText」という名前で作成します。これらは後ほどInspectorから設定します”
この部分ですね。GameControllerスクリプトがアタッチされているCanvasのインスペクターに設定してあげることになります。
念のため画像も一枚追加しておきました。