コガネブログ

平日更新を目標に Unity や C#、Visual Studio、ReSharper などのゲーム開発アレコレを書いていきます

【Unity】error: Build input file cannot be found: 'XXXX/YYYY.mm' (in target 'UnityFramework' from project 'Unity-iPhone')

概要 error: Build input file cannot be found: 'XXXX/YYYY.mm' (in target 'UnityFramework' from project 'Unity-iPhone') .mm ファイルの管理フォルダを変更したあとに Unity で iOS ビルドしたら Xcode ビルド時に上記のエラーが発生する現象に遭遇した…

【Unity】Assembly Definition を作成する時のコンパイル回数を抑えられるエディタ拡張

リポジトリ 使い方 Project ウィンドウを右クリックして「Kogane > Create Assembly Definition」を選択して 表示されたウィンドウで Assembly Definition を作成することができます 通常の手順で Assembly Definition を作成して設定を変更する場合 Assembl…

【Unity】GUID とアセットの一覧を確認できる EditorWindow

リポジトリ 使用例 Unity メニューの「Window > Kogane > GUID List」を選択すると プロジェクトに含まれているすべてのアセットの GUID を確認できます 検索欄に GUID やアセットのパスを入力して検索することも可能です ダブルクリックすると該当のアセッ…

【Unity】Assertion failed on expression: 'it != m_SendMap.end()'

概要 AcceleratorClientConnectionCallback - disconnected - 192.168.0.6:10080 Assertion failed on expression: 'it != m_SendMap.end()' ================================================================= Native Crash Reporting ==================…

【Unity】プレハブモードで FindObjectOfType を使いたい場合

概要 var tilemap = GameObject.FindObjectOfType<Tilemap>(); プレハブモードでは FindObjectOfType を使ってもコンポーネントは見つからない var tilemap = PrefabStageUtility .GetCurrentPrefabStage() .FindComponentOfType<Tilemap>() ; 上記のようなコードを書くとコン</tilemap></tilemap>…

【Unity】Camera.ScreenToWorldPoint で毎回 z に 0 を入れなくて済む拡張メソッド

ソースコード using UnityEngine; namespace Kogane { public static class CameraExtensionMethods { public static Vector2 ScreenToWorldPoint2D ( this Camera self, Vector3 position ) { return self.ScreenToWorldPoint( position ); } public static…

【Unity】AssetPostprocessor の OnPreprocessAudio や OnPreprocessTexture だと ScriptableSingleton の最新の情報を取得できなかった

概要 private void OnPreprocessAudio() { var example = Example.instance; } AssetPostprocessor の OnPreprocessAudio や OnPreprocessTexture で ScriptableSingleton にアクセスしたところ、初回は正常に値を取得できたが ScriptableSingleton の値を変…

【Unity】Sprite Atlas V2 だと SetPackingSettings や SetTextureSettings が反映されない

概要 [MenuItem( "hoge/hoge" )] private static void Hoge() { var assetPath = "Assets/New Sprite Atlas.spriteatlas"; var spriteAtlas = AssetDatabase.LoadAssetAtPath<SpriteAtlas>( assetPath ); var packingSettings = spriteAtlas.GetPackingSettings(); packin</spriteatlas>…

【Unity】SpriteAtlas V2 を有効にした場合の SpriteAtlas の拡張子は .spriteatlasv2

概要 var list = importedAssets .Where( x => x.EndsWith( ".spriteatlas" ) || x.EndsWith( ".spriteatlasv2" ) ) .ToArray() ; アセットのパスの拡張子で SpriteAtlas かどうかを確認する場合は .spriteatlas だけではなく .spriteatlasv2 も確認する必要…

【Unity】AssetPostprocessor の OnPreprocessAudio や OnPreprocessTexture では Application.isBatchMode が true になる

概要 Unity Hub から Unity を起動した状態で [MenuItem( "hoge/hoge" )] private static void Hoge() { Debug.Log( Application.isBatchMode ); // False } Application.isBatchMode にアクセスすると通常は False になるが private void OnPreprocessAudio…

【Unity】LateFixedUpdate の実装例

ソースコード using System.Collections; using UnityEngine; [DisallowMultipleComponent] public sealed class Example : MonoBehaviour { private void OnEnable() { StartCoroutine( nameof( UpdateLateFixedUpdate ) ); } private void OnDisable() { S…

【Unity】エディタの選択履歴を管理できる「Editor History」紹介

はじめに 「Editor History」を Unity プロジェクトに導入することで エディタの選択履歴を管理できるようになります 使用例 エディタ右上のアイコンから選択履歴を確認できます

【Unity】ShowAuxWindow で開いた EditorWindow のタイトルを変更する方法

概要 var window = ScriptableObject.CreateInstance<Example>(); window.titleContent = new GUIContent( "ピカチュウ" ); window.ShowAuxWindow(); titleContent を設定する</example>

【Unity】Slider のドラッグが終了したかどうかを検知する方法

概要 using UnityEngine; using UnityEngine.EventSystems; public sealed class Example : MonoBehaviour, IPointerUpHandler, IEndDragHandler { // マウスクリックやタップが離された時 void IPointerUpHandler.OnPointerUp( PointerEventData eventData …

【Unity】エディタの GUI を上下の中央に表示する方法

概要 using var scope = new EditorGUILayout.VerticalScope(); GUILayout.FlexibleSpace(); if ( GUILayout.Button( icon, EditorStyles.iconButton ) ) { } GUILayout.FlexibleSpace(); EditorGUILayout.VerticalScope と GUILayout.FlexibleSpace を組み…

【Unity】エディタの GUI でリストに要素がドラッグされたかどうかを検知する方法

概要 using var scope = new EditorGUI.ChangeCheckScope(); var oldCount = m_list.Count; m_editor.OnInspectorGUI(); if ( !scope.changed && oldCount == m_list.Count ) return; Debug.Log( "ピカチュウ" ); エディタの GUI でリストに要素がドラッグさ…

【Unity】Duplicate Array Element と Delete Array Element を実行した時は ChangeCheckScope.changed は true にならない

【Unity】EditorGUILayout.Popup で「/」を無視する方法

概要 EditorGUILayout.Popup の displayedOptions に渡す文字列に対して .Replace( "/", "\u2215" ) 上記の処理を行えば「/」で階層が深くならなくなる 参考サイト様

【Unity】CodeEditor.CurrentEditor.OpenProject を使うと指定したファイルを外部コードエディタで開ける

概要 using Unity.CodeEditor; using UnityEditor; public static class Example { [MenuItem( "Tools/Hoge" )] public static void Hoge() { CodeEditor.CurrentEditor.OpenProject ( filePath: "Assets/Example.cs", line: 11, column: 20 ); } } たとえば…

【Unity】Hierarchy の Create メニューから EventSystem が作成できなくなった時の対処方法

概要 EventSystem の Preset を作成して Preset Manager に登録したら Hierarchy の Create メニューから EventSystem が作成できなくなった Unity を再起動したら作成できるように直った 開発環境 Unity 2022.1.11f1 macOS Monterey バージョン 12.5.1

【Unity】キーボード操作で UI が反応しないようにする方法

概要 Event System の Send Navigation Events をオフにする

【Unity】選択中の EditorWindow のスクリーンショットを撮影するエディタ拡張

ソースコード using System; using System.IO; using UnityEditor; using UnityEngine; namespace Kogane.Internal { internal static class EditorWindowCapturer { [MenuItem( "Kogane/選択中の EditorWindow をキャプチャ" )] private static void Captur…

【Unity】UnityException: LoadSerializedFileAndForget is not allowed to be called from a ScriptableObject constructor (or instance field initializer), call it in OnEnable instead. Called from ScriptableObject 'XXXX'.

概要 [InitializeOnLoad] internal static class Example { static Example() { Debug.Log( ExampleSetting.instance ); } } InitializeOnLoad のタイミングで ScriptableSingleton にアクセスしたら UnityException: LoadSerializedFileAndForget is not al…

【Unity】ドッキングされている EditorWindow の maxSize は無視される

参考サイト様

【Unity】Visual Element の相対位置を取得する方法

概要 Debug.Log( element.layout.position );

【Unity】Visual Element の絶対位置を取得する拡張メソッド

ソースコード using UnityEngine; using UnityEngine.UIElements; namespace Kogane { public static class VisualElementExtensionMethods { public static Vector2 GetPosition( this VisualElement self ) { var element = self; var position = Vector2.…

【Unity】Repaint を呼び出しても SceneTemplateAsset の Inspector の Dependencies が再描画されない場合

概要 var assembly = typeof( SceneTemplateAsset ).Assembly; var type = assembly.GetType( "UnityEditor.SceneTemplate.SceneTemplateAssetInspectorWindow" ); var rebuildDependenciesMethodInfo = type.GetMethod( "RebuildDependencies", BindingFlag…

【Unity】string.IsNullOrWhiteSpace を簡単に書けるようにするソーステンプレート

ソースコード [SourceTemplate] public static void isnullorwhitespace( this string self ) { /*$ string.IsNullOrWhiteSpace( str ) */ }

【Unity】string.IsNullOrEmpty を簡単に書けるようにするソーステンプレート

ソースコード [SourceTemplate] public static void isnullorempty( this string self ) { /*$ string.IsNullOrEmpty( str ) */ }

【Unity】コンポーネントの配列からすべてのゲームオブジェクトを削除する拡張メソッド

概要 public static void DestroyGameObjectAll<T>( this T[] self ) where T : Component { if ( self is not { Length: > 0 } ) return; for ( var i = 0; i < self.Length; i++ ) { var component = self[ i ]; Object.Destroy( component.gameObject ); sel</t>…