コガネブログ

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

【Unity】横向きかつクリックやタップ可能なゲームで使用できるカスタマイズ可能なデバッグメニュー「UniDebugMenu」を GitHub に公開しました

はじめに

横向きかつクリックやタップ可能なゲームで使用できる
カスタマイズ可能なデバッグメニュー「UniDebugMenu」を GitHub に公開しました

目次

機能

  • 3種類のメニュー表示を使用可能
    • テキスト表示
    • ボタン表示
    • カスタマイズ可能なボタン表示
  • 大量のデータを実装可能
  • 多階層のメニューを実装可能
  • 検索可能
  • カテゴリ分け可能
  • トースト表示
  • イベント検知
  • ドラッグ可能な開くボタン
  • どこからでも開ける
  • 複数解像度対応

バージョン

  • Unity 2018.3.7f1

サンプル

トップ画面

f:id:baba_s:20190318121622p:plain

システム情報

f:id:baba_s:20190318121129p:plain

f:id:baba_s:20190318121138p:plain

f:id:baba_s:20190318121145p:plain

システムコマンド

f:id:baba_s:20190318121153p:plain

f:id:baba_s:20190318121201p:plain

ゲームオブジェクト一覧

f:id:baba_s:20190318121208p:plain

ログ情報

f:id:baba_s:20190318121215p:plain

f:id:baba_s:20190318121224p:plain

3種類のメニュー表示を使用可能

テキスト表示

f:id:baba_s:20190318121129p:plain

ボタン表示

f:id:baba_s:20190318121245p:plain

f:id:baba_s:20190318121252p:plain

カスタマイズ可能なボタン表示

f:id:baba_s:20190318121153p:plain

大量のデータを実装可能

f:id:baba_s:20190318121306g:plain

多階層のメニューを実装可能

f:id:baba_s:20190318121326g:plain

検索可能

f:id:baba_s:20190318122249g:plain

カテゴリ分け可能

f:id:baba_s:20190318122302g:plain

トースト表示

f:id:baba_s:20190318122324g:plain

ドラッグ可能な開くボタン

f:id:baba_s:20190318122400g:plain

どこからでも開ける

f:id:baba_s:20190318122651g:plain

複数解像度対応

18:9

f:id:baba_s:20190318122531p:plain

4:3

f:id:baba_s:20190318122547p:plain

使い方

  • 「Assets/UniDebugMenu/Example」に含まれているシーンやスクリプトを
    参考にしていただければと思います

デバッグメニューを呼び出すサンプル

using UnityEngine;
using UnityEngine.SceneManagement;

namespace UniDebugMenu.Example
{
    /// <summary>
    /// デバッグメニューのサンプルを管理するクラス
    /// </summary>
    public sealed class UniDebugMenuExampleScene : MonoBehaviour
    {
        //==============================================================================
        // 変数
        //==============================================================================
        private ExampleTopListCreator m_creator;

        //==============================================================================
        // 関数
        //==============================================================================
        /// <summary>
        /// 初期化される時に呼び出されます
        /// </summary>
        private void Awake()
        {
            // デバッグメニューのトップ画面のリストを管理するインスタンスを作成します
            m_creator = new ExampleTopListCreator();
            m_creator.Init();

            // デバッグメニューのシーンを加算で読み込みます
            SceneManager.LoadScene( "UniDebugMenuScene", LoadSceneMode.Additive );

            // デバッグメニューでコマンドが実行された時に呼び出されます
            UniDebugMenuScene.mOnChange += () => Debug.Log( "UniDebugMenuScene.mOnChange" );

            // DM ボタンが押された時にデバッグメニューのトップ画面を開くように設定します
            UniDebugMenuScene.mOnOpen += () => DMType.BUTTON_COL_3.Open( m_creator );
        }

        /// <summary>
        /// デバッグメニューを開くボタンが押された
        /// </summary>
        public void OnClick1()
        {
            // デバッグメニューのトップ画面を開きます
            DMType.BUTTON_COL_3.Open( m_creator );
        }

        /// <summary>
        /// システムコマンドの画面を開くボタンが押された
        /// </summary>
        public void OnClick2()
        {
            // デバッグメニューのシステムコマンドの画面を開きます
            DMType.COMMAND_TAB_6.Open( new SystemCommandListCreator() );
        }

        /// <summary>
        /// デバッグメニューを開く DM ボタンを透明にするボタンが押された
        /// </summary>
        public void OnClick3()
        {
            // DM ボタンを透明にします
            // DM ボタンは透明になるだけで当たり判定は有効のままになります
            // true:不透明 false:透明
            UniDebugMenuScene.SetOpenButtonVisible( false );
        }

        /// <summary>
        /// デバッグメニューを削除するボタンが押された
        /// </summary>
        public void OnClick4()
        {
            // デバッグメニューのゲームオブジェクトを削除します
            if ( UniDebugMenuScene.Destroy() )
            {
                // デバッグメニューのゲームオブジェクトが削除できた場合は
                // デバッグメニューのシーンもアンロードします
                SceneManager.UnloadSceneAsync( "UniDebugMenuScene" );
            }
        }
    }
}

リストを作成するサンプル

using System;
using System.Collections.Generic;
using System.Linq;
using UnityEngine;

namespace UniDebugMenu.Example
{
    /// <summary>
    /// デバッグメニューのトップ画面のリストを作成するクラス
    /// </summary>
    [Serializable]
    public sealed class ExampleTopListCreator : ListCreatorBase<ActionData>, IDisposable
    {
        //==============================================================================
        // 変数(readonly)
        //==============================================================================
        private readonly ActionData[] m_sourceList;

        // ログ情報のリストを作成するインスタンス
        private readonly LogListCreator m_logDataCreator = new LogListCreator( 1500 );

        //==============================================================================
        // 変数
        //==============================================================================
        private IList<ActionData> m_list;

        //==============================================================================
        // プロパティ
        //==============================================================================
        public override int Count => m_list.Count;

        public override ActionData[] OptionActionList => new []
        {
            new ActionData( "ボタン1"   , () => Debug.Log( "ボタン1が押されました" ) ),
            new ActionData( "ボタン2"   , () => Debug.Log( "ボタン2が押されました" ) ),
            new ActionData( "ボタン3"   , () => Debug.Log( "ボタン3が押されました" ) ),
            new ActionData( "ボタン4"   , () => Debug.Log( "ボタン4が押されました" ) ),
            new ActionData( "ボタン5"   , () => Debug.Log( "ボタン5が押されました" ) ),
        };

        //==============================================================================
        // 関数
        //==============================================================================
        /// <summary>
        /// コンストラクタ
        /// </summary>
        public ExampleTopListCreator()
        {
            m_sourceList = new []
            {
                new ActionData( "テキスト表示サンプル"      , () => OpenAdd( DMType.TEXT_TAB_6      , new TextListCreatorExample() ) ),
                new ActionData( "ボタン表示サンプル 2列"    , () => OpenAdd( DMType.BUTTON_COL_2    , new TextListCreatorExample() ) ),
                new ActionData( "ボタン表示サンプル 3列"    , () => OpenAdd( DMType.BUTTON_COL_3    , new TextListCreatorExample() ) ),
                new ActionData( "システム情報"              , () => OpenAdd( DMType.TEXT_TAB_6      , new SystemInfoListCreator() ) ),
                new ActionData( "システムコマンド"          , () => OpenAdd( DMType.COMMAND_TAB_6   , new SystemCommandListCreator() ) ),
                new ActionData( "ゲームオブジェクト一覧"    , () => OpenAdd( DMType.COMMAND_TAB_6   , new GameObjectListCreator() ) ),
                new ActionData( "ログ情報"                  , () => OpenAdd( DMType.TEXT_TAB_6      , m_logDataCreator ) ),
            };
        }

        /// <summary>
        /// 初期化します
        /// </summary>
        public void Init() => m_logDataCreator.Init();

        /// <summary>
        /// 破棄します
        /// </summary>
        public void Dispose() => m_logDataCreator.Dispose();

        /// <summary>
        /// リストの表示に使用するデータを作成します
        /// </summary>
        protected override void DoCreate( ListCreateData data )
        {
            m_list = m_sourceList
                .Where( c => data.IsMatch( c.m_text ) )
                .ToArray()
                .ReverseIf( data.IsReverse )
            ;
        }

        /// <summary>
        /// 指定されたインデックスの要素の表示に使用するデータを返します
        /// </summary>
        protected override ActionData DoGetElemData( int index ) => m_list.ElementAtOrDefault( index );
    }
}

ライセンス