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

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

【Unity】表示・非表示を SetActive で行うか enabled で行うか切り替える【拡張メソッド】

オブジェクトの表示・非表示を操作する時,SetActive() を実行するか enabled を書き換えるかで悩む事はないでしょうか。

今回は,どちらの方法で操作するかを簡単に切り替えられる拡張メソッドを作りました。

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

(Unity 2019.4.17f1)


はじめに

オブジェクトの表示・非表示にSetActive()enabledのどちらを採るか,悩ましい問題だと思います。

SetActive()は,GameObjectそのもののアクティブ状態を切り替える関数です。

docs.unity3d.com

対してenabledは,GameObjectに含まれるコンポーネントの有効・無効を司る変数です。

docs.unity3d.com

オブジェクトの表示・非表示を操作するたびに,両方を試すのは大変ですよね。

そこで今回,これらを簡単に切り替える方法を考えました。


スクリプトの用意

まずは,拡張メソッド用のスクリプトを用意します。

unity3d.com

これで,Unity 独自クラスであるBehaviourSetActiveOrEnabled()というメソッドを追加できました。

次に,この拡張メソッドの使用例を挙げます。

NewBehaviourScript.cs

using UnityEngine;
// UI を使用するため
using UnityEngine.UI;
// 拡張メソッドを使用するため
using static TsuGames.ShowHide;

public class NewBehaviourScript : MonoBehaviour
{
    // 表示・非表示方法の切り替え
    [SerializeField] ShowHideMethod showHideMethod = ExtensionShowHideMethod;
    // false ボタン
    [SerializeField] Button button0 = null;
    // true ボタン
    [SerializeField] Button button1 = null;
    // オブジェクト
    [SerializeField] Behaviour behaviour = null;

    void OnValidate()
    {
        // 表示・非表示方法の切り替えを反映
        ExtensionShowHideMethod = showHideMethod;
    }

    void Start()
    {
        // false ボタンを取得
        button0 = GameObject.Find("Button").GetComponent<Button>();
        // true ボタンを取得
        button1 = GameObject.Find("Button (1)").GetComponent<Button>();
        // false ボタン処理を設定
        button0.onClick.AddListener(() => behaviour.SetActiveOrEnabled(false));
        // true ボタン処理を設定
        button1.onClick.AddListener(() => behaviour.SetActiveOrEnabled(true));
        // 表示・非表示切り替え対象オブジェクトを取得
        behaviour = GameObject.Find("Button (2)").GetComponent<Behaviour>();
    }
}


解説

まずは拡張メソッドクラスであるShowHideを,using staticディレクティブで指定します。

docs.microsoft.com

これはShowHideを拡張クラスとするうえで,静的(static)にする必要があったためです。

/// <summary>
/// SetActive() 実行と enabled 代入を Inspector 上で切り替える
/// </summary>
public static class ShowHide

次に表示・非表示方法を Inspector 上で切り替えるため,showHideMethodを宣言します。

// 表示・非表示方法の切り替え
[SerializeField] ShowHideMethod showHideMethod = ExtensionShowHideMethod;

Inspector 上の変更を反映させるため,OnValidate()メソッドを使用します。

docs.unity3d.com

void OnValidate()
{
    // 表示・非表示方法の切り替えを反映
    ExtensionShowHideMethod = showHideMethod;
}
</font>


これで,UI.Button による表示・非表示切り替えが可能となりました。

<figure class="figure-image figure-image-fotolife" title="表示・非表示切り替えを Inspector 上で行っている例">[f:id:tsu_games:20210530200705p:plain:alt=Inspector 上の showHideMethod 列挙型を切り替えている画像]<figcaption>表示・非表示切り替えを Inspector 上で行っている例</figcaption></figure>


---
#おわりに

この拡張メソッドは,飽くまで製作中の補助機能として考えました。

`SetActive()`と`enable`のどちらが適切か分かった部分から,それぞれの命令に書き換えるべきかと思います。

以上,表示・非表示を`SetActive()`で行うか`enabled`で行うか切り替える拡張メソッドの御紹介でした。

Unity における似た処理を切り替える拡張メソッドは,他にも提案しております。

[https://tsu-games.hatenablog.com/entry/translate-or-position:embed:cite]

[https://tsu-games.hatenablog.com/entry/rotate-or-rotation:embed:cite]