Unity

【C#】TypeCodeを使った高速な型判定を行う?

ライブラリなどの比較的低レイヤー寄りの実装をしていると受け取った、ジェネリックな型や、object 型で受け取った変数がどの型なのかを判定するケースがありますが、タイトルの通り TypeCode を使うと Type を使った判定より、効率的かつ高速な処理にできる…

【Unity】2D用のNavMeshでTimeMap以外の領域や障害物をベイクする

2D 用の NavMesh の導入方法とタイルマップへの適用方法は記事がいくつかあるので、導入~タイルマップに適用するまでは比較的簡単にできると思います。ただ、実際にトップダウン系のゲームなどで使用する場合、障害物を設置したり経路を動的に足したりでき…

【Unity】2Dゲームでプレイヤーがオブジェクトに回り込んだ時にシルエットを表示する

トップダウンやクォータービューなどの見下ろし型の2Dゲームで、プレイヤーの操作キャラクター(もしくは敵キャラなど)が、高さのあるオブジェクトの後ろに回り込んだ時にオブジェクトに隠れて見えなくなった時、どこに居るのかが分からなくなってしまう事…

【C#】2つのキーを管理するDictionary

よく2つのキーを持つ Dictionary が必要になるときがありますが以下のように Dictionary を2重にすると「管理が面倒」「後から見たときに意味が分からない」など技術的負債になりがちです。 // 2つのキーで管理したいのでDictionaryを2重に宣言する pribate …

Dispose呼び出しを簡潔に書く

IDisposable を継承しているクラスは使い終わったら Dispose メソッドを呼び出して破棄を明示しますが using 構文の外で開放したい場合も using 構文を使って簡単に開放できます。 // こんなクラスがあったときに public class Sample : IDisposable { //...…

スクリプトの実行順序をスクリプトから指定する

Unity で Awake や Update の実行順序をプログラム(スクリプト)から指定する方法の紹介です。 確認環境 この記事は以下環境で確認しています。 Unity 2021.2.5f1 Editor 上で確認 実行順序の設定 通常 Unity の コンポーネントのメソッドの実行順は不定で…

【C#】デリゲートの引数は呼び方でパフォーマンスが違う

引数がデリゲートのメソッドは呼び出し方がいくつかあります。書き方でコンパイラが展開する方法が異なるります。このため一部実行コストやパフォーマンスにも差が出るようなのでまとめてみました。 確認環境 この記事は以下環境で確認しています。 VisualSt…

UnityHub3.0.0のプロキシ関係の不具合

2022-01-25 2022年1月24日に修正版がリリースされ問題は解消されましたました。 以下古い情報です。 2022年1月22日現在、UnityHub 3.0.0 は環境変数に「HTTP_PROXY」が設定されていると一部の環境で真っ黒な画面が表示されて何も反応しません。 こんな感じで…

URP+2DRendererで画面の一部に綺麗なブラーをかける

いわゆるすりガラス効果みたいな感じで URP + 2D Renderer で画面の一部にきれいなブラーをかける方法です。 前回以下の記事で URP の 2D Renderer でも画面の一部にモザイクやブラーをかける紹介をしましたがブラーの見栄えが良くなかったので今回はガウシ…

UIのImage(Graphic)のスクリーン座標を取得する

タイトルの通りですが、以下の記事で紹介されいたコードを元に作成しています。 hacchi-man.hatenablog.com 確認環 Unity 2021.2.5f1 VisualStudoo 2019 Windows 10 実装コード UI 要素の四隅を GetWorldCorners で取得するのは同じですが、基本的に RectTra…

URP+2DRendererで画面の一部にモザイクやブラーをかける

URP + 2DRenderer にすると _OpaqueueTexutre が利用できない(設定しても画像が設定されない)ため旧来の GrabPass を使用したレンダリング結果に対して効果をつけることが直接はできませんでした。旧来、対処法として RenderTexture を使用した実装などで…

【Unity】実行中だけCanvasをOverlayにする

はじめに Unity の Canvas は特に画面に追従する必要がない場合 Screen Space Overlay にすることが多いと思いますが、Overlay って実際のゲーム画面と比べてサイズが大きすぎて「ゲーム画面を見ながら UI の調整をしたい」みたいなときに少し扱いづらいので…

背景を除外してRectTransformの範囲をファイルに保存する

Canvas 内の RectTransform の範囲を背景を無視して切り取って画像に保存する手順です。かなり限定的な状況となりますが uGUI の Image などを子要素に持つ RectTransform を表示されている内容で保存することができます。 まずサブカメラを作成 → RenderTex…

【Unity】UniRxを利用したMVPパターン(MVRP)の実装例の紹介

UniRx 利用した MVP パターン、いわゆる MV(R)P パターンで(Model-View-(Reactive)Presenterパターン)UI の実装例を紹介したいと思います。 今回の記事で実装した UI は以下の通りです。 初めに MV(R)Pパターンは、表示を View, ロジックを Model, 双方の…

Unity 2021.2.3f1でURPがでCS1525エラーが発生する

既存プロジェクトを Unity 2021.2.3f1 にアップグレードしたら URP のパッケージでエラーが発生する場合の対処法です。 発生するメッセージ 発生するメッセージは以下の通りです。 なぜか構文的に間違ってなさそうなURPパッケージ内でエラーが発生します。 L…

【C#】リストや配列をクラス外に安全に公開する方法

この記事は、あるクラスの中で管理しているリストや配列をクラス外に公開して参照してもらう時に安全に公開する方法や考え方や実装の紹介です。 あるクラス内で管理しているリストをクラス外に公開する場合に具体的にどういった危険性があるのか、どうすれば…

All In 1 Sprite ShaderのURPがUnity2021.2.0以降でエラーになる場合

本当は本家に直してもらうのが一番いいけど修正されるまでは自力で直さないと正常に動作しないので修正方法の紹介です。 発生するエラーは以下の通りです。 'CombinedShapeLightShared': cannot implicitly convert from 'half4' to 'struct SurfaceData2D' …

The referenced script (Unknown) on this Behaviour is missing!

普通は Console から該当の警告メッセージを選択知ればヒエラルキーで missing の場所にジャンプできますが以下のようスタックトレースがネイティブな出力で対象のオブジェクトにジャンプできない & ヒエラルキー上をいくら探しても警告が出ていない場合、プ…

Universal RP(URP)を2Dプロジェクトに設定する(2021.2版)

なんとUnity Hub の新規作成に「2D URP」がテンプレートに追加されているので2Dでライトを積極的に使っていきたい、みたいな人はこれを選べばそのまま URP の 2DRenderer が設定済みのプロジェクトが選べるようになっています。 この場合説明不要ですが、後…

URPでPostProcessingの効果をゲーム画面だけに適用する

Unity の URP 環境で Post Processing の効果をゲーム画面だけに適用して UI には効果を適用しない設定の紹介です。 通常、Main Camera に ゲーム画面と UI を映した状態で Vignette(画面の端が暗くなる効果)を適用すると UI の端が暗くなって見づらくなっ…

Unity向けタイマーライブラリ「UniTimer」をリリースしました

Unity向けのタイマーライブラリ「UniTimer」をリリースしました。 Git のリポジトリは以下の通りです。 github.com Github の README と内容は同じですが、このライブラリの説明などは以下となります。 動作環境 Unity 2020.3 以降 このライブラリを使用する…

All In 1 Sprite ShaderのURPセットアップ手順

Unity のアセットストアにある「All In 1 Sprite Shader」の URP 用の設定方法です。 忘れるたびにマニュアルのリンクから解説動画見てねが割とツラいのでまとめました。 確認環境 この記事は以下の環境で作成及び動作確認を行っています。 ViauslStudio 201…

【Unity】画像をスクリプトから動的にスライスする

2022-01-28 画像を縦横に等間隔でN個に分割(スライス)した場合、左上から右下になるように番号を振って、X=3,Y=6のような位置を指定するのが分かりやすいかと思います。 するとテクスチャーは、原点が左下なので位置計算が必要になります。毎回そのような操…

【Unity】Sprite.Createが遅い・重い場合の対処法

2022-01-28 3500x3500 のテクスチャーを 100x100 に切り出して1125個の Sprite を作成したら Ryzen 5900 なのに 30秒程度かかったため Sprite.Create の生成速度がヤバいなと思ったので調べました。 プロファイラーで見たところ1枚生成するのに 19ms もかか…

【Unity】吸い付くスクロールを実装してみた

メニューをスクロールしたとき中途半端な位置てスクロールを停止すると、近くの要素に位置が吸い付くように移動する動作をマグネットメニューとかマグネットスクロールと呼んだりするらしい?のですが、今回はその実装方法を紹介です。 サンプル動作 実際に…

【Unity】上下左右を表すThickness型を作成する

C#のGUI表現技術ののXAMLには上下左右を表す Thickness 型というものがありますが Unity にはありません(ないですよね? なので今回はこの Thickness 型を作成して特定の操作を簡単にしたいと思います。GUIの上下端を表したり 確認環境 今回実装・確認を行…

【Unity】HSV用のColor型を作成する

Unity の色指定ができる Color はインスペクター上からだと RBG(byteで0-255, float0~1.0fの2種類)、HSVの値の指定ができますがスクリプト上で color プロパティから Color オブジェクトを取得した場合中に入っている値は RBG となっています。 この Color …

【Unity】Mathf.LerpとInverseLerpの覚書

使うときは頻繁に使うし使わないと全然使わないのでなかなか覚えられない Mathf.Leap と InverseLLeap の挙動のメモです。 Mathf.Lerp リファレンスの説明は以下の通り。 // [a, b] の範囲内で補間する値 value を生成する線形パラメーター t を計算します f…

【Unity】リングコマンドを実装してみた

タイトルの通り Unity で リングコマンドを実装する実装例の紹介です。UI要素をリング状に配置したように見せて左右で最前面の要素を変更できます。 リングコマンドですが実際の動作は以下のような動きになります。 youtu.be 確認環境 Unity 2020.3.12f1 Win…

【Unity】OdinのHorizontalGroupの使い方

UnityでEditorを拡張するためのアセット「Odin」の機能でインスペクター上に変数を水平に表示できる HorizontalGroup の使い方です。 基本的に公式のマニュアルを見ればOKですが日本語のこのサイトは2017年のものでこれを参考にするとうまく動かなかったので…