見出し画像

【Unity】タイムスケールを自動で元に戻してくれるクラス考えてみた【非同期向け】

はじめに

 今回はしばらく記事を投稿できていなかったため、おやつ感覚でサクッと読める記事を書こうと思います。
 あと今回紹介するクラスは非同期向けになっているので、同期処理では上手く作動しない場合があります。ご了承ください。

事の経緯

「なんかタイムスケールをいじった後に戻す処理、書くの忘れそうだなあ」
「あ、タイムスケールもとに戻すタイミング間違えた。どこだっけ」
そう思ったことはありませんか?
 今回はそんな方に向けた、自動でタイムスケールを戻してくれる超簡素なクラスを作ってみました。

クラス紹介

早速クラス紹介していきます。

using System;
using UnityEngine;

public class TimeUtility : IDisposable
{
	private static TimeUtility s_instance = null;

	private readonly float m_timeScale;

	public TimeUtility(float timeScale)
	{
		if (s_instance is not null) Debug.LogWarning("TimeUtility instance has already been created.");
		s_instance = this;

		m_timeScale = Time.timeScale;
		Time.timeScale = timeScale;
	}
	public void Dispose()
	{
		if (ReferenceEquals(this, s_instance))
		{
			Time.timeScale = m_timeScale;
			s_instance = null;
		}
	}
}

解説

 名前はTimeUtilityとしておきます。名前はご自由に変えていただいても構いません。ちなみに名前はChat-GPTくんと相談して決めました。
 まずコンストラクタから解説していきます。

コンストラクタ

 初期値は変更したいタイムスケールの値を渡します。コンストラクタが呼び出された時点でのタイムスケールを保持しています。なので、事前にタイムスケールをお好みの時間に設定しておいてください。

Disposeメソッド

 このメソッドでタイムスケールを元の値に戻す処理をしています。

 IDisposableインターフェースを継承すると、Disposeメソッドを実装するように強制されます。このDisposeメソッドは、usingステートを抜ける際に自動で呼び出されるメソッドです。本クラスはこのDisposeメソッドが呼び出されるのを利用して自動的にタイムスケールが戻る処理を実装しています。

注意点

 注意してほしいのが、他にもTimeUtilityをインスタンス化している場合、警告が出るのとともに先に呼び出したTimeUtilityのタイムスケールを元に戻す処理が実行されなくなります。一度に何度も呼び出すと変な挙動をしてしまうので、バグ回避だと思ってください。

実装例

 では簡単にTimeUtilityを使った実装例も紹介しておきます。とんでもなく簡単です。

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
using (new TimeUtility(任意の値))
{
    // 非同期処理(yield returnとかawaitとか)
}//ここでタイムスケールが元に戻る
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

 たったこれだけです。ね?簡単でしょ?

おわり

 最後まで読んでくださりありがとうございます。

この記事が気に入ったらサポートをしてみませんか?