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を代入します。
デフォルトは、1です。0にすることで、時間が停止するイメージになります。
物理演算の処理(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);
}
ディスカッション
コメント一覧
まだ、コメントがありません