うにてぃブログ

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

2021-02-01から1ヶ月間の記事一覧

【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 = _…

【Unity】実数 (float) の少数部分を取得する

shader には少数部分を取得するメソッドとして frac があるが Mathf には無かったので作成 処理も単純で 実数から実数の整数 を引くだけ ※ (1.23 - 1 = 0.23) public static class MathUtil { /// <summary> /// 少数部分を返す /// </summary> public static float Frac(float …

【Unity】円や球の内側に指定した点があるかどうか判定する

円の公式を利用して、点が円の内側かどうかを判定する 球の場合は以下の式で判定できる using UnityEngine; public class MathUtil { /// <summary> /// 球の内側か /// (x - a)^2 + (y - b)^2 + (z - c)^2 <= r^2 /// </summary> /// <param name="p">球の中心座標</param> /// <param name="r">半径</param> /// <param name="c">対象となる点</param> /…

【C#】スクリプトを1行ずつロードする

コード using System; using System.IO; public class ScriptUtil { /// <summary> /// スクリプトをロードする /// ※スクリプト以外でもテキストファイルであればロードできる /// </summary> /// <param name="path">パス (Assets/からでよい)</param> /// <param name="lineAction">1行見込み毎に呼び出される</param> /// <param name="encode">エンコード指定 </param>…

【Unity】Future パターンを実装してみる

Future パターンとは wikipedia によると 何らかの処理を別のスレッドで処理させる際、その処理結果の取得を必要になるところまで後回しにする手法。 とある 例えばあるオブジェクトをロードする際にロード処理を丸投げしてしまい 使うときに問題なければ使…