【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の移動速度に応じて挙動が変わることです。 マニアックな機能ですが、何か使えそうな表現もあるかもしれません。

【Unity Editor】AssetDatabase.SaveAssetIfDirty()を使って変更点を保存する

UnityのEditor拡張時、ScriptableObjectを保存したい時に調べたメモになります。

SaveAssetIfDirty

SaveAssetIfDirtyUnityはアセットが変更された場合の保存時に利用をします。 指定されたアセットが変更されている場合にのみ、そのアセットを保存するので、パフォーマンスの向上に役立ちます。

public class HogeScript : Editor
{
    private void Save()
    {
        // ScriptableObjectの変更を行う
        

        // アセットが変更されていれば保存を実行
        AssetDatabase.SaveAssetIfDirty(targetScriptableObject);
    }
}

SaveAssets

同じようなメソッドでSaveAssetsがあります。 こちらは、変更があったアセットが何であるかに関係なく、すべての変更が保存されます。

public class CustomEditorScript : Editor
{
    void SomeFunction()
    {
        // 何らかのアセットの変更を行う

        // アセットが変更されていれば保存を実行
        AssetDatabase.SaveAssets();
    }
}

最後に

以前まではSaveAssetIfDirtyを知らなかったのですが、意図的に保存する処理を書く場合は大概SaveAssetIfDirtyを使えば大丈夫でそうです(パフォーマンスも良さそう。

List<T>.AsReadOnly() について

自分用のメモのような記事です。

var list = new List<string> { "tarou", "hanako", "jirou" };

// 読み取り専用に変換
ReadOnlyCollection<string> readOnlyList = myList.AsReadOnly();

readOnlyListは要素へのアクセスできますが、配列要素の追加や削除、変更はできません。 ReadOnlyリストにすること値を保護しながら他のコンポーネントやクラスへ渡すことができます。

2023年目標

仕事

ここ1年のスケジュールがヤバそうなので、スケジュール送れないようするのが目標。 上手く回していくのが大事なのですが、各所相談をしっかりして調整もしていく必要があるので、臨機応変に動けるようにする。

応用上技術者試験 に受かる

4月の 応用上技術者試験 に合格する。 試験を受ける目的は、IT周りに広い知識を得るためなのですが、どうせなら合格したいと思っています。 ただ、去年の10月から週一(1時間)ほどやっているのですが、5割ほどの得点率ぐらいでした。 ここまだ本と過去問をやっているのですが、自分は理系出身でないので、全然知らないことがあり知識は増えている気がします。

合格は6割なのですが、おそらくもっと本腰を入れないと受からない感じがするので、頑張らないと行けない。

ちょびちょび絵の勉強を勉強をしているのです。

C101で描いた表紙が直近時間(3日くらい)をかけて書きました。

上手く行かなかった点

  • 線画 : 単純に上手く引けない、線と線とのつなぎ部分、あとグニャグニャな線になる。
  • 色 : そもそも何も勉強していないのですが、ただ色を塗るしかしていない。
  • 影 : 影が適当に引いているので、納得感のある影を引きたい
  • 全体 : そもそも全体的に最低限のレベルになっていない。

おそらく次のコミケの出来がどうなるかですが、線画と色を頑張りたいと思っています。