【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とか)
}//ここでタイムスケールが元に戻る
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
たったこれだけです。ね?簡単でしょ?
おわり
最後まで読んでくださりありがとうございます。
この記事が気に入ったらサポートをしてみませんか?