Pause(ポーズ)の作成

Unityでゲームの一時停止を考えてみましょう

Unity Pause(ポーズ)チュートリアル

チュートリアルを通して、検証してみましょう

新しくUnityPauseTestプロジェクトを作成します。

3Dでプロジェクトを作成します。

シーンをUnityPauseSceneとして、保存します。

シーンに別名をつけて保存します

Sphereオブジェクトを3つ作成します。

名前をPlayer1, Player2, Player3にします。

各オブジェクトのコンポーネントを次のようにします。

Player1

Positionは(0, 0, 0)

MoveTranスクリプトをアタッチ

public class MoveTran : MonoBehaviour
{
    void Update()
    {
        transform.Translate(new Vector3(0.016f, 0, 0));
    }
}

Player2

Positionは(0, 0, 2)

MoveTranDeltatimeスクリプトをアタッチ

public class MoveTranDeltatime : MonoBehaviour
{
    void Update()
    {
        transform.Translate(1.0f * Time.deltaTime, 0, 0);
    }
}

Player3

Positionは(0, 0, 4)

Rigidbodyをアタッチ

Pauseをコントロールするオブジェクトを作成します

Create Emptyオブジェクトを作成し、名前をGameDirectorとします。

コントロールスクリプトをアタッチします。

GameDirector

Pauseスクリプトをアタッチします

public class Pause : MonoBehaviour
{
    void Update()
    {
        if (Input.GetKeyDown(KeyCode.P))
        {
            if (Time.timeScale == 1)
            {
                Time.timeScale = 0;
            }
            else
            {
                Time.timeScale = 1;
            }
        }
    }
}

コードを実行します。

それぞれのオブジェクトの動きの違いを確認しましょう

結果について

Timeクラスのプロパティで実現します。

Time.timeScale = 0

再生速度を指定するプロパティになります。
2倍速で実行したい場合、2を代入します。
逆に1/2の速度にしたい場合は、0.5を代入します。

デフォルトは、です。にすることで、時間が停止するイメージになります。

動作について

物理演算の処理(FixedUpdate())はストップします。
フレーム間スクリプト(Update())は、止まりません。
Time.deltaTimeを掛け合わせることで、時間に影響されるコードになりますので、Translate()メソッドがストップします。

ポーズ画面の作成

UI Panelの作成

新しくPanelを作成します。

UI Buttonの作成

Panelの子オブジェクトでButtonを作成します。
Textを「再開」とします

Pauseへの移行のみにスクリプトを変更します

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

public class Pause : MonoBehaviour
{
    [SerializeField]
    GameObject pausePanel;

    private void Start()
    {
        pausePanel.SetActive(false);
    }
    void Update()
    {
        if (Input.GetKeyDown(KeyCode.P))
        {
            Time.timeScale = 0;
            pausePanel.SetActive(true);
        }
    }
}

Pause PanelにPanelオブジェクトをアウトレット接続します

実行してみます

ポーズ画面が表示されて、ボタンが一つ表示されるのを確認します。

再開ボタンを実装します

Pauseスクリプトに追記します。

public void Resume()
{
    Time.timeScale = 1;
    pausePanel.SetActive(false);
}

ボタンのクリックイベントにResumeメソッドを登録します

実行してみます

ポーズ画面が表示されて、ボタンのクリックで、再開されるのを確認します。

ポーズ画面なのにゲームオブジェクトの操作ができてしまうパターン

トピック

Rayを使った処理など、ゲームオブジェクトの情報を得るコードが実装されているケースでは、そのコードは有効となり、ポーズ画面なのに、オブジェクトの移動などができてしまいます。その場合、次のようなコードで対応しましょう

必要なusing

using UnityEngine.EventSystems;

追加コード

// 追加
if (EventSystem.current.IsPointerOverGameObject())
{
    return;
}

// 次のようなコードの前に追加します
if (Input.GetMouseButtonDown(0))
{
    Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
}

参考

Unity,小技

Posted by hidepon