Unityのオブジェクトの表示・非表示の切り替え方法を解説します。
オブジェクトの表示の切り替えは、「SetActive」というメソッドを使うことで簡単に実装できます。
私が調べてみたところ、表示→非表示の切り替えはとても簡単ですが、非表示→表示の切り替えは少しややこしくなっているので、思った通りに行かないかもと感じました。
そこで本記事では、非表示→表示の切り替えも理解できるようにまとめたのでぜひ学んでいってください。
なお、初心者の方でも使いやすいように、具体例のコードをコピペで使えるようにまとめています。
Unity オブジェクトの表示・非表示切り替え
オブジェクトの表示・非表示を切り替える方法を解説します。
はじめに表示→非表示の切り替え、そのあとに非表示→表示の切り替え方法について解説します。
オブジェクトを表示→非表示
オブジェクトを表示→非表示に切り替えるのは、数行のコードで実装できます。
表示→非表示には、SetActiveメソッドを使用します。
SetActive(bool値)
SetActive(true):オブジェクトを表示する
SetActive(false):オブジェクトを非表示にする
具体的には、以下のスクリプトのように使います。
Dキーを押すとスクリプトをアタッチしたゲームオブジェクトが非表示に切り替わるコードです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
using System.Collections; using System.Collections.Generic; using UnityEngine; public class TextDisplay : MonoBehaviour { void Update() { //[D]キーを押す if (Input.GetKeyDown(KeyCode.D)) { //ゲームオブジェクト表示→非表示 this.gameObject.SetActive(false); } } } |
スクリプト名「TextDisplay」←クラス名(スクリプト内)とスクリプト名を一致させることを忘れずに!
アタッチするゲームオブジェクトはActiveにしておくこと。(下図:緑)
アクティブな状態(ビュー内に表示されている)ゲームオブジェクトの読み込みはFindメソッドが使用できるので簡単に実装できます。
オブジェクトを非表示→表示
オブジェクトを非表示→表示への切り替えは、少し複雑です。
ゲームオブジェクトを非表示にしている状態では、スクリプト内でゲームオブジェクトを読み込むためのFindメソッドが使えません。
そのため、SerializeFieldを使用して、非アクティブなゲームオブジェクトをInspector内で事前に読み込んでおく必要があります。
<オブジェクトを非表示→表示にする>
・ゲームオブジェクトを非アクティブにする
・別のゲームオブジェクトを用意
非表示→表示の切り替え用スクリプトをアタッチするためのゲームオブジェクトを用意します。
今回は空のゲームオブジェクト「Director」を用意し、Directorを親オブジェクト、非表示のゲームオブジェクトを子オブジェクトにします。
・用意したゲームオブジェクトへ、以下のスクリプトをアタッチ
非アクティブのゲームオブジェクト(子オブジェクト)にアタッチされたスクリプトは読み込まれないので注意!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
using System.Collections; using System.Collections.Generic; using UnityEngine; public class TextDisplay : MonoBehaviour { [SerializeField] GameObject text; void Update() { //[D]キーを押す if (Input.GetKeyDown(KeyCode.D)) { //ゲームオブジェクト非表示→表示 text.SetActive(true); } } } |
スクリプトをアタッチするとInspector内でゲームオブジェクトを割り当てるボックスが追加されるので、非表示になっているゲームオブジェクトをドラッグ&ドロップ。
これで完了です。シーンをプレイして、Dキーを押すと、非表示になっているテキストが表示されます。
SetActiveを使用した具体例
SetActiveを使用したコードを具体例として紹介します。
オブジェクトの表示・非表示は、UIで使用することが予想されるので、すぐ使えそうな機能を実装してみました。
ちなみに、SetActiveでゲームオブジェクトを非表示にした後もう使わない場合は、Destroyメソッドで削除する方が負荷が軽くなるので推奨です。
1秒おきにテキストを点滅させる
1秒おきにテキストを点滅させて、強調することができます。
制限時間が少なくなったときや、目立たせたい部分に利用できるかと思います。
<1秒おきにテキストを点滅させるコード>
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
using System.Collections; using System.Collections.Generic; using UnityEngine; public class TextDisplay : MonoBehaviour { float time=0.0; void Update() { time += Time.deltaTime; if(time> 1) { if (this.gameObject.activeSelf == false) { this.gameObject.SetActive(true); time = 0; } else { this.gameObject.SetActive(false); time = 0; } } } } |
↑は点滅させたいゲームオブジェクトへアタッチするだけでOK。
スクリプト名とスクリプト内のクラス名を一致させるところだけ注意です。
テキストにアタッチするとこんな感じ。(動画をGif化したため1秒間隔じゃないので注意。Unity上では1秒おきに点滅します)
制限時間が経過したらテキストを表示する
制限時間が経過したらテキストを表示する機能です。ゲームクリアのときや、ゲームオーバーのときにテキストや画像を表示することで、クオリティアップできるかと思います。
<制限時間が経過したらテキストを表示するコード>
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
using System.Collections; using System.Collections.Generic; using UnityEngine; public class TextDisplay : MonoBehaviour { [SerializeField] GameObject text; float elapsedtime=0; float timeLimit = 5; //制限時間:5秒 void Update() { elapsedtime += Time.deltaTime; //経過時間 if (timeLimit < elapsedtime) { text.SetActive(true); } } } |
動かしてみるとこんな感じ。これはSliderを使用した例です。
SetActiveはゲーム作成、アプリ作成に必須なメソッドなのでぜひ使えるようにしておきましょう!
最後まで読んでいただきありがとうございました。