オブジェクトの表示・非表示を操作する時,SetActive()
を実行するか enabled
を書き換えるかで悩む事はないでしょうか。
今回は,どちらの方法で操作するかを簡単に切り替えられる拡張メソッドを作りました。
本稿では,UI.Canvas を使って御説明いたします。
(Unity 2019.4.17f1)
はじめに
オブジェクトの表示・非表示にSetActive()
とenabled
のどちらを採るか,悩ましい問題だと思います。
SetActive()
は,GameObject
そのもののアクティブ状態を切り替える関数です。
対してenabled
は,GameObject
に含まれるコンポーネントの有効・無効を司る変数です。
オブジェクトの表示・非表示を操作するたびに,両方を試すのは大変ですよね。
そこで今回,これらを簡単に切り替える方法を考えました。
スクリプトの用意
まずは,拡張メソッド用のスクリプトを用意します。
これで,Unity 独自クラスであるBehaviour
にSetActiveOrEnabled()
というメソッドを追加できました。
次に,この拡張メソッドの使用例を挙げます。
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
ディレクティブで指定します。
これはShowHide
を拡張クラスとするうえで,静的(static
)にする必要があったためです。
/// <summary> /// SetActive() 実行と enabled 代入を Inspector 上で切り替える /// </summary> public static class ShowHide
次に表示・非表示方法を Inspector 上で切り替えるため,showHideMethod
を宣言します。
// 表示・非表示方法の切り替え
[SerializeField] ShowHideMethod showHideMethod = ExtensionShowHideMethod;
Inspector 上の変更を反映させるため,OnValidate()
メソッドを使用します。
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]