以下の内容はhttps://www.karvan1230.com/entry/2024/03/05/214159より取得しました。


【Unity】UniTaskのWaitUntilやWaitUntilValueChangedは便利

DLC

エルデンリングDLCの為に一年以上ぶりにエルデの地へ降り立ったものの操作方法を忘れて遺灰すら呼び出せない褪せ人の皆さんこんにちは。なんでも情報によるとDLCで遊ぶ為にはモーグウィン王朝のクリアが必須らしいのですが、二周目を始めて中途半端に放置していたせいで王朝へ辿り着くまでの道のりが遠すぎて今更そこまで到達できるか不安です。なんせ二周目開始早々に白面のヴァレーを倒してしまったので聖別雪原まで行かないといけない。早く操作方法を思い出して6月までにはDLC開始条件を満たしておきたいと思います。

 

ソウルライクである必要がなかったゲーム

PS Plusの2月分のフリープレイ対象になっていたのでダウンロードして遊んでみました。

18世紀のフランス革命を舞台にしたソウルライクゲームで主人公はマリーアントワネットに使える機械人形(オートマタ)という設定。
同じソウルライクゲームのLies of Pと似たような設定ですが、発売はこちらの方が早く、「ぼくのかんがえたさいきょうのダークソウル」的なLies of Pと比べ、「ソウルライク」のゲームルールに乗っ取りながらも手軽にスピーディなアクションが楽しめるゲームとなっています。
剣や斧、槍といったオーソドックスな武器は殆ど使用せず、鉄扇やトンファー、マスケット銃、仕込み爪といった一風変わった仕掛け武器を使用してオートマタという設定を活かした独特なモーションによる戦闘は独自性に富んでいて非常に楽しい要素でした。
各ステージも建物の上や地下を巡り立体的に交差して迷宮的な構造を成しており探索して飽きない作りになっていたと思います。

とは言え、「ソウルライク」と銘打っているものの難易度的には非常に低く、それほどゲームが上手くない私でも殆どのボスを初見で撃破できる程。その反面、道中の敵は複数体を同時に対処しなければならないよう配置されており(特にゲーム後半)、少し鬱陶しく感じる場面も多かった気がします。
自キャラの操作はスムーズで、戦闘の軽快さや爽快感は非常に高いものがあります。普通のアクションRPGとして見れば十分に評価されるべきゲームだと思うのですが、「ソウルライク」という縛りがあるせいで、「ソウルライク」特有の難易度と攻略の達成感を期待するプレイヤーには物足りなく感じるでしょう。
開発側はユーザ層を広げる為に初心者向けの「ソウルライク」を目指したのかもしれませんが、普通に新規のアクションRPGとしてゲームデザインを組み立てた方がもっと評価を得られたのではないでしょうか。

 

UniTask

Unityで非同期処理っぽい事をするにはCoroutineを使うのが一般的でしたが、ここ最近ではUniTaskを利用する方が増えてきているようです。

UniTaskとはC#のTaskと同じような機能を持つAPIですが、Unity用に最適化されておりC#の標準のTaskやUnityのCoroutineよりもパフォーマンス性が高く、既存のCoroutineからの処理の転用も容易、かつ無料なので、まぁ導入にはメリットしかないわけです。

UniTaskの導入はGitHubから取得したunitypackageをインポートするだけです。

github.com

 

UniTaskの基本的な使用法はC#のTaskとほぼ同様で、async/awaitを使って非同期処理を実施します。例えば「3秒待ってstring型の戻り値を返す」という処理なら

private async UniTask<string> UniTaskWait()
{
    // 待機処理はawait
    await UniTask.Delay((int)(3 * 1000));

    return "End";
}

という実装になります。

 

静的メソッド

UniTaskを利用する大きな利点の一つとして静的メソッドが豊富に用意されている事も挙げられます。

上記の指定時間を待つ「Delay」というメソッド以外に1フレーム待機するメソッド(Yield)や、起動したTaskの全ての完了を待つメソッド(WhenAll)、もしくはどれか一つの完了を待つメソッド(WhenAny)と色々ありますが、特に使用頻度が高いのは、指定した条件がtrueになるまで待機するメソッド(WaitUntil)と指定したオブジェクトの特定の値が変化するまで待機するメソッド(WaitUntilValueChanged)ではないでしょうか。

ちなみにWaitUntilの逆で指定した条件がfalseになるまで待機するメソッド(WaitWhile)もちゃんと用意されています。

 

WaitUntilでは条件文を指定できるので例えば

// Y方向の位置が0超過するまで待機
await UniTask.WaitUntil(() => transform.position.y > 0); 

Debug.Log("上昇");

上記のような条件で処理を待つことができます。

 

WaitUntilValueChangedの場合は下記のような指定により

//Y方向への移動を検知する
await UniTask.WaitUntilValueChanged(transform, x => x.position.y); 

オブジェクトの状態(Y方向)が変化するのを待つことが出来ます。

 

使用例

具体的な使用例としてカウントダウンタイマのようなものを作ってみました。

中央の数字がカウントダウンする毎に背景色が変化し、カウントダウンが終了したら「Start」の文字を表示します。

背景色の変更はWaitUntilValueChangedを使用しカウントを表示するテキスト(TextMeshPro)の変更を待って行います。「Start」の文字表示は終了条件に達したフラグを参照するようにWaitUntilを使って待っています。

public TextMeshPro ContText;
bool isStart = false;

private async UniTaskVoid ColorChange()
{
	// ContTextの文字(text)の変更を待つ
	await UniTask.WaitUntilValueChanged(ContText, x=> x.text); 
	
	// 背景色を変更する
} 

private async UniTaskVoid WordDisp()
{
	// フラグ(isStart)がtureになるのを待つ
	await UniTask.WaitUntil(() => isStart); 
	
	// Startの文字を表示
} 

 

宣伝

数学的脱出ゲーム「W.T.」早期アクセス版リリース中です。
歯ごたえのある脱出ゲームとなっているので腕に自信のある方のチャレンジ、お待ちしております。

store.steampowered.com




以上の内容はhttps://www.karvan1230.com/entry/2024/03/05/214159より取得しました。
このページはhttp://font.textar.tv/のウェブフォントを使用してます

不具合報告/要望等はこちらへお願いします。
モバイルやる夫Viewer Ver0.14