うにてぃブログ

主にUnityとC#に関する記事を書いていきます

2021-01-01から1年間の記事一覧

【Unity】シリアライズされていないオブジェクトを Inspector や EditorWindow で表示する

シリアライズされていないオブジェクトの中身は Debug モードの Inspector でも表示できないため 表示させるためにはそれ専用のなにかが必要になる しかしながら、必要なオブジェクトごとにそれを作るのが面倒になるので、リフレクションを用いて オブジェク…

【Unity】Image を曲げる

Image を BaseMeshEffect を利用して曲げてみたかったので作成してみました ※Sliced や Filled には未対応、水平のみ メッシュの分割数や、外周の長さなどパラメータの調整をすることで 曲げ具合を変更することができます Shader を使えば Sliced などのとき…

【C#】バージョンを比較する

バージョンの比較には System.Version.CompareTo を利用する このメソッドの戻り値は以下のようになっている 戻り値 説明 -1 前のバージョン 0 同じバージョン 1 後のバージョン ラップクラス 上記戻り値の判定を利用した、便利クラス public static class V…

【C#】継承した Generic クラスを確認する

GenericInt が Generic<T> を継承しているか確認するために、BaseType を見てみたところ Generic1[System.Int32]` と表示され意図したクラスが取得できなかった public abstract class Generic<T>{} public class GenericInt : Generic<int>{} private void Main() { va</int></t></t>…

【Unity】Animation の再生時間を取得する

Animation の再生時間を知るためには GetCurrentAnimatorStateInfo で AnimatorStateInfo を取得し、length の値を見ることで確認できる しかし、 animator.Play のあと直ぐに GetCurrentAnimatorStateInfo を呼び出しても 正しい値を取得できない var anima…

【C#】負の値にも対応したIndexの計算式

C#

public static class Utility { /// <summary> /// 0~maxの範囲のIndex を返す /// 負の値にも対応 /// </summary> public static int LoopIndex(int index, int max) { var ret = index % max; if (index < 0) ret += max; return ret; } } 実行例 Utility.LoopIndex(10, 20); …

【Unity】uGUI インスタンス生成時のサイズ反映を即座に行う

Unity では ContentSizeFitter や HorizontalLayout などを利用した 自動レイアウトのインスタンス生成時にサイズを取得しても正しいサイズが取得できない 下記のコードの場合 sizeDelta は (0, 0) になる using UnityEditor; using UnityEngine; public cla…

【Unity】uGUI Image でシェーダーを使わずに色の加算を行う

Image はデフォルトで色の乗算はできるが、色の加算つまり白っぽくする場合は 独自に Shader を作成する必要がある が、一応Shader を使わずに色の加算っぽい見た目にすることができる 色の加算方法 Image に Mask を追加して、その子供に Image をつけるだ…

【Shader】オブジェクトを重ねた数によって色を変える〜アルファちょっと対応〜

https://hacchi-man.hatenablog.com/entry/2021/02/23/220000hacchi-man.hatenablog.com 以前の記事でアルファ画像が対応できなかったのですが、少し調査したらまだ問題ありますが アルファを適当できたので、メモがてら追加しておきます オブジェクトのシェ…

【C#】グローバルに数値を管理する

C#

モックを作ってる際にわざわざ値を管理するクラスを複数作るのが面倒だったので、 enum を指定 して手軽に利用できるクラスを作成しました 使い方 enum を定義してこれを Key に利用する public enum ValueType { Score, Life, } 値の初期化 Value<ValueType>.Set(Value</valuetype>…

【C#】Dictionary の初期値

コレクション初期化子を使用してディクショナリを初期化する方法は以下に挙げられる2つがあります // Addメソッドを用いての初期化 var students = new Dictionary<int, Test>() { { 1, new Test(10) }, { 2, new Test(20) }, { 3, new Test(30) }, }; // インデクサを</int,>…

【Shader】オブジェクトを重ねた数によって色を変える

Stencil Shader を利用して、オブジェクトの重なり具合に応じて色を変える実装をしてみます オブジェクトのShader Stencil Pass を利用して オブジェクトがある箇所のステンシルバッファの値を加算していきます こうすることでオブジェクトが重なっている箇…

【C#】ビットマスクを利用して偶数奇数を判定する

public static class IntExtension { private static int _Mask = 0x1; /// <summary> /// 奇数かどうか /// </summary> /// <returns></returns> public static bool IsOdd(this int self) { return (self & _Mask) == _Mask; } /// <summary> /// 偶数かどうか /// </summary> /// <returns></returns> public static bool IsEven(thi…

【C#】クラスを DeepCopy する

クラスをコピーする場合、自前でコピーするメソッドを作成する必要があります フィールドの追加などがあるとそのたびにコピー処理を直すのも面倒なので Reflection を利用して DeepCopy する拡張メソッドを作成しました サンプル 使い方は簡単でクラスのイン…

【C#】enum を key にした Dictionary

enum を key にした Dictionary は便利ですが、enum が内部的にはクラスな都合上不都合が生じます そのため dictionary[(int)Hoge.A] のようにわざわざ key を int にして、enum から int にキャストしてアクセスして利用しなければいけません そのため、Dic…

【C#】enum に名前をつける

enum を利用している際に、日本語名を表示したいことがある 普通に処理を記述すると、swtich を使って処理を書くが Attribute を利用して日本語名を追加することもできる コード まずは、enum のフィールドに使う Attribute を定義、必要なのは別名なので st…

【C#】GetHashCode をすべて同一にした際に HashSet の Contains は遅くなるのか

C#

GetHashCode の値は HashSet で利用しており検索の高速化に使っていると記述してあったので GetHashCode の値をすべて同一にした場合と異なるようにした場合で、速度を見てみる コードは 自作クラスを HashSet に突っ込んでランダムで検索してみる var loop …

【C#】GetHashCode ってなんぞや

C#

Microsoftの公式サイトを見てみると、 既定のハッシュ関数として機能します。 との記述があります。これだけでは、GetHashCodeメソッドの利用用途がよく分からないかもしれませんが、具体的にはインスタンスの比較に利用されるのではないかと推測されます。…

【Unity】Enum の int キャストについて調べてみた

enum を int にキャストするときには (int)enum と enum.GetHashCode() の2つがある(はず) しかしながらどちらが早いのか、int をそのまま扱うのと比べてどれくらい遅いのかを調べたことがなかったので調べてみる Unity Editor 上 で .NET 4.x にして Prof…

【C#】コンストラクタからコンストラクタを呼び出す

C#

コンストラクタ内から他のコンストラクタを呼び出すには this を使えば呼び出せます public class Sample { public int Value; // int を引数とするコンストラクタを呼び出す public Sample() : this(10) { } public Sample(int value) { Value = value; // …

【Unity】インスタンスID から Object を探す

Editor 上でなら EditorUtility.InstanceIDToObject を利用すれば インスタンスID から Object を取得することができる が Editor 上じゃない場合は上記メソッドは利用できないので 全 Object を見てインスタンスIDを探すような処理を記述する必要がある な…

【Unity】Component のアクティブを切り替える Scope

Hierarchy に存在するオブジェクトの参照を持っていて、それからインスタンスを作成する場合 生成時には active で終わったあとには disactive にすることがある [SerializeField] private GameObject _resource; private void Create() { _resource.gameObj…

【Unity】ボタンのクリックイベントを監視する

ボタンのクリックイベントを意識せず監視できないかと思って static なクラスを使って監視する処理を書いてみました サンプル Button.SetEvent で指定した Key を ButtonEvent.Listen で登録しているメソッドに対して実行します ButtonEvent.Remove を呼び出…

【C#】多次元配列をコピーする拡張メソッド

public static T[,] Copy<T>(this T[,] self) { var dst = new T[self.GetLength(0), self.GetLength(1)]; for (var a = 0; a < self.GetLength(0); a++) for (var b = 0; b < self.GetLength(1); b++) dst[a, b] = self[a, b]; return dst; } public static T[</t>…

【C#】グローバルにイベントを管理する

使い方 EventMonitor がジェネリッククラスになっているので Event を継承したクラスを利用する object でもいいが、使う場所によってわざわざキャストするのが面倒だったのでこのような形になった private void Main() { // イベント追加 EventMonitor<TestEvent>.Add(</testevent>…

【Unity】CustomInspector の テンプレートコードを出力するツール

毎度同じような CustomInspector のコードを書くのが面倒になったので作成ツールを作りました github.com 使い方 対象のスクリプトを選択するとシリアライズされているフィールド一覧が表示されるので、必要なフィールド一覧を選択します Set Script Object …

【Unity】FieldInfo もしくは Type が Unity でシリアライズできるかを調べる拡張メソッド

using System; using System.Collections.Generic; using System.Linq; using System.Reflection; using UnityEngine; public static class FieldInfoExtension { public static bool IsSerializable(this FieldInfo fieldInfo) { var attributes = fieldInf…

【Unity】2次元タイルマップ空間で中心から特定の距離の座標一覧を取得する

以下の図のように中心から指定した距離のマス座標一覧を取得するスクリプト 例えば、2の場合は (0, 2), (0, -2), (1, 1), (-1, 1), (1, -1), (-1, -1), (2, 0), (-2, 0)になる public static class TileMapUtil { public static List<Vector2Int> GetPositions(int dista</vector2int>…

【Unity】シリアライズされたフィールド名を変更する

例えば以下のようにシリアライズしたフィールド名を変えると参照が外れてしまう [SerializeField] private GameObject _target; ↓ [SerializeField] private GameObject _targetObject; これは prefab の yaml 内にフィールド名が記述されていて、それを参照…

【Unity】LineRenderer を使って 波を作る

波を実装したいことがあったので、LineRenderer と Mathf.Sin を利用して波の動きを作ってみる 波をずらすために、現在の座標に応じた値を加算している private void Update() { _offset += Time.deltaTime; for (var i = 0; i < Divide; i++) { var pos = _…