コガネブログ

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

【Unity】Debug.Log でスタックトレースを非表示にした時の GC Alloc と処理時間の検証

はじめに Unity では Debug.Log する時にスタックトレースの情報も出力するかどうか設定できる エディタの Project Settings > Player > Other Settings から設定可能 エディタ拡張のスクリプトから PlayerSettings.SetStackTraceLogType で設定可能 ランタ…

【Unity】ランタイムで Debug.Log のスタックトレースの出力の ON / OFF を切り替える方法

概要 using UnityEngine; public class Example : MonoBehaviour { private void Awake() { // スタックトレースあり Application.SetStackTraceLogType( LogType.Log, StackTraceLogType.ScriptOnly ); // スタックトレースなし Application.SetStackTraceL…

【Unity】アセンブリのコンパイルのプロセスを可視化できるエディタ拡張「Compilation Visualizer for Unity」紹介

はじめに 「Compilation Visualizer for Unity」は アセンブリのコンパイルのプロセスを可視化できるエディタ拡張です 使用例 プロジェクト全体をコンパイルし直した場合 Assembly-CSharp.dll のスクリプトを修正した場合

【おすすめスライド】「ららマジでしかできない!?キャラクターアセット最適化事例」

スライド

【Unity】Profiler の項目に紐付いているオブジェクトを表示する方法

概要 Profiler の「No Details」を「Show Related Objects」に変更することで Profiler の項目に紐付いているオブジェクトを確認できるようになります

【Unity】SpriteRenderer で FullRect のスプライトを使用した時と Tight のスプライトを使用した時の処理速度の比較メモ

検証環境 Unity 2019.3.10f1 Android Mono2x Android 8.0.0 表示するスプライト数:100個 検証結果 Mesh Type FPS Full Rect 28 FPS Tight 60 FPS

【Unity】TextMesh Pro の SetText 関数で文字列を設定する場合、文字列が変化しない場合でも UI のリビルドが走る

検証環境 Unity 2019.3.10f1 TextMesh Pro 2.0.1 概要 TMP_Text.cs を見てみると public string text { get { return m_text; } set { if (m_text == value) return; m_text = old_text = value; m_inputSource = TextInputSources.String; m_haveProperties…

【Unity】IL2CPP でインクリメンタルビルドを有効化するかどうかを設定できる「PlayerSettings.SetIncrementalIl2CppBuild」

概要 PlayerSettings.SetIncrementalIl2CppBuild( BuildTargetGroup.iOS, true ); 「PlayerSettings.SetIncrementalIl2CppBuild」を使用することで IL2CPP でインクリメンタルビルドを有効化するかどうかを設定できます

【Unity】スプライトからメッシュを生成するスクリプト

ソースコード using System; using System.Linq; using UnityEngine; public static class SpriteUtils { public static Mesh SpriteToMesh( Sprite sprite ) { var mesh = new Mesh(); mesh.SetVertices( Array.ConvertAll( sprite.vertices, x => ( Vector…

【おすすめスライド】「なるほど3Dグラフィック描画の仕組み」

スライド https://monolizm.com/sab/pdf/%E7%AC%AC%E4%B8%89%E5%9B%9E_%E3%83%97%E3%83%AC%E3%82%BC%E3%83%B3%E8%B3%87%E6%96%99(%E3%81%AA%E3%82%8B%E3%81%BB%E3%81%A93D%E3%82%B0%E3%83%A9%E3%83%95%E3%82%A3%E3%83%83%E3%82%AF%E6%8F%8F%E7%94%BB%E3%81%A…

【おすすめスライド】「RENDERING 最適化「禍つヴァールハイト」」

スライド

【おすすめスライド】「Refresh what you know about AssetDatabase.Refresh()- Unite Copenhagen 2019」

スライド

【おすすめスライド】「Speed up your asset imports for big projects - Unite Copenhagen 2019」

スライド

【Unity】AssetDatabase.CreateAsset で時間がかかる時に高速化できるかもしれない「AssetDatabase.StartAssetEditing」

概要 using UnityEditor; using UnityEngine; using Debug = UnityEngine.Debug; public class Example : AssetPostprocessor { [MenuItem( "Tools/Hoge" )] private static void Hoge() { var count = 100; var shader = Shader.Find( "Sprites/Diffuse" );…

【Unity】SpriteAtlas と TexturePacker の比較メモ

インポート時間の比較 約1,000個のスプライトを直接 Unity プロジェクトに追加した場合と 事前に TexturePacker でアトラス化して Unity プロジェクトに追加した場合の インポート時間の比較 項目 インポート時間 非アトラス化 75秒 アトラス化 34秒 アトラ…

【Unity】Cache Server にすべてのアセットをアップロードするメニュー

概要 Unity メニューの「Assets > Cache Server > Upload All Assets」を押して 表示されたウィンドウで Cache Server の IP アドレスを入力して「Upload」を押す

【Unity】スプライトをアトラス化する前とした後の Build Report の差

はじめに Unity プロジェクトに 382.7 KB のスプライトを5つ追加して SpriteAtlas でパッキングしなかった場合とした場合で Build Report にどのように差が出るか アトラス化前 Textures 1.5 mb 9.1% 384.4 kb 0.8% Assets/Sprites/f005.png 384.4 kb 0.8% A…

【Unity】高速な xcodebuild

概要 # 通常の xcodebuild xcodebuild \ -project $PROJECT_PATH \ -scheme $SCHEME \ archive -archivePath $ARCHIVE_PATH \ PROVISIONING_PROFILE=$PROVISIONING_PROFILE # 高速な xcodebuild xcodebuild \ -project $PROJECT_PATH \ -scheme $SCHEME \ ar…

【Unity】MasterMemory の基本的な使い方

はじめに この記事では MasterMemory の基本的な使い方を紹介していきます 目次 はじめに 目次 検証環境 必要なファイルの入手 .unitypackage のインポート マスタを管理するクラスの準備 MasterMemory のジェネレータを実行 MessagePack のジェネレータを実…

【おすすめスライド】「今すぐ現場で覚えておきたい最適化技法 ~「ゲシュタルト・オーディン」開発における最適化事例~」

スライド

【Unity】空のゲームオブジェクトのプレハブのサイズは 1KB でデフォルトの Particle System のプレハブのサイズは 113KB

概要 項目 サイズ ファイル行数 空のゲームオブジェクトのプレハブ 1KB 32行 デフォルトの Cube プレハブ 3KB 94行 デフォルトの Particle System のプレハブ 113KB 4755行 ファイルの中身 空のゲームオブジェクトのプレハブ デフォルトの Particle System …

【Unity】CustomSampler を using で使用できるようにするクラス

ソースコード 使用例 通常 using UnityEngine; using UnityEngine.Profiling; public class Example : MonoBehaviour { private void Update() { var sampler = CustomSampler.Create( "AAAAA" ); sampler.Begin(); // ... sampler.End(); } } CustomSampler…

【Unity】物理演算を無効化する方法

概要 using UnityEngine; public class Example : MonoBehaviour { private void Update() { Physics.autoSimulation = false; Physics2D.autoSimulation = false; } } 物理演算を無効化する場合は 3D の場合は Physics.autoSimulation に false を、 2D の…

【Unity】簡単にオブジェクトプールを使用できる「Master Object Pooler 2」紹介

はじめに 「Master Object Pooler 2」を Unity プロジェクトに導入することで 簡単にオブジェクトプールを使用できるようになります 使い方 Project ビューの「Create > Master Object Pooler 2 > Object Pool」を選択して オブジェクトプールを管理するアセ…

【Unity】string.Format や StringBuilder、TextMesh Pro の割り当てを削減できる「ZString」紹介

はじめに 「ZString」を Uniy プロジェクトに導入することで string.Format や StringBuilder、TextMesh Pro の割り当てを削減できるようになります string.Format 通常 using UnityEngine; public class Example : MonoBehaviour { private void Update() {…

【Unity】WebGL で Compression Format によってどのくらいビルド時間に差がでるか

検証環境 Unity 2019.2.15f1 空の 2D プロジェクト 検証結果 Compression Format ビルド時間 Disabled 46 秒 Gzip 47 秒 Brotli 123 秒 補足 gzip: デフォルト設定。gzip ファイルは Brotli ファイルより大きいですが、ビルドにかかる時間が短く、http と ht…

【Unity】構造体をインターフェイスで受け取ると GC Alloc が発生するが Generic 制約でインターフェイスを指定すると発生しない

概要 using UnityEngine; public interface ICharacter { } public struct Character : ICharacter { } public class Example : MonoBehaviour { private Character m_character = new Character(); private void Update() { Hoge1( m_character ); } privat…

【Unity】System.Enum で引数を受け取ると GC Alloc が発生するが Generic 制約 で Enum を指定すると発生しない

概要 using System; using UnityEngine; public class Example : MonoBehaviour { private enum Type { GRASS, FIRE, WATER, } private void Update() { Hoge1( Type.FIRE ); } private void Hoge1( Enum value ) { } } System.Enum で引数を受け取ると GC A…

【Unity】ローカル変数をキャプチャする場合、その処理が実行されなくても GC Alloc は発生する

概要 using System.Linq; using UnityEngine; public class Example : MonoBehaviour { private static string [] m_list = { "フシギダネ", "フシギソウ", "フシギバナ", }; private void Update() { var name = "ピカチュウ"; // ここで return するので r…

【Visual Studio】ラムダ式の => にカーソルを重ねるとキャプチャされている変数を確認できる

概要 ラムダ式の => にカーソルを重ねるとキャプチャされている変数を確認できます 参考サイト様 https://www.slideshare.net/xin9le/dotnetperformancetips-170268354