【Unity】UniTaskで直列処理をする場合

複雑な非同期処理を行うときに色々考えたことをメモ代わりに書いていきたいと思います。

直接処理

単純にawaitを処理順に並べると、順番に対象の処理を行います。

private async UniTaskVoid Start()
{
     await Method1Async();
     await Method2Async();
}

private async UniTask Method1Async()
{
    // ここにtask1の処理を書く
    await UniTask.Delay(1000); // 例として1秒待つ処理を書く
}
private async UniTask Method2Async()
{
    // ここにtask2の処理を書く
    await UniTask.Delay(2000); // 例として2秒待つ処理を書く
}

Concatwithを使う

await Method1Async().ContinueWith(async _ => await Method2Async());

UniTask

github.com

【C102】サークル「albatrus」にお越しいただきありがとうございました!

本日、東京ビッグサイトで開催されたコミックマーケット102・西-あ05b「albatrus」にお越しいただき、ありがとうございました。 今日は曇りや雨で天候が不安定でしたが、無事にサークル参加ができました。 albatrus.com

壁サークル

人生で2回目の壁サークルでした。 壁サークルの利点は、後ろに物をたくさん置けることと、壁にポスターを貼ることができることです。 今回はB1サイズのポスターを作成しましたが、壁に貼ると少し遠く感じる微妙な大きさでしたので、専用のポスター立てを使用しました。 壁サークルの場合、A1サイズ以上の方が良さそうです。

サークルスペース

「Unityエフェクト本」を書きました。

新刊!

配布結果

今回は20部を印刷しました。 開場が10:30分でしたが、最初の45分間はサークルエリア付近にほとんど人が来ず、不安でしたが、 その後たくさんの方に手に取っていただき、おおよそ12:30頃に全て配布することができました。 お手に取っていただいた皆様、ありがとうございました。

感想

いつも私のサークルは技術書関連で配置されているのですが、サークル参加を始めてから、明らかにソフトウェア系(Unityを含む)のサークルが減ったように感じました。むしろハードウェア系のサークルが多く、ソフトウェア系のサークルは技術書典など別のイベントに参加しているのではないかと話していました。 私はコミケに参加したいという思いで出ていますが、おそらく他のイベントだとわざわざ高い費用を払って同人誌を作らないだろうと思っています。

次回は年末に参加(申し込み)予定です。 ネタはあるのですが、モチベーションが続くかどうか、また大晦日なので、どうしようか。

【Unity】ParticleSystemのRingBufferModeについて

ParticleSystemのMainモジュールにあるRingBufferModeについての記事になります。

RingBufferModeとは

RingBufferModeでは、パーティクルシステムが新しいパーティクルを生成する際に、古いパーティクルをどのように扱うかを決定します。 次の3つのモード設定ができます。

  • Disabled
  • Pause Until Replaced
  • Loop Until Replaced

次に掲載する動画の環境です。

  • Duration : 10
  • StartLifetime : 1
  • MaxParticles : 10

Color over Lifetimeは次のようにしています。

Color over Lifetimeの設定

Disabled

これがデフォルトの設定です。

動画

Disabled

Pause Until Replaced

リングバッファモードが有効化されます。パーティクルシステムは最大パーティクル数に達したとき、新しいパーティクルを生成するために最も古いパーティクルを一時停止し、置き換えます。 これにより、パーティクルの総数が一定に保たれ、連続的なパーティクルの生成が可能になります。

動画

MaxParticlesの数までパーティクルが生存しています。 生存中のパーティクルは停止しています。

Pause Until Replacedの例

Loop Until Replaced

パーティクルシステムは最大パーティクル数に達したとき、最も古いパーティクルをリサイクルして新しいパーティクルを生成します。 これにより、パーティクルの総数が一定に保たれ、連続的なパーティクルの生成が可能になります。

  • Loop Range MaxParticlesに到達するまでにループするLifetimeの割合を設定できます。 例えば0(Min) 0.5(Max)と設定した場合、待機中パーティクルはlifetimeで設定されている0 ~ 0.5の割合をループして再生されます。

動画

MaxParticlesの数までパーティクルが生存しています。 生存中のパーティクルはLoop Rangeで設定された生存期間をループしています。

Loop Until Replacedの例

【Unity】UniTaskのキャンセル時の実装を調べてみた

UniTask.WaitWhileのキャンセル処理時の実装をしなくてはいけなくて調べてみました。

キャンセル処理

タイムアウトやキャンセルされる場合、OperationCanceledExceptionが発生する可能性があります。この例外を適切に処理するには、try-catch構文を使用する必要があります。 今回は、ボタンが押されるまで待機をしたい処理でしたので、次のような感じの実装ができそうです。

try
{
    await UniTask.WaitWhile(() => true, cancellationToken: cancellationToken);
}
catch (OperationCanceledException)
{
    // キャンセル処理
}

【Unity】ParticleSystemのLifetime by Emitter Speedモジュールについて

Lifetime by Emitter Speed

UnityのParticleSystemもモジュールの一つで、移動するオブジェクトの速度から発生するパーティクルの寿命を調整することができます。

設定項目

Lifetime by Emitter Speedの設定項目は次の2つです。

Multiplier(マルチプライアー)

パーティクルの初期寿命に適用する乗数です。

Speed Range

寿命のスケーリングが適用される速度の範囲を定義します。最小値と最大値で指定します

挙動

挙動

今回の例では、Speedの最小値では1.0が乗算され、最大値では0.0乗算されます。 オブジェクトが停止している時はパーティクルの寿命はそのままで、スピードが上がるごとに寿命が短くなります

Multiplierの設定

注意点はパーティクルの速度ではなく、ParticleSystemのGameObjectの移動速度に応じて挙動が変わることです。 マニアックな機能ですが、何か使えそうな表現もあるかもしれません。