ネットで検索すればOpenUPMについていくつか記事が出ているのですが、 最近、自分でもOpenUPMを使って設定する機会があったので、ブログにまとめていきたいと思います。
続きを読む【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は次のようにしています。
Disabled
これがデフォルトの設定です。
動画
Pause Until Replaced
リングバッファモードが有効化されます。パーティクルシステムは最大パーティクル数に達したとき、新しいパーティクルを生成するために最も古いパーティクルを一時停止し、置き換えます。 これにより、パーティクルの総数が一定に保たれ、連続的なパーティクルの生成が可能になります。
動画
MaxParticlesの数までパーティクルが生存しています。
生存中のパーティクルは停止しています。
Loop Until Replaced
パーティクルシステムは最大パーティクル数に達したとき、最も古いパーティクルをリサイクルして新しいパーティクルを生成します。 これにより、パーティクルの総数が一定に保たれ、連続的なパーティクルの生成が可能になります。
- Loop Range MaxParticlesに到達するまでにループするLifetimeの割合を設定できます。 例えば0(Min) 0.5(Max)と設定した場合、待機中パーティクルはlifetimeで設定されている0 ~ 0.5の割合をループして再生されます。
動画
MaxParticlesの数までパーティクルが生存しています。
生存中のパーティクルはLoop Rangeで設定された生存期間をループしています。
【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乗算されます。
オブジェクトが停止している時はパーティクルの寿命はそのままで、スピードが上がるごとに寿命が短くなります
注意点はパーティクルの速度ではなく、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リストにすること値を保護しながら他のコンポーネントやクラスへ渡すことができます。