コガネブログ

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

2019-03-01から1ヶ月間の記事一覧

【Unity】uGUI でソフトマスクを使用できる「UISoftMask」紹介

はじめに 「UISoftMask」を Unity プロジェクトに導入することで uGUI でソフトマスクを使用できるようになります 使用例 使い方 「UISoftMask」がアタッチされたゲームオブジェクトを作成します 「Alpha Texture」にソフトマスクで使用するテクスチャを設定…

【Unity】レイヤーの順番や割り当てを変更できる「LayerManager」紹介

はじめに 「LayerManager」を Unity プロジェクトに導入することで レイヤーの順番や割り当てを変更できるようになります 使用例 Unity メニューの「Tools > Yondernauts > Layer Manager」を選択すると レイヤーの順番や割り当てを変更できるウィンドウが表…

【Unity】Unity エディタの Game ビューに iPhone X のセーフエリアを表示できる「iPhone X Safe Area Drawer」を GitHub に公開しました

はじめに Unity エディタの Game ビューに iPhone X のセーフエリアを表示できる 「iPhone X Safe Area Drawer」を GitHub に公開しました バージョン Unity 2018.3.9f1 使用例 使い方 「iPhoneXSafeAreaDrawerSettings」を選択して IsEnable をオンにすると…

【Unity】Unity プロジェクトに存在するすべてのマテリアルやシェーダの Render Queue を一覧で表示できる「Render Queue Unity Extension」紹介

はじめに 「Render Queue Unity Extension」を Unity プロジェクトに導入することで Unity プロジェクトに存在するすべてのマテリアルやシェーダの Render Queue を一覧で表示できるようになります 使用例 Unity メニューの「Tools > Render Queue」を選択す…

【Unity】static 変数、Hierarchy のオブジェクト、プレハブ、ScriptableObject などがどのくらいヒープ領域を使用しているか内訳を見ることができる「Unity Heap Crawler」紹介

はじめに 「Unity Heap Crawler」を Unity プロジェクトに導入することで static 変数、Hierarchy のオブジェクト、プレハブ、ScriptableObject などが どのくらいヒープ領域を使用しているか内訳を見ることができます 使い方 Unity エディタ再生中にメニュ…

【Unity】アセットバンドル化するアセットがアプリに内包するアセットから参照されていないか確認できる「AssetReferenceFinder」紹介

はじめに 「UnitySamples」リポジトリに含まれている 「AssetReferenceFinder.cs」を使用することで アセットバンドル化するアセットが アプリに内包するアセットから参照されていないか確認できます 使用例 例えば、アセットバンドル化するアセットが含まれ…

【Unity】Unity プロジェクトに含まれるすべてのマテリアルを取得するエディタ拡張のサンプル

概要 using System.Linq; using UnityEditor; using UnityEngine; public static class Example { [MenuItem( "Tools/Hoge" )] private static void Hoge() { var list = AssetDatabase .FindAssets( "t:Material" ) .Select( AssetDatabase.GUIDToAssetPath…

【Unity】Unity プロジェクトに含まれるすべてのプレハブを取得するエディタ拡張のサンプル

概要 using System.Linq; using UnityEditor; using UnityEngine; public static class Example { [MenuItem( "Tools/Hoge" )] private static void Hoge() { var list = AssetDatabase .FindAssets( "t:Prefab" ) .Select( AssetDatabase.GUIDToAssetPath )…

【Unity】セーフエリアに合わせて RectTransform のサイズを調整するコンポーネント

ソースコード 使い方 「SafeAreaPanel」を uGUI のオブジェクトにアタッチすることで使用できます 例えば iPhone XR で使用すると、上記のようにセーフエリアに合わせて UI.Image のサイズが自動で調整されます

【Unity】任意のコードの実行時間や GC Alloc を測定して Profiler に表示できる「CustomSampler」

概要 using UnityEngine; using UnityEngine.Profiling; public class Example : MonoBehaviour { private void Start() { var sampler = CustomSampler.Create( "Pokemon" ); sampler.Begin(); for ( int i = 0; i < 10000; i++ ) { Debug.Log( "あああああ…

【C#】string から一行目だけ取得する拡張メソッド

ソースコード using System; using System.Linq; public static class StringExt { public static string GetFirstLine( this string self ) { var separator = new [] { Environment.NewLine }; return self .Split( separator, StringSplitOptions.None ) …

【Unity】CrashReport の末尾の要素2つは重複している?

概要 var reports = CrashReport.reports .Take( CrashReport.reports.Length - 1 ); 自分の環境下だけの問題かもしれないですが、 CrashReport.reports の末尾の要素2つは重複しているようだったので 上記のコードのように末尾のコードは無視して参照してい…

【Unity】TexturePacker でパッキングしたテクスチャを SpriteRenderer や uGUI の Image で使用する

はじめに TexturePacker でパッキングしたテクスチャは SpriteRenderer や uGUI の Image で使用することができます 検証環境 Unity 2018.3.7f1 TexturePacker 4.12.1 準備 上記サイトから TexturePacker をインストールします また、 「TexturePacker Impor…

【Unity】指定した Unity のオブジェクトやアセットのメモリ使用量を取得できる「Profiler.GetRuntimeMemorySizeLong」

概要 例えば、上記のように3個のテクスチャを描画するシーンを Android にビルドして using System.Linq; using System.Text; using TMPro; using UnityEngine; using UnityEngine.Profiling; public class Example : MonoBehaviour { public TMP_Text m_tex…

【Unity】Unity が確保したメモリの使用状況(Unity の使用メモリ)を取得するスクリプト

ソースコード 使用例 using System.Text; using TMPro; using UnityEngine; public class Example : MonoBehaviour { public TMP_Text m_text; private readonly UnityMemoryChecker m_unityMemoryChecker = new UnityMemoryChecker(); private void Update(…

【Unity】Managed Memory の使用状況(Mono の使用メモリ)を取得するスクリプト

ソースコード 使用例 using System.Text; using TMPro; using UnityEngine; public class Example : MonoBehaviour { public TMP_Text m_text; private readonly MonoMemoryChecker m_monoMemoryChecker = new MonoMemoryChecker(); private void Update() {…

【Unity】実機で読み込まれているマテリアルの一覧を取得する方法

概要 using System.Linq; using System.Text; using UnityEngine; public class Example : MonoBehaviour { private void Awake() { var list = Resources .FindObjectsOfTypeAll<Material>() .Where( c => ( c.hideFlags & HideFlags.NotEditable ) == 0 ) .Where( c </material>…

【Unity】実機で読み込まれているテクスチャの一覧を取得する方法

概要 using System.Linq; using System.Text; using UnityEngine; public class Example : MonoBehaviour { private void Awake() { var list = Resources .FindObjectsOfTypeAll<Texture2D>() .Where( c => ( c.hideFlags & HideFlags.NotEditable ) == 0 ) .Where( c </texture2d>…

【おすすめスライド】「【CEDEC2018】一歩先のUnityでのパフォーマンス/メモリ計測、デバッグ術」

スライド

【雑記】Nintendo Switch の「お客様が選ぶ!ダウンロード専用ソフト おすすめランキング3月号」で「ガブッチ」が6位に選ばれました!

概要 Nintendo Switch の「お客様が選ぶ!ダウンロード専用ソフト おすすめランキング3月号」で「ガブッチ」が6位に選ばれました! ランダムなアンケートによる結果とのことで、とても嬉しいです。励みになります

【Unity】意図的に強制終了できる「UnityEngine.Diagnostics.Utils.ForceCrash」

概要 using UnityEngine; using UnityEngine.Diagnostics; public class Example : MonoBehaviour { private void Update() { if ( Input.GetKeyDown( KeyCode.Space ) ) { Utils.ForceCrash( ForcedCrashCategory.AccessViolation ); } } } UnityEngine.Dia…

【Unity】GC が何回発生したか計測する自作クラス

ソースコード 使用例 using UnityEngine; public class Example : MonoBehaviour { private void Awake() { var watcher = new GCWatcher(); watcher.Start(); for ( int i = 0; i < 10000; i++ ) { Debug.Log( "【計測したい処理】" ); } watcher.Stop(); D…

【Unity】String Interpolation を使用した場合と string.Format を使用した場合の GC Alloc は同じ

概要 using UnityEngine; using UnityEngine.Profiling; public class Example : MonoBehaviour { private CustomSampler m_sampler1; private CustomSampler m_sampler2; private CustomSampler m_sampler3; private CustomSampler m_sampler4; private voi…

【Unity】Unity 2018.3.7 だと何もしていなくても毎フレーム 17B の GC Alloc が発生する

概要 Unity 2018.3.7 だと何もしていなくても毎フレーム 17B の GC Alloc が発生する Unity 2018.3.8 以上にアップデートすると直る 参考サイト様

【Unity】GC が発生したかどうかをイベントで検知できる独自クラス

ソースコード 使用例 using UnityEngine; public class Example : MonoBehaviour { private void Awake() { GCEvent.Initialize(); GCEvent.mOnCollect += OnCollect; } private void OnDestroy() { GCEvent.mOnCollect -= OnCollect; } private void OnColl…

【Unity】「UGUI Super ScrollView」で1つのプレハブしか使わない場合はスクロールバーの大きさを固定したかった

はじめに 「UGUI Super ScrollView」はいろんなスクロールビューが 簡単に実装できるのでとても好きなのですが、 スクロールするたびにスクロールバーがカクカクするのが気になっていました おそらくスクロールビューに含まれる要素の大きさが可変でも 問題…

【Unity】エディタ拡張において Unity プロジェクト内から指定した型の ScriptableObject を取得する方法

概要 例えば HogeSettings という名前の ScriptableObject を取得したい場合 var settings = AssetDatabase .FindAssets( "t:HogeSettings" ) .Select( c => AssetDatabase.GUIDToAssetPath( c ) ) .Select( c => AssetDatabase.LoadAssetAtPath<HogeSettings>( c ) ) .Fir</hogesettings>…

【Unity】マネージドプラグインやネイティブプラグインの設定をスクリプトから変更できる「PluginImporter」

概要 using UnityEditor; public static class Example { [MenuItem( "Tools/Hoge" )] private static void Hoge() { var obj = Selection.activeObject; var path = AssetDatabase.GetAssetPath( obj ); var importer = AssetImporter.GetAtPath( path ) as…

【Unity】Missing Prefab かどうか確認する方法

概要 using UnityEditor; using UnityEngine; public static class Example { [MenuItem( "Tools/Hoge" )] private static void Hoge() { var go = Selection.activeGameObject; var status = PrefabUtility.GetPrefabInstanceStatus( go ); var isMissing =…

【Unity】Animator Controller のいずれかのステートの Motion が null になっている場合に true を返す拡張メソッド

概要 using System.Linq; using UnityEditor.Animations; public static class AnimatorControllerExt { public static bool HasNullMotion( this AnimatorController self ) { foreach ( var n in self.layers ) { if ( n.stateMachine.states.Any( c => c.…