Unity

LinqのTakeとSkipについて

Linqで出会った、初見では理解が難しかった関数について、メモ代わりにブログに記載します。 Take Takeはシーケンスの先頭から指定した数の要素を返します。 int[] numbers = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }; // Takeメソッドを使用して、最初の3つの要素…

【Unity】Settingに項目を追加する

独自のSettingを追加したい場合のやり方を調べてみました。 サンプルコード 次のコードはProjectSettingに項目を追加する最小限のコードになります。 SettingProviderを継承したクラスを作成し、コンストラクタなどを追加します。 public class AnotherSetti…

Unity2023のAwaitableについて調べてみた

Awaitable型は非同期コードを公開するために使用され、Unityに特化した非同期の戻り値型も提供します。 docs.unity3d.com Awaitableについて UnityのAwaitableは、非同期コードの戻り値として特にUnity環境に適した型を提供します。これにより、非同期操作の…

C#のLazy<T>について調べてみたメモ

Lazyクラスは、NET Frameworkで提供されているクラスで、そのインスタンスが最初にアクセスされるまで値の生成を遅延させることができます。 これは、値の生成に時間がかかる場合や、必ずしもすぐに値が必要とされない場合に有用です。 learn.microsoft.com …

【Unity】Hierarchy Windowで表示される特定のGameObjectの見た目を変更する

特定のComponentを持つGameObjectを視覚的にわかりやすくしたいという要望があり、少しやり方を調べてみました。 例コード UnityエディタのHierarchyウィンドウで表示されるゲームオブジェクトの色を変更するクラスです。 特定のコンポーネントが存在する場…

【DOTween】DOPath系の初期値と目的地が同じだとエラーが出る

DOTweenのPath系の関数を使うときに次のようなエラーが出ました。 IndexOutOfRangeException: Index was outside the bounds of the array. DG.Tweening.Plugins.Core.PathCore.CubicBezierDecoder.GetPoint (System.Single perc, UnityEngine.Vector3[] wps…

OpenUPMを使ってみる

ネットで検索すればOpenUPMについていくつか記事が出ているのですが、 最近、自分でもOpenUPMを使って設定する機会があったので、ブログにまとめていきたいと思います。

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

UnityのEditor拡張時、ScriptableObjectを保存したい時に調べたメモになります。 SaveAssetIfDirty SaveAssetIfDirtyUnityはアセットが変更された場合の保存時に利用をします。 指定されたアセットが変更されている場合にのみ、そのアセットを保存するので、…

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

自分用のメモのような記事です。 var list = new List<string> { "tarou", "hanako", "jirou" }; // 読み取り専用に変換 ReadOnlyCollection<string> readOnlyList = myList.AsReadOnly(); readOnlyListは要素へのアクセスできますが、配列要素の追加や削除、変更はできませ</string></string>…

【Unity】コンポーネントのプロパティ名を取得する

UnityのEditor拡張時に、プロパティ名が知りたいときがあります。 プロパティ名を知る方法はいくつかあります。 差分を見る Gitの差分を見れば、プロパティ名がわかります。 SourceTreeの例ですが、画面上に次の画像のように表示されます。 SourceTreeの差分…

C#のオーバーロード

c#では、同じメソッド名で、違う引数を定義できます。これをオーバーロードと呼びます。 public void SetValue() { } public void SetValue(int value) { } メソッド名を変えても良いのですが同じような用途で利用する場合などで使うと便利です。 独習C# 第5…

【Unity】配列の引数でparamsパラメーターを使う

引数に配列を指定する場合、何も考えずに実装をすると次のようになると思います。 private void Hoge(string[] texts) { } この関数を使う場合、一旦配列を作って引数に渡して上げる必要があります。 var texts = new[] { "hoge", "hoge2","hoge3" }; Hoge(t…

【Unity】Timeline用のショートカットを実装する

Timelineで何かしらショートカットを登録したい場合、専用の属性(TimelineShortcutAttribute) がありますのでこれを利用すると簡単に実装できます。 docs.unity3d.com [TimelineShortcut("Custom Shortcut", KeyCode.RightArrow, ShortcutModifiers.Shift)] …

【Unity】TimelineのUndo処理

何かしらClipを操作するEditor拡張を作る場合に変更を取り消したい場合があるかと思います。 その場合、Undo処理を実装すれば Command + Z で簡単に戻すことができます。 UndoExtensions 通常のEditor拡張ですがUndoクラスを使うのですが、Timeline周りではU…

【Unity】SessionStateで値を保存する

SessionStateはエディタ起動時のみ値を保持する仕組みです。 エディタ拡張時、SerializeFieldなどで保持しなくても良い重要度の低い値を保存するときに便利に使えます。 保存 保存するKeyを定義します。 これは取得する際に必要になります。 string key = "S…

【Unity】Presetを使ってコンポーネントの設定の自動化を行う

Unityの機能にPresetと呼ばれる機能があります。 docs.unity3d.com プリセットは特定のコンポーネントの設定を保存して、それを同じコンポーネントで使うことができます。 プリセットの保存 例としてImageコンポーネントの「Raycast Target」を外したプリセ…

【Unity】TextMeshProに数字を設定する

メモ書きになります 数字を文字列変換 TextMeshProに表示するテキストは文字列でなければならないので、次のような記述をしていました。 text = x.ToString(); こちらの方法で変換はできるのですが、文字列に変換する家庭でメモリのアロケーションが起きるよ…

【Unity】ジェネリック型のCustomEditor

エディタ拡張を行っている時にあるジェネリクス型のクラスのInspectorを変更したい時がありその時の知見です。 対象のクラス 例えばベースクラスとして次のようなクラスを定義しました。 public class HogeBase<T> : MonoBehaviour { [SerializeField] private </t>…

【Unity】TimelineのTrackの見た目を変える

TimelineのTrackの見た目を変える場合にはTrackEditorクラスを使います。 [CustomTimelineEditor(typeof(HogeTrack))] public class HogeTrackEditor : TrackEditor { } CustomTimelineEditor Attributeに指定したTrackが拡張されます。 TrackDrawOptions Tr…

【Unity】TimelineのClipの見た目拡張

Timelineで利用するClipの拡張をする場合、ClipEditorクラスを継承をして実装を行います。 [CustomTimelineEditor(typeof(HogeClip))] public class HogeClipEditor : ClipEditor { } CustomTimelineEditor Attributeは拡張対象になるClipのクラスをしていし…

【Unity】TimelineのTrackAsset周りを調べてみる

TimelineのTrackを自作するときにTrackAssetクラスを使います。 このクラスでは何ができるのかを調べてみました。 TimelineのTrack TrackAsset 自作のTrackを作る場合にはTrackAssetクラスを継承します。 public class TestTrack : TrackAsset { } Clip指定…

【Unity】ExecuteAlwaysについて

Unityで使うc#のクラスでは色々なAttributeを定義することができます。 その中で「ExecuteAlways」というAttributeがあります。 docs.unity3d.com ExecuteAlways 簡単な例は次のようになります。 [ExecuteAlways] public class ExecuteAlwaysTest : MonoBeha…

【Unity】自作のPlayableを作成しTimelineで再生できるようにする

Playable API周りについての概要がなんとなくわかってきたので、次にScriptablePlayableを自作してみたいと思い調査をしてみました。 最終目標は独自のTrackをTimelineで再生をすることです。 ScriptPlayable を自作する ScriptPlayableを作るにはPlayableBe…

【Unity】Playable と Timelineについて

これまで触ってなかったUnityの「TimeLine」について調べる機会がありました。 その中で「Playable」についてブログに書いていきたいと思います。 Playable API 調べるとUnityには「Playable API」と呼ばれるものがあるのがわかりました。 これは、アニメー…

【C#】クラスをDeep Copyする

ローカルに保存したデータクラスを変更した場合、その参照先のデータも変更されます。 例えば、Saveボタンがあり、ボタンを押したときだけデータクラスを変更したい場合には、変更前の値をどこかに保持しなくてはいけません。 単純に次のように別の変数を用…

【Unity】クラス同士の比較を行いたいときに IEquatableを使う

とあるデータクラスを作ったときに、その中身が同じかどうかを比較をしたい場合にIEquatableを使って比較するのが良いと教わったので、実装をしてみました。 IEquatable このインターフェイスは等価かどうかを判断するEqualsが定義されています。 継承したク…

【Unity】 mod2演算とは

ある数字を+1ずつ足していき、〇〇以上になった場合に0に戻す。 こういったロジックを実装するときにmod2を使うと簡単に書くことができます。 普通に計算する 「ある数字を+1ずつ足していき、〇〇以上になった場合に0に戻す。」をwhile文を使って実装した…

【C#】LinqのToArrayとToListについて

LinqでToArrayやToListを使うときの注意点なのです。 使い方によっては負荷が上がってしまうので用途により使い分けたほうがよいです。 パフォーマンス比較 次のコードを書いてUnityのProfilerで調べてみます。 Profiler.BeginSample("None"); var sample1 =…

【Unity】switch式について

とあるプルリクエストを見ていたときに、今までみたことのない書き方があり調べてみるとことにしました。 switch式 調べたとこと「switch式」という演算子でした。 docs.microsoft.com 具体例 まず、2つのタイプを用意します。 public enum TestType { None,…

【Unity】ZStringを使って文字を操作する

ある文字とある文字を組み合わせて文字列を作る際に今までは次のようなコードを書いていました。 var value = 10; var maxValue = 100; var text = string.Format("{0}/{1}", value, maxValue); Debug.Log(text); // 10/100 上記コードは、Riderを使っている…