
ゲームのエンディング
Tutorial
Beginner
+0XP
45 mins
(130)
Unity Technologies

「John Lemon's Haunted Jaunt」を作成する上で、次のステップはゲームのエンドポイントを作ることです。これにより、完全なプレイヤー体験を作ることができ、コードを書く自信を養うことができます。
このチュートリアルでは、以下の作業を行います。
- UI(ユーザーインターフェース)機能を使用してゲーム終了画面を作成する
- GameEnding トリガーの作成
- カスタムゲームエンディングスクリプトを書く
このチュートリアルを完了したら、プレイヤーのタスクをより難しくさせるために敵の配置ができている状態の完成したレベルになります。
1. UI のセットアップ
ゲームのキャラクターや環境、カメラの設定をするのに、すでにかなりの労力を費やしていますよね。次に、JohnLemon がお化け屋敷を脱出したときにゲームが実際に終了するように、エンディングを作成する必要があります。この作成が終われば、ゲームに敵を配置し、最終的な機能強化を行う準備が整います。
取り掛かる前に、自分が何を達成しようとするのかを知ることが大切です。
JohnLemon が出口に到達すると、ゲームはフェードアウトして終了しますが、これには注意が必要です。Unity エディターで終了するのと、最終的にビルドされたバージョンのゲームで終了するのとは異なります。
まず、ゲームをフェードアウトさせる必要がありますが。そのためには、Unity の UI(ユーザーインターフェース)システムを使うことになります。
1. Hierarchy ウィンドウで、 Create ボタンをクリックします。これは、あらゆる種類の基本的なゲームオブジェクトを作成するために使用することができます。
2. UI > Image の順に進みます。UI 画像はプレイヤーの画面全体に引き伸ばすことができ、不透明度を変更してフェード効果を作成できます。完璧です!
これにより、いくつかの新しいゲームオブジェクトがシーンに追加されます。
3. Scene ウィンドウで、トップバーの 2D ボタンをクリックして 2D モードを有効にします。これで、新しいゲームオブジェクトが適切に表示されるようになります。
4. Hierarchy で、 Canvas にあるゲームオブジェクトを選択します。シーンにカーソルを合わせて F を押します。
5. キャンバスと画像をより近くで見るためにズームインします。スクロールホイールを使用するか、Alt キーを押しながら右クリックしてドラッグします。
6. Hierarchy で、EventSystem のゲームオブジェクトを選択します。
このゲームオブジェクトには、画面上の任意の UI 要素がユーザー入力と相互作用できるようにするためのコンポーネントがアタッチされています。しかし、ゲーム内でプレイヤーが UI を操作する必要はありません。
7. EventSystem のゲームオブジェクトを右クリックし、 Delete を選択します。
次に、残りの 2 つのゲームオブジェクト(Canvas と Image)を使ってフェード効果を作ります。
2. Canvas の設定
1. Hierarchy で、Canvas の名前を FaderCanvas に変更します。
2. Inspector で、FaderCanvas にアタッチされているコンポーネントを見てみましょう。
その Transform コンポーネントは、これまでに見たものとは異なることに注意してください。UI システムの一部であるゲームオブジェクトは、その位置をより制御しやすくするために、 Rect Transform コンポーネントを有します。UI ヒエラルキーのルートにある Canvas については、Rect Transform の設定は読み取り専用です。
3. Canvas コンポーネントは、その Canvas に属する UI 要素がどのようにレンダリングされるかを制御します。このレンダリングは、主に Render Mode 設定によって制御されます。
Render Mode には下記の 3 つが存在します。
- Screen Space - Overlay:キャンバスはスクリーンのサイズに合わせて縮小拡大され、キャンバスのすべての UI 要素は他のすべての要素の上にレンダリングされる
- Screen Space - Camera:キャンバスはスクリーンのサイズに合わせて拡大縮小されるが、UI 要素は指定されたカメラによってレンダリングされ、カメラからの距離によってサイズも左右される
- World Space:UI がシーン内に存在し、UI 要素は他のオブジェクトの前面または背面にレンダリングされる(例えば、3D ワールドのキャラクターの上にあるネームタグなど)
画像をスクリーンのサイズに合わせて拡大し、他のすべての要素の上にレンダリングさせます。つまり、 Screen Space - Overlay のデフォルトのレンダーモードが最適です。
4. FaderCanvas のゲームオブジェクトの次のコンポーネントは Canvas Scaler です。これは、UI 要素がさまざまな画面サイズで表示されるときに、UI 要素の相対的なサイズを制御する簡単な方法として使用されます。画像はスクリーンに合わせて拡大されるので、相対的なスケールを気にする必要はありません。
Canvas Scalar コンポーネントの右上にある歯車のアイコンをクリックして、コンテキストメニューを開きます。Remove Component を選択します。
5. FaderCanvas ゲームオブジェクトの最後のコンポーネントが Graphic Raycaster です。これは、クリックなどの UI イベントを検出するために使用されます。どの UI 要素がクリックされたかを特定し、その要素にイベントを送信して、適切なコンポーネントが反応できるようにします。プレイヤーはゲームの UI とインタラクトしないため、このコンポーネントは必要ありません。
Graphic Raycaster コンポーネントの右上にある歯車のアイコンをクリックして、コンテキストメニューを開きます。Remove Component を選択します。
3. 画像を引き伸ばす
次のステップは、画像をスクリーン全体に引き伸ばすことです。
1. Hierarchy で、必要な画像のゲームオブジェクトを選択します。
2. ツールバーから Rect Tool を選択するか、 T キーを押します。
3. ちょっと待って!何かおかしなことが起きています。どうして Rect Tool で指定した場所に画像が表示されないのですか?
これは、前回のチュートリアルで設定したポストプロセシングを Scene ウィンドウで使用しているためです。
4. Scene ウィンドウの Effects ボタンをクリックし、すべてのエフェクトを有効にしたら、もう一度クリックしてすべてのエフェクトを無効にします。
これで画像が正しく表示されるはずです。
4. Rect Transform コンポーネントとは
Rect Transform コンポーネントを詳しく見ていきましょう。
3D ゲームオブジェクトの配置は、ゲームオブジェクトのピボット点で表されます。Transform コンポーネント内のこのピボットポイントの位置は、ゲームオブジェクトの親からの相対的なものです。Rect Transforms は似たような機能ですが、UI 要素が領域を表すことができるため、いくつかの違いがあります。Rect Transform の位置は、親の単一ピボットポイントに対する相対的な配置ではなく、 親の四角形領域 に対する相対的な位置となります。親のこの領域は、 Rect Transform の Anchors によって表されます。
Scene ウィンドウで花のようなギズモを見たことがあるかもしれません。
これは実際には複数のポイントを合わせたものです。それぞれのポイントがアンカーになっています。4 つのアンカーポイントによって作られた長方形は、親の総面積の割合です。
画像は FaderCanvas の子で、スクリーン全体に表示されます。これは、画像の位置がスクリーン全体の領域に対して相対的であることを意味します。
UI 要素の配置はピクセル単位で測られます。特にすべての画面が同じ画素数を持つわけではないので、これは非常に重要です。これがアンカーシステムを強力なものにしているのです。アンカーがすべて一緒になって点を表示すると、Rect Transform は、UI 要素がその点からオフセットされた位置をピクセル単位で表示します。
しかし、アンカーが分離されている場合は、Rect Transform はアンカー領域の両側からのピクセルオフセットを示します。
では、これはゲームにどのように適用されるのでしょうか?そうですね、画面全体をフェードアウトする必要があります。つまり、画像はスクリーンの形状やサイズに関係なく、スクリーン全体をカバーする必要があります。そのためには、アンカー領域がスクリーン全体であり、その領域からのオフセットがないことを確認する必要があります。
5. Rect Transform コンポーネントの設定
Rect Transform コンポーネントの設定は以下の通りです。
1. Hierarchy ウィンドウで、 Image ゲームオブジェクトを選択します。
2. Inspector で、Rect Transform コンポーネントを見つけます。Anchors の設定を展開します。
3. x と y の 最小値を 0 に設定します。x と y の 最大値を 1 に設定します。
アンカーは親と相対的なものであることを忘れないでください。0 は画面の左端または下端、1 は画面の右端または上端を意味します。
アンカーを設定すると、画像の位置が変更されていることがわかるはずです。位置(position)は、左、上、Pos Z、右、下と表示されるようになりました。Pos Z (これは無視できます)以外、これらはゲームオブジェクトのアンカー領域からの距離をピクセル単位で表しています。負の値は、要素がアンカー領域外にあることを示します。値が 0 の場合は、アンカー領域からのオフセットがないことを意味します。
上の例では、画像の左側はアンカー領域の左側から 394 ピクセル、画像の右側はアンカー領域の右側から 942 ピクセル、画像の上側はアンカー領域の上側から 487 ピクセル、画像の下側はアンカー領域の下側から 145 ピクセルとなっています。
4. 画像のアンカー領域がスクリーン全体になることから考えると、オフセットは必要ありません。画像の Rect Transform で、 Left、Top、Right、 Bottom のプロパティを 0に設定します。
6. 画像がスクリーン全面に引き伸ばされます。
この画像は今は適切なサイズなのですが、色が合っていません。
7. Inspector で、Image コンポーネントを見つけます。
最初のプロパティは Source Image と呼ばれるものです。これにより、指定した画像を表示することができます。それが空白のままであれば、ソリッドカラーの長方形を取得します。これは、 Color プロパティで設定できます。
8. Color ピッカーウィンドウを開きます。RGB チャンネルを 0 に設定し、A を最大値(範囲が 0~1 の場合は 1、0~255 の場合は 255)にします。これで色が黒に設定されます。
A は Color: Alpha を構成する 4 番目のチャンネルです。Color の Alpha 値は、いかに透明度が高いかを表しています。Alpha 値が低いほど、ゲームオブジェクトの透明度が高くなります。画像の Alpha 値を調整することがフェードインとフェードアウトを行うための鍵となります。
9. エディター内の他の部分をクリックしてピッカーウィンドウを閉じます。
これで画面が真っ黒になりましたね
6. 勝利したときの Victory 画像の追加
次に、真っ黒な画面の上に表示する画像を追加します。
1. Hierarchy で、現在の画像のゲームオブジェクトの名前を ExitImageBackground に変更します。
2. ExitImageBackground のゲームオブジェクトを右クリックします。表示されたコンテキストメニューから、 UI > Image の順に選択します。
このようにして、ゲームオブジェクトを右クリックし、別のゲームオブジェクトを作成すると、新しく作成されたゲームオブジェクトはクリックしたゲームオブジェクトの子になります。この新しい ExitImage ゲームオブジェクトは、ExitImageBackground ゲームオブジェクトの子であるため、上にレンダリングされます。
3. この新しい画像のゲームオブジェクトの名前を ExitImage に変更します。
4. 写真を追加してみましょう。Inspector で、Image コンポーネントを見つけます。
5. Source Image プロパティの丸い選択ボタンをクリックします。ダイアログボックスで、 Won という画像を検索して選択します。
6. これで Image コンポーネントで利用可能な設定が追加されました。
重要な問題を修正するには、これらの設定が必要になります。画像が画面いっぱいになりますが、正しいアスペクト比を維持する必要があります。この問題を確認するために、親で行ったように Rect Transform のサイズを変更してみましょう。
7. Inspector で、Rect Transform コンポーネントを見つけます。Anchors の設定を展開します。
8. x と y の最小値を 0 に設定します。x と y の最大値を 1 に設定します。
9. Left、Right、Top や Bottom のプロパティを 0 に設定します。画像が引き伸ばされて見えるようになりました!
10. Image コンポーネントで、Image Type プロパティを見つけます。Preserve Aspect チェックボックスを有効にします。これにより、画像は押しつぶされたり引き伸ばされたりすることなく、Rect Transform 内に収まる大きさになります。
7. Canvas Group コンポーネントの追加
次に、これらの UI 要素をフェードイン、フェードアウトさせたいときにどうすればいいのかを考えてみましょう。Image コンポーネントの Alpha 値を調整してフェードアウトできることはすでにご存じでしょう。しかし、画像が 2 つになったので、1 つの値だけを変更するのではなく、両方の色を変更する必要があります。これを行うために、 Canvas Group と呼ばれるコンポーネントがあります。
Canvas Group を使用すると、ゲームオブジェクトとそのすべての子に表示されるすべての UI 要素の一部を制御することができます。
Canvas Group コンポーネントを追加する手順は以下の通りです。
1. Hierarchy ウィンドウで、ExitImageBackground のゲームオブジェクトを選択します。
2. Inspector で、Canvas Group コンポーネントを追加します。
Alpha プロパティを 0 に変更します。
3. UI の作成が終わったので、Scene ウィンドウをレベルに戻してみましょう。まず、Scene ウィンドウで 2D モードを無効 にします。
4. Hierarchy ウィンドウで、JohnLemon ゲームオブジェクトを選択します。Scene ビューの上にカーソルを置いた状態で、F キーを押してフォーカスを合わせます。
5. Hierarchy ウィンドウで FaderCanvas ゲームオブジェクトを折りたたみます。Windows では Ctrl + S、macOS では CMD + S を押してシーンを保存します。
さあ、これでまたレベルが見れるようになりましたね。次に、UI フェードをトリガーおよび制御する方法が必要です。
8. GameEnding トリガーの作成
コンピューターは、Canvas Group の Alpha プロパティの値を変更するタイミングを知ることができるように、JohnLemon がお化け屋敷を出たことを認識する方法を必要としています。物理オブジェクト(例えば、キャラクターの JohnLemon)が特定の場所に入ったことを検出するための一般的なテクニックは、 Trigger を使用することです。
Triggers(トリガー)とは、動きを妨げないコライダーのことです。物理オブジェクトを自由に通過させる代わりに、他のアクションが起こせるようにトリガーイベントを報告します。
まずはトリガーを作成してみましょう。
1. Hierarchy ウィンドウで、Create メニューをクリックし、 Create Empty を選択します。このゲームオブジェクトの名前を GameEnding に変更します。
2. GameEnding の Transform の位置を(18, 1, 1.5)に設定します。これはレベルの出口の途中にあります。
3. 次は、トリガーを追加する必要があります。Inspector で、GameEnding ゲームオブジェクトに Box Collider コンポーネントを追加します。(Box Collider 2D を追加してもうまくいかないのでご注意ください!)
4. Is Trigger チェックボックスを有効にします。これにより、コライダーがトリガーに変わります。
5. 次に、出口をカバーするようにトリガーのサイズを変更する必要があります。JohnLemon はそこに入っていかないと脱出できません。これには次の 2 つの方法があります。Edit Collider ボタンをクリックして、Scene ウィンドウでボックスコライダーのサイズを変更するか、Center と Size のプロパティを手動で設定するかです。Scene ウィンドウでトリガーを編集してみましょう。
Edit Collider ボタンをクリックすると、Scene ウィンドウのトリガーの横に「ハンドル」が表示されます。
6. ボックスコライダーの面を変更するには、クリックして好きな位置にドラッグしてください。廊下と同じサイズにトリガーを合わせる必要があります。これによって、JohnLemon は廊下を通過せずに外に出ることができなくなります。
終了したら、もう一度 Edit Collider ボタンをクリックしてください。Scene ウィンドウからハンドルが表示されなくなったら、コライダーを編集することはできません。
7. あるいは、コライダーのサイズを(1, 1, 3.5)に設定することもできます。
これでトリガーは完了しましたが、使用するにはスクリプトを作成する必要があります。
9. 新しいスクリプトを作成する
まず最初に、スクリプトアセットを作成してみましょう。
1. Project ウィンドウで、Asset > Scripts の順に選択します。
2. Create メニューから C# Script を選択します。スクリプト名を「GameEnding」とします。
アセットの名前は、スクリプト内のクラス名と完全に一致しなければならないことを忘れないでください。間違えた場合は、アセットを削除してからもう一度作成してください。
3. Project ウィンドウのスクリプトアセットを Hierarchy ウィンドウの GameEnding ゲームオブジェクトにドラッグします。それによりコンポーネントとして追加されます。
4. さあ、これでスクリプトに機能を持たせるための編集を始めることができます。スクリプトアセットをダブルクリックして編集用に開きます。
10. GameEnding スクリプトの起動
スクリプトを起動する手順は以下の通りです。
1. Start と Update メソッドとそれらのコメントを削除します。クリーンスクリプトは以下のようになります。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class GameEnding : MonoBehaviour
{
}2. 必要な情報について考えてみましょう。
まず、一定時間で画面がフェードアウトする必要があります。Inspector から調整できるように、パブリック変数にする必要があります。また、整数以外の数値を使用できるので、変数は float である必要があります。
フェードを繰り返させる妥当なデフォルト値は 1 秒なので、それをデフォルトとして設定しましょう。中括弧の間に、以下の行をスクリプトに追加します。
public float fadeDuration = 1f;3. 次に、プレイヤーのキャラクターがトリガーに衝突したときにフェードが発生するように指定する必要があります。JohnLemon がトリガーに衝突した時にのみ発生するようにするには、そのゲームオブジェクトへの参照が必要です。ここでも、インスペクターから調整できるように、これはパブリック変数にすべきです。
fadeDuration 変数宣言の下に以下の行を追加します。
public GameObject player;これで、2 つの主要な変数が宣言されました。
4. このクラスの重要な役割の 1 つは、プレイヤーが制御するゲームオブジェクトを検出することです。次に、 OnTriggerEnter と呼ばれる MonoBehaviours 用の別の特別なメソッドを使用します。変数宣言の下に以下のメソッド定義を追加します。
void OnTriggerEnter (Collider other)
{
}
5. JohnLemon がボックスコライダーに衝突したときにのみエンディングがトリガーされるようにするには、以下の if 文を中括弧の間にある OnTriggerEnter メソッドに追加します。
if (other.gameObject == player)
{
} これは、 等価演算子と呼ばれる新しい演算子を使用します。これは等値演算子(==)で表され、結果は bool となります。戻り値は、どちらかの側にあるものが同じである場合は true、そうでない場合は false です。
上のコードはコンピュータに指示しています。「他のコライダーのゲームオブジェクト(トリガーに入ったもの)がJohnLemon のゲームオブジェクトへの参照と同等であれば、コードブロックにあるものは何でも実行してください。」
6. ここまでのスクリプトを見直してみましょう。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class GameEnding : MonoBehaviour
{
public float fadeDuration = 1f;
public GameObject player;
void OnTriggerEnter (Collider other)
{
if (other.gameObject == player)
{
}
}
}C#では、クラス内でメソッドがどの順番で宣言されているかは問題ではないことを覚えておいてください。少し違う順番を使用した可能性もありますが、それはそれで構いません。
11. Update Method の追加
ここで、UI のフェードインが始まり、ゲームが終了したらゲームを終了する if 文のコードを追加する必要があります。現在のところ問題があります。OnTriggerEnter はコライダーが最初に重なったときに一度だけ呼び出されます。フレームごとに呼ばれるものが必要なので、Canvas Group のアルファを少しずつ変えていくことができます。
3番目のチュートリアルでは、フレームごとに呼び出される Update メソッドを使用しました。これは以下の場所で使用できます。
1. OnTriggerEnter の下に以下のように Update メソッドを追加します。
void Update ()
{
}2. Canvas Group をフェードインするタイミングを知る方法が必要です。Canvas Group はフェードするかしないかのどちらかであるべきなので、 bool 変数 はこれに最適です。パブリック変数宣言と OnTriggerEnter 定義の間に、以下のように m_IsPlayerAtExit という bool 変数を作成します。
bool m_IsPlayerAtExit;3. bool を使ってみましょう!まず最初に設定する必要があります。OnTriggerEnter メソッドの if 文のコードブロック内で、以下のように m_IsPlayerAtExit を true に設定します。
m_IsPlayerAtExit = true;4. これで OnTriggerEnter で bool が設定されたので、Update で設定されているかを確認する必要があります。Update メソッドの中括弧内に if 文を追加します。
if(m_IsPlayerAtExit)
{
}5. スクリプトは現在以下のようになるはずです。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class GameEnding : MonoBehaviour
{
public float fadeDuration = 1f;
public GameObject player;
bool m_IsPlayerAtExit;
void OnTriggerEnter (Collider other)
{
if (other.gameObject == player)
{
m_IsPlayerAtExit = true;
}
}
void Update ()
{
if(m_IsPlayerAtExit)
{
}
}
}これまでにコーディングした内容を詳しく見てみましょう。
OnTriggerEnter と Update の 2 つのメソッドを追加しました。OnTriggerEnter が呼び出されると、コンピューターは、トリガーに入ったコライダーがプレイヤーのキャラクターに属しているかどうかをチェックします。Update はフレームごとに呼び出され、プレイヤーのキャラクターが出口にいるかどうかをチェックしています。プレイヤーのキャラクターが出口にいる場合は、if 文のコードブロックにドロップします。それ以外の場合は何もしません。
12. if 文のコードブロックを書く
次に、その if 文のコードブロックを書く必要があります。
1. Update の下に EndLevel という新しいメソッドを作成します。これは何も返す必要がなく、パラメーターも必要ないので、以下のようになります。
void EndLevel ()
{
}これできちんと整理するのが楽になりますね。
2. Update メソッドの if 文の中に、EndLevel メソッドへの呼び出しを追加します。
EndLevel ();3. EndLevel メソッドは Canvas Group をフェードしてからゲームを終了させる必要があります。これまではコンポーネントへの参照を見つける際に GetComponent メソッドを使用していましたが、このスクリプトと同じゲームオブジェクトのコンポーネントに対してのみ機能します。
今回は、インスペクターで割り当てることができる Canvas Group コンポーネントのパブリック変数を作成します。
このパブリック変数宣言を プレイヤー変数宣言 の下に追加します。
public CanvasGroup exitBackgroundImageCanvasGroup;4. また、フェードが終わる前にゲームが終了しないように、タイマーも必要です。変数を宣言している間に、他にも必要なものがあるかもしれないことを考えなければいけません。
m_IsPlayerAtExit bool の下に以下の変数宣言を追加します。
float m_Timer;5. 次に、EndLevel メソッドはタイマーのカウントアップをスタートする必要があります。最後のフレームからどのくらいの時間が経過したかを取得する方法があることを PlayerMovement スクリプトで習ったかもしれませんが。Time.deltaTime を使用します。
タイマーをカウントアップ変数自体と deltaTime を足した値に設定することができます。しかし、まさにそれを言うなら、加算代入(+=)演算子を使うショートカットがあります。
中括弧内の EndLevel メソッドに以下の行を追加します。
m_Timer += Time.deltaTime;ここで、加算代入(+=)演算子は、左側にあるものは何であれ、それ自体に加えて右側にあるものに等しくなるように設定することを示しています。
6.それでは、Canvas Group の Alpha を設定します。Alpha 値は、タイマーが 0 の時は 0、fadeDuration までの時は 1 とします。この値を得るためには、タイマーを持続時間で割ることができます。
EndLevel メソッドに先ほど追加した加算代入(+=)演算子の行の下に以下のコードを追加します。
exitBackgroundImageCanvasGroup.alpha = m_Timer / fadeDuration;これで、JohnLemon が出口に到着すると画像がフェードインしますが、終了する前にもう少し整理しなければならないことが残っています。
7. 最後に、フェードの終了時にゲームを終了する必要があります。タイマーが継続時間よりも長くなるとフェードが終了します。
追加した前の行の下に新しい演算子を追加します。
if(m_Timer > fadeDuration)
{
} 右向きの山括弧は、左側にあるものが右側にあるものより大きいかどうかをテストします。もしそうなら true を返し、そうでなければ false を返します。
if 文のコードブロックはアルファ値が 1 までの場合のみ実行されるので、あとは以下の行をコードブロックに追加してゲームを終了させるだけです。
Application.Quit();8. ここで大事なことがあります。このメソッドを使うと確かにゲームを終了しますが、完全に構築されたアプリケーションでのみ機能します。現在のところ、ゲームはエディターでプレイするだけのプロジェクトなので、これではまだ何もできません。本シリーズの最後のチュートリアルでゲームのビルドを行います。これを完了すると、コードの行が正しく動作します。それまでは、以前と同じように再生モードを終了する必要があります。
9. 現在の状態では、スクリプトにより画像のフェードが終了するとすぐにゲームが終了します。画像がフェードインし、プレイヤーが少しの間それらを見て、ゲームが終了した場合、それははるかに良くなるはずです。
これを実現するために必要なのは、最後の if 文に時間を追加することです。これを変数にすることで、必要に応じて将来的に画像の表示時間を変更することができます。
fadeDuration 変数宣言の下(クラスの先頭周辺)に、別の duration 変数宣言を追加します。
public float displayImageDuration = 1f;10. あとは、if 文の fadeDuration にこの duration を追加して、それを変更するだけです。
if(m_Timer > fadeDuration + displayImageDuration)
{
Application.Quit();
}完了です!完成したスクリプトは以下のようになるはずです。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class GameEnding : MonoBehaviour
{
public float fadeDuration = 1f;
public float displayImageDuration = 1f;
public GameObject player;
public CanvasGroup exitBackgroundImageCanvasGroup;
bool m_IsPlayerAtExit;
float m_Timer;
void OnTriggerEnter (Collider other)
{
if (other.gameObject == player)
{
m_IsPlayerAtExit = true;
}
}
void Update ()
{
if(m_IsPlayerAtExit)
{
EndLevel ();
}
}
void EndLevel ()
{
m_Timer += Time.deltaTime;
exitBackgroundImageCanvasGroup.alpha = m_Timer / fadeDuration;
if(m_Timer > fadeDuration + displayImageDuration)
{
Application.Quit ();
}
}
}
必ずスクリプトを保存してから、Unity エディターに戻ってください。
13. GameEnding スクリプトの変数を設定する
スクリプトでは、エディターで設定する必要のある変数をいくつか作成しました。これらにより、ゲームのカスタマイズや変更のテストが容易になります。
変数を設定するには、以下の手順に従います。
1. Hierarchy で、GameEnding ゲームオブジェクトを選択します。
2. Hierarchy ウィンドウから JohnLemon ゲームオブジェクトを Inspector の Game Ending スクリプトにドラッグします。これで Player 変数が代入されます。
3. Hierarchy で、FaderCanvas を展開します。ExitImageBackground ゲームオブジェクトを Game Ending コンポーネントの Exit Background Image Canvas Group フィールドにドラッグします。Unity は自動的に正しいコンポーネントを見つけて、 Exit Background Image Canvas Group 変数を割り当てます。
4. シーンの保存
ゲーム終了の作成が完了しました!再生モードにして試してみてください。終了したら、再生モードを終了させることを忘れないでください。 最後のチュートリアルでゲームのビルドを作成するまで、自動終了は機能しません。
14. まとめ
今回のチュートリアルでは、ゲームのエンディングのためのシステムを作成していただきました。そのために、UI 機能を使用し、トリガーを追加して別のカスタムスクリプトを作成しました。これで動作するゲームができましたが、不気味な屋敷は、ここに取り憑いている奇妙なお化けたちなしには存在し得ません!次に、幾つか動かない敵を作成してゲームに追加します。