Unityを使っていると、制作過程で必ずオブジェクトに対して「生成、表示・非表示、破壊」といった命令をC#スクリプトで行う機会があると思いますので、今回はこれらの実装方法について解説をしていきたいと思います。
ちなみに、オブジェクトを生成する際にはPrefab(プレハブ)の使い方も知っておく必要があるため、Prefabの使い方等も併せて解説します。
- Unityのオブジェクトを生成・表示・非表示・破壊させたい
- Prefab(プレハブ)の使い方の基本を知りたい
基本を知っていれば今回はそんなに難しい内容ではないと思います。
C#スクリプトからオブジェクトを操作する方法についても理解を深めていきましょう。
今は個人でも本格的なゲーム開発を行える環境が整いつつあります! 特に世界中のゲームクリエイターが使用しているのが、ゲーム開発エンジンのUnity。個人開発を行っているほとんどのクリエイターが使用しているとも言われている超 …
コンテンツ
UnityのC#スクリプトでオブジェクトを生成する
まずはUnityのC#スクリプトを使用してオブジェクトを生成する方法から解説します。
※実はこの後に出てくる表示や破壊よりも、これが一番大変だったりします。
オブジェクトを生成するといっても本当にゼロから生成する訳ではなくて、Prefab(プレハブ)として用意した素材テンプレートを、プロジェクトの中に取込んでオブジェクトとして生成する様なイメージになります。
オブジェクトを生成するための事前準備
ではさっそく生成するための準備をしていきましょう。
生成するオブジェクトをPrefab(プレハブ)として用意
生成するオブジェクトはゼロから作る訳ではなくて、Prefab(プレハブ)データとして準備をしておきます。Prefabについてはこれまでに詳しく紹介をしていなかったので、Prefabの作り方を解説します。
まずはPrefab化するための素材を用意します。ここではSphereオブジェクトを素材にしますので、Sphereオブジェクトを作成しておきましょう。ちなみにSphereオブジェクトの色は黒っぽい色に変更しています。
■Sphereオブジェクトを作成
※Sphereオブジェクトの作り方については以下を参考にして下さい。
3Dのボールを使って簡単なゲームアニメーションを作成しています。3DのボールはSphereオブジェクトで作成しているので、Sphereオブジェクトの作り方や色を塗る方法も紹介しています。
さて、次にSphereオブジェクトをProjectウィンドウに表示されているフォルダの中にドラッグ&ドロップしてコピーします。
■SphereオブジェクトをProjectウィンドウにドラッグ
ドラッグをしたら、一度HierarchyウィンドウにあるSphereオブジェクトを削除しておきます。
■Sphereオブジェクトを削除
今度は先ほどとは逆にPrefabをProjectウィンドウからHierarchyウィンドウにドラッグしてみて下さい。
そうすると、先ほどの黒いボールが画面上に表示されます。
■ProjectウィンドウからHierarchyウィンドウにドラッグ
オブジェクトの生成というのは簡単に言うとこの操作をC#スクリプトから実行するだけです。
管理用のオブジェクトを作っておく
これはオブジェクトの生成に限らず、よく使う方法なのですが、プロジェクト全体(ゲーム全体と言ってもOK)を管理するオブジェクトを作っておきます。
空っぽのオブジェクト生成して、C#スクリプトをアタッチしておき、そのオブジェクトからプロジェクト全体の管理を行うという考え方です。空っぽのオブジェクトは「GameObject」とデフォルトで命名されますが、よく「GameManager」という名前を付けられる事もあります。
空っぽのオブジェクトを作るため、Hierarchyウィンドウ→Createボタン→Create Emptyをクリックして下さい。
■Create Emptyをクリック
これだけの操作で空っぽのオブジェクトが作成されます。これは画面上に表示されるオブジェクトではなくて、ゲーム全体を管理するためのオブジェクトになります。このオブジェクトにC#スクリプトをアタッチしてゲームを管理します。
Instantiateでオブジェクトを生成
さて、いよいよオブジェクトを生成するコードを書いていきましょう。
Unityでオブジェクトを生成する場合はInstantiateというメソッドを使用するのが一般的です。Instantiateの使い方は簡単で引数としてPrefabを指定すれば、先ほど手動でPrefabをHierarchyウィンドウにドラッグした時と同じような処理を実施できます。
書き方としては以下の様になります。
Instantiate(オブジェクト変数名);
実際に例を見てみましょう。C#スクリプトで以下の様なコードを書きます。
■C#スクリプト
1 2 3 4 5 6 7 8 9 10 11 12 13 |
using System.Collections; using System.Collections.Generic; using UnityEngine; public class testmethod : MonoBehaviour { public GameObject obj; void Start() { Instantiate (obj); /*オブジェクトの生成 */ } } |
このC#スクリプトを先ほど作成した空っぽのオブジェクト「GameObject」にアタッチしてください。
■GameObjectにC#スクリプトをアタッチ
アタッチをしたら、GameObjectをクリックしてInspectorウィンドウを見てみると、C#スクリプトのコンポーネントが設定されています。そして、スクリプトの中で変数として設定した「Obj」が表示されているはずです。
Public変数として定義した変数は、この様にコンポーネント上でアタッチできる様になります。ここに元々用意しておいたPrefab素材をアタッチします。
■Public変数にPrefab素材をアタッチ
Prefab素材をアタッチしたら準備は完了です。
ゲームの実行ボタンを押してみましょう。Instantiateメソッドによって用意していたPrefabがゲーム画面上に生成されます。
■実行結果
実行するとPrefabがゲーム画面上に生成されます。
この場合はボールのPrefabをゲーム画面上に無事生成できている事が分かると思います。
Instantiate(オブジェクト変数名);
UnityのC#スクリプトでオブジェクトの表示・非表示をする
次にUnityのC#スクリプトを使用してオブジェクトの表示・非表示を行う方法を解説します。
表示・非表示の方法は非常に簡単で、先ほどの生成と同じ様にオブジェクト情報を取得して「表示・非表示」の命令を行うだけです。
「オブジェクト情報取得」⇒「オブジェクトに命令」という流れは今後もよく使う事になると思います。
オブジェクトの情報を取得
先ほどゲームの管理オブジェクトを作って、そこから別のオブジェクトを生成するという事をしましたが、今回も先程と同じ管理オブジェクト(GameObject)を活用しましょう。
この管理オブジェクトにアタッチされているC#スクリプトに表示・非表示の命令文を記述したいと思います。
今回は既に存在する別オブジェクトを操作するので、別オブジェクトの情報を取得して表示・非表示を行っていきます。
オブジェクトの非表示
非表示の方法から説明した方が分かりやすいので、まずはオブジェクトを非表示にする方法から紹介します。
先程オブジェクトを生成したものとは別にSphereオブジェクトを手動で作成しました。今回は青いボールにしました。このオブジェクトに対して、まずは手動で非表示にする方法から知っておきましょう。SphereオブジェクトのInspectorウィンドウを見てみると、一番上にチェックボックスがあると思います。
このチェックをON/OFFにするだけで表示・非表示の切替ができます。
■手動によるSphereオブジェクトの表示・非表示
ではC#スクリプトから非表示にするためのコードを書いていきます。
先程オブジェクトを生成した時にGameObjectにC#スクリプトをアタッチしていると思うので、ここにコードを追記しましょう。
オブジェクトを非表示にする時の記述方法は簡単で、以下の様に記述します。
オブジェクト変数.SetActive (false);
新たに、以下の変数とメソッドを追記して下さい。
■変数(既に変数が定義されている箇所に記述すればOK)
1 |
public GameObject obj2; |
■メソッド(Instantiateの下に記述すればOK)※ちなみに、Instantiateは一旦コメントアウトしています。
1 |
obj2.SetActive (false); /* オブジェクトの非表示 */ |
上記のコードを追記した状態で、新たに作成したオブジェクトをGameObjectの変数(obj2)にアタッチして設定します。設定方法は先程と全く同じです。分からない!という場合はオブジェクトの生成の流れをもう一度確認してみてください。
■ブジェクトをGameObjectの変数(obj2)にアタッチ
アタッチが完了したらゲームを実行してみましょう。
オブジェクトが非表示になっている事が分かると思います。また、SphereオブジェクトのInspectorウィンドウを見てみるとチェックがOFFになっているはずです。
■実行結果
Sphereオブジェクトが表示されていませんね。
オブジェクトの非表示に成功しました。
オブジェクト変数名.SetActive (false);
オブジェクトの表示
上記で非表示の流れが分かっていれば表示をするのは全然簡単です。先程とは逆の事をするだけですので。
今度はオブジェクトを手動で非表示にしておきましょう。非表示にする場合はInspectorウィンドウのチェックをOFFにすればOKです。
■SphereオブジェクトのInspectorウィンドウのチェックをOFF
ここからオブジェクトを非表示→表示にするコードを書いてあげればOKです。
非表示にする時はSetActive(false);と記述しましたが、表示にする場合はSetActive(true);と書き換えてあげます。
■C#スクリプト
1 |
obj2.SetActive (true); /* オブジェクトの表示 */ |
既にアタッチされているコードを書き替えているので、このまま実行すればオブジェクトが表示される様になります。
■実行結果
実際にコード書いてみると分かりますが、SetActiveに渡す変数を切り替えるだけで表示・非表示の命令を行う事ができます。
オブジェクト変数名.SetActive (true);
UnityのC#スクリプトででオブジェクトを破壊する
さて、ここまでくればオブジェクトを破壊するコードを書くのは簡単です。
上述している通り、まずオブジェクトの情報を取得して、破壊する命令を与えてあげればOKです。先ほどオブジェクトを表示・非表示した先に使用したSphereオブジェクトとC#スクリプトをここでも活用します。
破壊対象はSphereオブジェクトになります。Sphereオブジェクトが存在する事を確認しましょう。
■Sphereオブジェクト(中央の青いボール)
次にC#スクリプトで破壊するためのコードを記述します。
破壊するためのコードは以下の様になります。
Destroy(オブジェクト変数名);
先程使用した表示・非表示を行うメソッドを以下の様に書き換えます。
■C#スクリプト
1 |
Destroy (obj2); /* オブジェクトの破壊 */ |
実際に実行するとSphereオブジェクトが消えている事が分かると思います。
■実行結果
Destroy(オブジェクト変数名);
まとめ
今回はUnityでのオブジェクトの生成、表示・非表示、破壊について紹介しました。
- 生成→Instantiate(オブジェクト変数名);
- 表示→オブジェクト変数名.SetActive (true);
- 非表示→オブジェクト変数名.SetActive (false);
- 破壊→Destroy(オブジェクト変数名);
どのメソッドも対象となるオブジェクトを管理オブジェクトの変数として設定しておく必要になりますので、その点だけ注意が必要です。この考え方は制作過程で必ず必要になります。