うにてぃブログ

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

【Unity】Addressable Asset Systemを活用したアセットの動的なカタログ登録方法

UnityのAddressable Asset Systemは、アプリケーションのアセットを効率的に管理し、ダイナミックなロードやアンロードを可能にする強力なツールです。このシステムを使用することで、ゲームやアプリの開発者は、リソースの管理を容易にし、ユーザー体験を向…

Unity のあまり記事を見かけない便利そうな機能 ~PrefabUtility~

UnityのPrefabUtilityは、プレハブに関連するさまざまな操作を行うための強力なツールです。この記事では、PrefabUtilityの主要な機能を紹介し、Unity開発者がプレハブをより効果的に扱えるようにする方法を説明します。 PrefabUtilityの概要 PrefabUtility…

【Unity】TextMeshPro DynamicFontを使用する際のgit管理の課題を解決するスクリプト

TextMeshPro DynamicFontを使用する際のgit管理の課題を解決するスクリプト Unityのテキスト表示において、TextMeshProは広く使用されています。その中でも、DynamicFontを利用する場合、再生中にFontAtlasが変更されると、gitの履歴管理が困難になるという…

【Unity】親 RectTransform 内でドラッグ可能な UI 要素を実装する方法

このスクリプトをUI要素にアタッチすることで、そのUI要素がドラッグ可能になり、親要素の範囲内で自由に移動できるようになります。 using UnityEngine; using UnityEngine.EventSystems; public class UIRectDraggable : UIBehaviour, IBeginDragHandler, …

【Unity】UnityEngine.Object.InstantiateAsync

Unity 2022.3.20f1から、「Object.InstantiateAsync」が新たに導入されました。これにより、プレハブの非同期インスタンス化が可能になりました。 従来のUnityでは、プレハブのインスタンス化は同期的に行われていました。これにより、複数のプレハブを同時…

【Unity】ScrollRect を使用して特定の要素までスクロールさせる方法

このクラスは、指定したインデックスの子オブジェクトを表示エリア内にスクロールする「ScrollTo」メソッドと、指定したRectTransformが表示エリア内に収まるようにスクロールする「ScrollTo」メソッドが実装されています。 これを利用することで、以下のよ…

【Unity】Inspectorで簡単にカスタムメニュー項目を追加する方法

UnityのInspector上で特定のフィールド名を右クリックした際に表示されるメニューに、カスタムな動作や処理を追加したいことはよくあります。 そんなときに便利なのが、ContextMenuItem属性です。この属性を使うと、簡単にカスタムなメニュー項目を追加でき…

【Unity】URPにおける背景画像の取得方法:Shader GraphのSceneColorノードの活用

以前は背景画像を描画する際にGrabtextureを使用していましたが、 URP(Universal Render Pipeline)ではその機能が削除されたため、代替手段が必要です。 今回は、その代替手段の1つであるShader GraphのSceneColorノードを使用した方法を説明します。 Scen…

【Unity】ドラッグ操作によるオブジェクトの回転:Space.Worldを考慮した正確な方法

オブジェクトをドラッグした方向に回転させるには、Transform.Rotateを使用します。 以下の例では、ドラッグの方向にオブジェクトを回転させる方法を示しています。 using UnityEngine; using UnityEngine.EventSystems; public class RotationTest : MonoBe…

【Unity】ScrollRect の子オブジェクトがドラッグ操作時に誤ったイベントが発生する問題

ScrollRectの子供に配置されたオブジェクトが、IPointerDownHandlerを持つとドラッグ操作時に誤って呼び出される問題があります。 例えば、以下のようなコンポーネントがScrollRectの子供オブジェクトに存在する場合、 public class EventHandleTest : MonoB…

【Unity】uGUI での Raycast 時に親子関係と GraphicRaycaster の影響によるイベント挙動の解説

同じ階層にある子供オブジェクトに対して、親にGraphicRaycasterが存在しない場合、Rayが下のオブジェクトではなく上のオブジェクトに当たる問題が発生します。 例えば、以下のヒエラルキーが考えられます。ここで、GraphicRaycasterが「Node Up」と「Node D…

【Unity】アセット管理を効率化するためのガイド: AssetPostprocessorとAssetModificationProcessorの活用方法

Unityの開発過程において、アセットのインポートパイプラインをカスタマイズすることは、効率的なアセット管理に不可欠です。このカスタマイズを行うための主なツールは「AssetPostprocessor」と「AssetModificationProcessor」です。 AssetPostprocessorの…

【Unity】UnityのMathfクラス: Round, Ceil, Floorの理解と実用例

はじめに Unityでのゲーム開発では、数値の丸め処理がしばしば必要となります。MathfクラスのRound, Ceil, Floorメソッドは、これらの処理に不可欠です。この記事では、これらのメソッドの使い方と実例を紹介し、初心者から上級者まで理解しやすく解説します…

【Unity】UnityのUGUIイベントハンドラインターフェースまとめ

はじめに Unityのユーザーインターフェース(UI)構築において、イベントハンドラーは重要な役割を果たします。UGUI(Unity GUI)システムでは、さまざまなユーザー操作に応じてイベントを処理するために、多くのインターフェースが提供されています。この記…

【Unity】UnityPackage で GitHub 上の package.json をルートディレクトリから移動する方法

GitHub上のプロジェクトで、ルートディレクトリにpackage.jsonがなくても、特定のディレクトリからパッケージをインストールする方法を紹介します。 UnityのPackage Managerは、GitHub上のリポジトリからパッケージを直接インストールできる機能を提供してい…

【Unity】EditorCoroutine で WaitForSeconds を使用できない問題の解決方法

UnityのEditorCoroutineでは、通常のWaitForSecondsを利用することができず、代わりにEditorWaitForSecondsを使用する必要があります。これはUnityのEditor内でのコルーチン処理において、時間の経過を待つための仕組みが異なるためです。 EditorCoroutineを…

Builtin Render Pipeline から Universal Render Pipeline (URP) に切り替える方法

URP Assetを作成します Project SettingsのGraphicsにアセットをセットします すると確認ダイアログが表示されるのでアセットをセットします 「アプデするよ」って内容が表示されるのでOKを選択します 更新が終わると、URPでないShaderはエラーとなるため、…

【Unity】float で Color.rgb を近似する

Meshの情報を使ってShaderで色を操作する際、RGB値を渡すとfloat3が必要になりますが、多くの色を扱いたい場合はできるだけ使用する数を減らしたいですね。 そのような場合、RGBをfloatに変換し、Shader側でfloatからRGBに変換することで、完全には復元でき…

【Unity】TextMeshPro でタップした箇所の文字を取得する汎用処理とサンプルコード

TextMeshProを使用して、タップした箇所の文字を取得するための一般的な処理について説明します。 using TMPro; using UnityEngine.EventSystems; /// <summary> /// TextMeshPro のタップ処理 /// </summary> public static class TextMeshProTapUtility { /// <summary> /// タップした</summary>…

【Unity】Unityの組み込みリソースを手軽に確認するツール

UnityEditor上で利用可能なアイコンやGUIStyleを調べるのが手間だと感じていました。そこで、これらのリソースを一覧で確認できる便利なツールを作成しました。 github.com このツールを使用することで、元々組み込まれているアイコンやGUIStyleに簡単にアク…

【Unity】テクスチャやスプライトのサムネイルが表示されない

特定の Unity バージョンで、テクスチャやスプライトを設定する際に表示されるウィンドウで、サムネイルが正しく表示されない現象が発生しています。 初めは Unity のキャッシュの変更が原因かと考えていましたが、実際にはバグで表示されていないようでした…

【Unity】Bloom 効果を RenderTexture で正しく反映させる方法

Scene 上のオブジェクトには Bloom 効果がかかっているのに、RenderTexture を利用した際に Bloom 効果が反映されないことがあるという現象が起きました。 この問題を解決するために、以下のコードを使用しテストを行いました。 using UnityEngine; using Un…

【Unity】TextMeshPro を利用した Prefab の Addressables 対応時の問題

Unity で TextMeshPro を使用する際に、フォントアセットを Addressable に対応させない場合、各 UI のバンドルにフォントデータが含まれ、バンドルのサイズが大きくなってしまいます。 一方で、フォントアセットを Addressable に対応させた場合は、フォン…

【Unity】TextMeshProのフォントを Addressable で利用する

Addressable ロードの問題とその解決方法 TextMeshProのフォントとMaterial PresetをデフォルトおよびカスタマイズしたUIをAddressableを利用してロードする際に、Addressableの設定によって発生する問題についてご紹介します。 まず、以下の画像では、カス…

【Unity】アセットのタイプに応じたアイコンの取得方法

Unityでは、アセットのアイコンを取得するために AssetDatabase.GetCachedIcon を利用できます。ただし、このメソッドを使用するにはアセットのパスが必要です。アセットのタイプだけでアイコンを取得したい場合、以下のような処理を利用することができます…

【エラー】 UnityEngine.AddressableAssets.InvalidKeyException: Exception of type 'UnityEngine.AddressableAssets.InvalidKeyException' was thrown. No Location found for Key=GUID

UnityEngine.AddressableAssets.AssetReference を利用している際に UnityEditor 上では動作したがビルドして確認してみると以下のエラーでロードできなかった UnityEngine.AddressableAssets.InvalidKeyException: Exception of type 'UnityEngine.Addressa…

【Unity】Broken text PPtr in file(***.controller). Local file identifier (-7404026014276284922) doesn't exist!【Error】

アセットバンドルのビルド時に、以下のエラーが発生しビルドすることができなくなりました Broken text PPtr in file(Hoge.controller). Local file identifier (-7404026014276284922) doesn't exist! 実際に内部を見てみると、対象のアセット参照をもった …

【Unity】Asset の Version を強制的に更新する

Unityのバージョンをアップデートすると、アセットの設定が変更されることがあります(serializedVersionが更新されることがあります)。 基本的に、アセットのメタファイルが差分があるときに更新される際に、その設定が変更されている場合は、設定も同時に…

【Unity】Addressables のカタログに対象のアドレスが含まれるかどうかを調べる

public static async UniTask<bool> Contains(string address) { var opHandle = Addressables.LoadResourceLocationsAsync(address); await opHandle; if (opHandle.Status == AsyncOperationStatus.Succeeded && opHandle.Result != null && opHandle.Result.Cou</bool>…

【Unity】Addressable でディレクトリにアドレスを設定する意味

Addressable ではディレクトリにアドレスを設定することができる しかし、実際にそのアドレスをロードしようとすると、次のエラーが出てしまいます UnityEngine.AddressableAssets.InvalidKeyException: Exception of type 'UnityEngine.AddressableAssets.I…