Unityチュートリアル はじめてのゲーム開発 JohnLemon④

Image Unity

Part4

UIを追加

Hierarchy→UI→Image

今回はEventSystemを使わないので消しておきます。

SceneWindowで2Dボタンをクリックし、2Dを有効にする。

Canvasの設定

Hierarchy→Canvas

CanvasをFiderCanvasに変更しておきます。

Canvas ScalerとGraphic Raycasterは使わないので消しておきます。

これでCanvasの設定は終わりです。

 

 

Imageを設定

Hierarchy→FiderCanvas→Image

SceneWindowのEffectをクリックし、画像を正しく表示します。

Rect Transfromを変更します。

正方形のアンカーを押して、右下のアンカーを選択します。

サイズを変更し画像を画面いっぱいに引き伸ばします。

RectTransfromはすべて0に変更し、AnchorsのMaxを1に変更します。

最後にImageScriptのColorを変更します。

R:0 G:0 B:0

これにより画面が黒色に設定する子ができました。

クリア画面を追加

ImageをExitImageBackgroundに名前を変更し、右クリックしてUI→Imageで新しいImageを追加

こちらは、ExitImageに名前を変更しておきます。

Assets→Textures→UI→WON

WONをSource Imageに追加します。

Rect Transformでアンカーを変更します。

AnchorsのMinのX、Yともに0に、ManのX、Yともに1に変更

Rect TransformのLeft、Right、Top、Buttomを0に設定し、写真を引き伸ばします。

最後にImageコンポーネントでImage Type→Preserve Aspectにチェックを入れます。これにより、画像は押しつぶされたり引き伸ばされたりしなくなります。

 

Canvas Groupコンポーネントを追加

Hierarchy→FaderCanvas→ExitImageBackground

Add CompornentでCanvas Groupを追加します。

Alphaを0に変更し、2Dモードを終了します。

ゴールを作成

Hierarchy→Create→GameObject

GameObjectを作成し、GameEndingに名前を変更します。

Transform Positionを X18, Y1, Z1.5に変更します。

この座標がこのゲームのゴールになります。

このままでは、ゴールとして認識できないのでトリガーを追加します。

Add ComponentでBox Colliderを追加。

Is Triggerにチェックを入れます。

出口のサイズに合うようにBox ColliderのサイズをX1, Y1, Z3.5変更します。

GameEndingスクリプトを作成

Assets→Create→C#Script

GameEndingスクリプトを作成します。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class GameEnding : MonoBehaviour
{
// Start is called before the first frame update
void Start()
{}// Update is called once per frame
void Update()
{}
}

作成したらスクリプトをダブルクリックして、public classがGameEndingになってることを確認してください。

スクリプト名とclass名が異なっている場合は変更してください。

GameEndingスクリプトを変更します

とりあえず邪魔なコメントやStartメソッド、Updateメソッドを消します。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class GameEnding : MonoBehaviour
{}

 

最初に一定時間画面をフェードアウトさせるので、パブリック変数を追加します。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class GameEnding : MonoBehaviour
{
public float fadeDuration = 1f;
}

今回は、デフォルトで1秒に設定しましたが、inspectorから自分の好きな時間に変更することが可能です。

 

次にプレイヤーがゴールした時にイベントが発生するように、プレイヤーを参照できるようにします。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class GameEnding : MonoBehaviour
{
public float fadeDuration = 1f;
public GameObject player;
}

GameObjectを検出するために、MonoBehavioursの特別なメソッドを使用します。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class GameEnding : MonoBehaviour
{
public float fadeDuration = 1f;
public GameObject player;

void OnTriggerEnter(Collider other)
{

}
}

JohnLemonがBox Colliderにヒットしたときのみにエンディングが流れるようにプログラムに追記します。

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)
}
}

Updateメソッドを追加

先ほど邪魔だったのでUpdateメソッドを消してしまいましたが、使用するのでまた追加します。

OnTriggerEnterは、Colliderが最初に一回だけ呼び出されますが、すべてのフレームごとに呼び出す必要があるのでUpdateメソッドを使います。

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)
}

void Update()
{

}
}

Canvas Groupをフェードインし始めるタイミングを知るために、bool変数を使います。

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)
}

void Update()
{

}
}

OnTriggerEnterメソッドのif文に先ほど作成したbool変数を使用します。

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()
{

}
}

OnTriggerEnterでboolを設定したら、Updateメソッドでboolをが設定されているかどうかを確認するためにUpdateメソッドにIf文を追加します。

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は、フレームごとに呼び出され、プレイヤーが出口にいるかどうかを確認します。

Updateメソッド内のif文に追記

Updateメソッドの下にEndLevelメソッドを追加し、Updateメソッド内のif文の中にEndLevelメソッドを追加します。

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)
{
EndLevel();
}
}

void EndLevel()
{

}
}

EndLevelメソッドは、Canvas Groupをフェードしてからゲームを終了する必要があるので、publicメソッドを作成します。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class GameEnding : MonoBehaviour
{
public float fadeDuration = 1f;
public GameObject player;
public CanvasGroup exitBackgroundImageCanvasGroup;

bool m_IsPlayerAtExit;

void OnTriggerEnter(Collider other)
{
if(other.gameObject == player)
{
m_IsPlayerAtExit = true;
}
}

void Update()
{
if(m_IsPlayerAtExit)
{
EndLevel();
}
}

void EndLevel()
{

}
}

フェード画完了する前に、ゲームが終了しないようにタイマーを追加

追加したタイマーを開始するために、最後のフレームから経過した時間を取得

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class GameEnding : MonoBehaviour
{
public float fadeDuration = 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;
}
}

JohnLemonが出口に到達したときに画像がフェードインするようにします。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class GameEnding : MonoBehaviour
{
public float fadeDuration = 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;
}
}

フェードが終了したらゲームを終了するようにします。

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();
}
}
}

最後にGameEndingスクリプトの設定

PlayerにJohnLemon、ExitBackGroundImageCanvasGroupにExitImagegroundを追加して終了です。

コメント

タイトルとURLをコピーしました