コガネブログ

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

【Unity】非同期読み込みの優先順位を設定できる「AsyncOperation.priority」

概要 var operation = SceneManager.LoadSceneAsync( "Hoge" ); operation.priority = 10; 複数の非同期操作がキューに存在する場合、 優先順位が高いものが最初に実行されます すでに開始した処理は、優先順位を変更しても反映されないため注意が必要です

【Unity】データをバックグラウンドで読み込む時に 1 フレーム内で使える最大時間を変更できる「Application.backgroundLoadingPriority」

概要 https://docs.unity3d.com/ScriptReference/Application-backgroundLoadingPriority.html Application.backgroundLoadingPriority を使用することで Resources.LoadAsync AssetBundle.LoadAssetAsync AssetBundle.LoadAllAssetAsync SceneManager.LoadS…

【おすすめスライド】「【Unity道場スペシャル 2017京都】最適化をする前に覚えておきたい技術」

スライド

【おすすめスライド】「C# ゲームプログラミングはホントにメモリのことに無頓着でいいの?」

スライド

【Unity】yield return 0 を使用すると 20B の GC Alloc が発生する

概要 using System.Collections; using UnityEngine; public class Example : MonoBehaviour { private IEnumerator Start() { while ( true ) { yield return 0; } } } yield return null なら GC Alloc は発生しない 検証環境 Unity 2017.4.7f1

【Unity】UnityEngine.Object.name にアクセスすると 46B の GC Alloc が発生する

概要 using UnityEngine; public class Example : MonoBehaviour { private void Update() { var name = gameObject.name; } } 検証環境 Unity 2017.4.7f1

【Unity】GameObject.tag にアクセスすると 42B の GC Alloc が発生する

概要 using UnityEngine; public class Example : MonoBehaviour { private void Update() { var tag = gameObject.tag; } } 検証環境 Unity 2017.4.7f1

【Unity】GC Alloc を減らす方法まとめ(自分用)

記事 Action デリゲートは 104B の GC Alloc が発生するが、インターフェイスであれば発生しない デリゲートを指定する時に関数名ではなくラムダ式を使用することで GC の発生を抑える 高速かつボックス化が発生しない Dictionary「BetterDictionary」紹介 D…

【Unity】Unity 2018.3.0b3 からガベージコレクションを無効化できる API が追加されたので試してみた

はじめに Scripting: Added UnityEngine.Scripting.GarbageCollector API for enabling and disabling the garbage collector on Mono and IL2CPP scripting backends. Unity 2018.3.0b3 からガベージコレクションを無効化できる API が追加されたので 試し…

【Unity】SpriteAtlas.GetSprite はスプライトの参照を返すのではなく複製するのでメモリに注意

概要 using UnityEngine; using UnityEngine.U2D; public class Example : MonoBehaviour { public SpriteAtlas m_atlas; private void Update() { m_atlas.GetSprite( "goal_01" ); } } 例えば上記のように Update 関数で毎フレーム SpriteAtlas.GetSprite …

【Unity】Android プラットフォームで Compression Method を「Default」にした場合と「LZ4」にした場合でアプリの起動時間にどれくらい差があるか

検証環境 Windows 7 Unity 2018.2.7f1 起動時間 Default:1.829 秒 LZ4:1.688 秒 参考サイト様

【Unity】アプリのビルドにかかった時間を調べる方法

概要 Unity の Console ウィンドウを右クリックして「Open Editor Log」を選択する もしくは C:\Users\【ユーザー名】\AppData\Local\Unity\Editor\Editor.log を開く 下記のようなテキストを検索する *** Completed 'Build.Player.AndroidPlayer' in 55 sec…

【Unity】Android プラットフォームで Internal ビルドした場合と Gradle ビルドした場合でビルド時間にどれくらい差があるか

検証環境 Windows 7 Unity 2018.2.7f1 ビルド時間 Internal:55 秒 Gradle:60 秒

【Unity】ゲーム画面に FPS、メモリ、オーディオ、デバイスの情報を表示できる「Graphy」紹介

はじめに 「Graphy」を Unity プロジェクトに導入することで ゲーム画面に FPS、メモリ、オーディオ、デバイスの情報を表示できるようになります 使用例 使い方 「[Graphy]」プレハブをシーンに配置します 設定できる項目はこのようになっています

【Unity】現在のシーンが参照しているテクスチャやマテリアルを一覧で確認できる「Unity Resource Checker」紹介

はじめに 「Unity Resource Checker」を Unity プロジェクトに導入することで 現在のシーンが参照しているテクスチャやマテリアルを 一覧で確認できるようになります 使い方 Unity メニューの「Windows>Resource Checker」を選択します すると、現在のシーン…

【Unity】キャラの立ち絵の画像のようにデザインが重複する画像の容量を削減できる「SpriteDicing」紹介

はじめに 「SpriteDicing」を Unity プロジェクトに導入することで キャラの立ち絵の画像のようにデザインが重複する画像の容量を 削減できるようになります 使用例 例えば、上記のような Unity ちゃんの立ち絵は、表情しか違いがありません しかし、これら…

【Unity】TextMesh Pro で数値を表示する時に GC Alloc の発生を防ぐことができる「TMProNonAllocUtil」紹介

はじめに 「TMProNonAllocUtil」を Unity プロジェクトに導入することで TextMesh Pro で数値を表示する時に GC Alloc の発生を防ぐことができるようになります 通常 using TMPro; using UnityEngine; public class Example : MonoBehaviour { public TextMe…

【Unity】System.Action よりも高速かつ GC の発生を抑えたイベントシステム「Relay」紹介

はじめに 「Relay」は System.Action よりも高速かつ GC Alloc の発生を抑えたイベントシステムです 検証環境 Unity 2017.4.1.f1 検証用スクリプト 検証結果 リスナーの追加や削除、イベントの実行を 1000000 回行った結果 かかった時間(秒) GC の発生回数…

【Unity】ビルドしたゲームに含まれているアセットの情報をクリップボードにコピーするエディタ拡張(Windows)

ソースコード 使い方 ゲームをビルドした後に Unity メニューの「Tools>Copy Build Report」を選択すると Build Report Uncompressed usage by category: Textures 119.9 kb 0.3% Meshes 0.0 kb 0.0% Animations 0.0 kb 0.0% Sounds 5.3 mb 14.1% Shaders 0.…

【Unity】Project ビューでアセットが ROM やアセットバンドルに含まれているかどうか確認できる「SearchTools」紹介

はじめに 「SearchTools」を Unity プロジェクトに導入することで Project ビューでアセットが ROM やアセットバンドルに含まれているかどうか 確認できるようになります クイックスタート Unity メニューの「Window>Search Tools>Rom Include Viewer」を選…

【Unity】PolygonCollider2D や EdgeCollider2D の処理負荷を削減できる「Polygon Collider Simplification」紹介

はじめに 「Polygon Collider Simplification」を Unity プロジェクトに導入することで PolygonCollider2D や EdgeCollider2D の処理負荷を削減できるようになります 使い方 適用前 適用後 使い方 PolygonCollider2D の処理負荷を削減したい場合は 「Polygon…

【Unity】コンパイル時間を確認できるエディタ拡張「compile-time-tracker」紹介

はじめに 「compile-time-tracker」は コンパイル時間を確認できるエディタ拡張です 使い方 Unity メニューの「Window>Compile Time Tracker Window」を選択します 表示された「Compile Timer」ウィンドウでコンパイル時間を確認できます 関連記事

【Unity】最適化に関する記事まとめ(45個)

はじめに このブログで紹介してきた最適化に関するオススメの記事を45件まとめました 目次 はじめに 目次 全般 iOS / Android スクリプト string Dictionary 列挙型 プロファイラ GC 検証 その他 uGUI ツール エディタ操作 スライド 全般 Unity におけるゲー…

【Unity】iOS アプリの容量を削減できる「Unity.iOS.OnDemand」紹介

はじめに 「Unity.iOS.OnDemand」を Unity プロジェクトに導入することで iOS アプリの容量を削減できます 使い方 上記のページで紹介されています 関連記事

【Unity】アプリに含まれているアセットは Console ウィンドウを右クリックして「Open Editor Log」から確認できる

概要 Console ウィンドウを右クリックして「Open Editor Log」を選択して 「Build Report」や「uncompressed size」などで検索すると アプリに含まれているアセットの容量や一覧が確認できます 関連記事

【Unity】メッシュの頂点を設定する時は Mesh.vertices ではなく Mesh.SetVertices を使用することで GC Alloc の発生を防ぐことができる

Mesh.vertices using UnityEngine; public class Example : MonoBehaviour { private Mesh mesh; private void Awake() { mesh = new Mesh(); } private void Update() { mesh.vertices = new [] { new Vector3( 0, 1 ), new Vector3( 1, -1 ), new Vector3(…

【Unity】アプリに含まれるアセットを圧縮する設定

検証環境 Unity 2017.3.0f3 概要 Build Settings の「Compression Method」を設定することで アプリに含まれるアセットを圧縮することができます BuildPipeline.BuildPlayer ( EditorBuildSettings.scenes, "app.apk", BuildTarget.Android, BuildOptions.Co…

【Unity】Action デリゲートは 104B の GC Alloc が発生するが、インターフェイスであれば発生しない

概要 Action デリゲートはとても便利ですが、104B の GC Alloc が発生します もしも Action デリゲートを Update 関数などで頻繁に呼び出す場合は インターフェイスに置き換えることで GC Alloc の発生を防ぐことができます Action デリゲート using System;…

【Unity】列挙型を数値型に変換する時のメモリ割り当てを抑える「FastEnumConvert」紹介

ソースコード 使い方 var result1 = Convert.ToInt32( value ); // 40 byte のメモリ割り当て var result2 = FastEnumConvert.ToInt32( value ); // メモリ割り当てなし 関連記事

【Unity】Profiler.BeginSample、EndSample を using ステートで記述できるようにする「ScopedProfiler.cs」紹介

ソースコード 使用前 Profiler.BeginSample( "ピカチュウ" ); // ... Profiler.EndSample(); 使用後 using ( new ScopedProfiler( "ピカチュウ" ) ) { // ... } 関連記事