原カバンは鞄のお店ではありません。

Unityを使ったゲーム制作のあれこれを綴っていきます。

【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

◇プライバシーポリシー

●個人情報の利用目的

当ブログでは、メールでのお問い合わせ、メールマガジンへの登録などの際に、名前(ハンドルネーム)、メールアドレス等の個人情報をご登録いただく場合がございます。

これらの個人情報は質問に対する回答や必要な情報を電子メールなどをでご連絡する場合に利用させていただくものであり、個人情報をご提供いただく際の目的以外では利用いたしません。

●個人情報の第三者への開示

当サイトでは、個人情報は適切に管理し、以下に該当する場合を除いて第三者に開示することはありません。

・本人のご了解がある場合
・法令等への協力のため、開示が必要となる場合

個人情報の開示、訂正、追加、削除、利用停止
ご本人からの個人データの開示、訂正、追加、削除、利用停止のご希望の場合には、ご本人であることを確認させていただいた上、速やかに対応させていただきます。

アクセス解析ツールについて

当サイトでは、Googleによるアクセス解析ツール「Googleアナリティクス」を利用しています。

このGoogleアナリティクスはトラフィックデータの収集のためにCookieを使用しています。このトラフィックデータは匿名で収集されており、個人を特定するものではありません。
この機能はCookieを無効にすることで収集を拒否することが出来ますので、お使いのブラウザの設定をご確認ください。

●免責事項

当サイトからリンクやバナーなどによって他のサイトに移動された場合、移動先サイトで提供される情報、サービス等について一切の責任を負いません。

当サイトのコンテンツ・情報につきまして、可能な限り正確な情報を掲載するよう努めておりますが、誤情報が入り込んだり、情報が古くなっていることもございます。

当サイトに掲載された内容によって生じた損害等の一切の責任を負いかねますのでご了承ください。

●プライバシーポリシーの変更について

当サイトは、個人情報に関して適用される日本の法令を遵守するとともに、本ポリシーの内容を適宜見直しその改善に努めます。

修正された最新のプライバシーポリシーは常に本ページにて開示されます。