Tsuの雑記¯\_(ツ)_/¯

主に製作メモ・備忘録として使用。製作したアプリのリンクもあります。

【Unity】誤ってデバッグモードのまま公開しないために【C#】

アプリを公開する際,テストプレイ用の設定を消し忘れないための提案です。

本稿では,UI.Text を使って御説明いたします。

(2019/09/30)追記しました。

(Unity 2018.3.0f2)

はじめに

本稿における「デバッグモード」とは,Unity 標準の機能を指すものでは有りません。

Unity でアプリを作っていると,開発中のみ実装したい機能が欲しくなります。

「無敵化」「所持金無限大」「広告無効化」等が,それに当たるでしょう。

例えばそれらの命令を,真偽値isDebugという変数の切り替えによって管理するとします。

using UnityEngine;

public class NewBehaviourScript : MonoBehaviour
{
    // デバッグ切り替え
    [SerializeField] bool isDebug = false;

    void Start()
    {
        if (isDebug)
        {
            // 何らかのデバッグ用機能
        }
    }
}

上記のスクリプトを適当な GameObject にアタッチする事で,デバッグ機能の有効・無効を Inspector 上で切り替えられるようになります。

Inspector に isDebug 変数のトグルスイッチが表示されている画像
デバッグ切り替えスイッチ

しかしこれは決して目立つ物ではありませんから,公開時にうっかりチェックを入れたままという事態が起きないとも限りません。

これを補うため,デバッグモードである事を強調したいというのが今回のテーマです。

UI.Text の設置

まずはデバッグモードである事を確認しやすい位置に,UI.Text を設置します。

サイズや位置をシミュレーションするためにも,実際に表示したい文字数に近いテキストを入力しておくと良いでしょう。

(このテキスト内容はスクリプトによって上書きされるため,仮置きだと思ってください。)

UnityEditor の Inspector ウィンドウで Text を編集している画像
ゲーム画面中央に UI.Text を設置

スクリプトの用意

次に,このテキストを操作するスクリプトを用意します。

using UnityEngine;
// UI.Text を使用するため
using UnityEngine.UI;

public class NewBehaviourScript : MonoBehaviour
{
    // デバッグ切り替え
    [SerializeField] bool isDebug = false;
    // デバッグ表示テキスト
    [SerializeField] Text debugText = null;

    void OnValidate()
    {
        // デバッグ表示テキスト書き換え
        debugText.text = isDebug ? "Debug" : string.Empty;

        /* 上記の1文を if 文で表す場合
        if (isDebug)
        {
            text.text = "Debug";
        }
        else
        {
            text.text = string.Empty;
        }*/
    }

    void Start()
    {
        // 起動時にデバッグ表示ごとキャンバスのコンポーネントを無効化
        debugText.canvas.enabled = false;
        // 起動時にデバッグ表示ごとキャンバスを非表示に
        //debugText.canvas.gameObject.SetActive(false);
        // 起動時にデバッグ表示のコンポーネントを無効化
        //debugText.enabled = false;
        // 起動時にデバッグ表示を非表示に
        //debugText.gameObject.SetActive(false);
        // 起動時にデバッグ表示のサイズを0に
        //debugText.transform.localScale = Vector3.zero;
        // 起動時にデバッグ表示を透明に
        //debugText.color = Color.clear;
        // 起動時にデバッグ表示を空文字に
        //debugText.text = string.Empty;
    }
}

アタッチ

後はこのスクリプトを適当なオブジェクトにアタッチして,真偽値isDebugを切り替えてみます。

UnityEditor の Game ウィンドウで UI.Text のテキストが切り替わる画像
プレイ状態でなくとも Game 画面上のテキストが変化する

これだけ目立つ文字が Game ウィンドウにあれば,このまま公開してしまうリスクは激減するかと思います。

Start()メソッドの中には,起動時にデバッグ表示を消去する命令を数種類用意いたしました。

処理速度等を考慮したうえで,自由にお選びくださいませ。

おまけ

(2019/09/30)以下の内容を追記しました。

上記の方法では UI を非表示に出来ても,オブジェクトとしては公開時にも存在します。

無駄なオブジェクトを極力削りたい場合は,デバッグモード時のみ UI を生成する方法を採ると良いでしょう。

using UnityEngine;
// UI.Text を使用するため
using UnityEngine.UI;

public class NewBehaviourScript : MonoBehaviour
{
    // デバッグ切り替え
    [SerializeField] bool isDebug = false;
    // デバッグ表示テキストの内容
    [SerializeField] string debugTextString = "Debug";
    // デバッグ表示テキストの色
    [SerializeField] Color debugTextColor = Color.red;

    // デバッグ表示キャンバス
    Canvas debugCanvas = null;
    // デバッグ表示テキスト
    Text debugText = null;

    void OnValidate()
    {
        // OnValidate() 内では実行できない命令を委譲
        UnityEditor.EditorApplication.delayCall = SwitchDebug;

        // デバッグモードかつデバッグ表示テキストが生成されている場合
        if (isDebug && debugText != null)
        {
            // テキストの内容を設定
            debugText.text = debugTextString;
            // テキストの色を設定
            debugText.color = debugTextColor;
        }
    }

    /// <summary>
    /// デバッグ表示の切り替え
    /// </summary>
    void SwitchDebug()
    {
        // デバッグモードの場合
        if (isDebug)
        {
            // デバッグ表示キャンバスが生成されていない場合
            if (debugCanvas == null)
            {
                // デバッグ表示キャンバスを生成
                debugCanvas = new GameObject("DebugCanvas").AddComponent<Canvas>();
                // キャンバスのレンダーモードを ScreenSpaceOverlay に
                debugCanvas.renderMode = RenderMode.ScreenSpaceOverlay;
            }
            // デバッグ表示テキストが生成されていない場合
            if (debugText == null)
            {
                // デバッグ表示テキストを生成
                debugText = new GameObject("DebugText").AddComponent<Text>();
                // デバッグ表示キャンバスを親オブジェクトに
                debugText.transform.SetParent(debugCanvas.transform);
                // テキストの位置を中心に
                debugText.rectTransform.anchoredPosition = Vector2.zero;
                // テキストの最小端を左下に
                debugText.rectTransform.anchorMin = Vector2.zero;
                // テキストの最大端を右上に
                debugText.rectTransform.anchorMax = Vector2.one;
                // テキストの内容を設定
                debugText.text = debugTextString;
                // テキストのアラインメントを中心に
                debugText.alignment = TextAnchor.MiddleCenter;
                // テキストを BestFit に
                debugText.resizeTextForBestFit = true;
                // テキストの最大サイズを設定
                debugText.resizeTextMaxSize = 160;
                // テキストの色を設定
                debugText.color = debugTextColor;
            }
        }
        else
        {
            // デバッグ表示テキストが生成されている場合
            if (debugText != null)
            {
                // デバッグ表示テキストを削除
                DestroyImmediate(debugText.gameObject);
            }
            // デバッグ表示キャンバスが生成されている場合
            if (debugCanvas != null)
            {
                // デバッグ表示キャンバスを削除
                DestroyImmediate(debugCanvas.gameObject);
            }
        }
    }
}

このスクリプトを適当なGameObjectにアタッチすれば,デバッグモード時のみ UI を生成できます。

isDebug 変数の切り替えに合わせて UI が生成・削除されている画像
Hierarchy ウィンドウでオブジェクトが増減している

OnValidate()関数は,Play 時でなくとも Inspector 上の変更を検知して命令を実行します。

docs.unity3d.com

ただしオブジェクトの生成・削除はエラーとなるため,delayCallデリゲートを利用してタイミングを遅らせます。

docs.unity3d.com

以上,誤ってデバッグモードのまま公開しないための提案でした。

公開前に確認したい事項について,以下の記事もお読みいただけると幸いです。

tsu-games.hatenablog.com