はじめに
こんにちは。azarashin です。 読者の皆様の中にはこれからUnity を使ってみようという方もおられるのではないかと思います。 Unity ではC#という言語を使ってゲームを開発していくことになるのですが、その中でも使用頻度の高い基本機能がいくつかあります。 本記事ではこの基本機能の中でも特に使用頻度の高いGameObject について説明していきたいと思います。
GameObject とは
GameObject はUnity の画面内に登場します。 Unity の画面の中にHierarchy という欄があり、この欄の中に並んでいる要素一つ一つがGameObject です。
実際の開発ではこのHierarchy 欄にどんどん新しいGameObject を配置し、ゲームの構成要素を組み立てていきます。 GameObject を配置するにはHierarchy 欄で右クリックし、出てくるポップアップメニューから設置するGameObject を設置するのですが、 設置可能なGameObjectにはいくつかの選択肢があります。ここでは最も単純な要素である空のGameObject を配置する手順について紹介します。
空のGameObject を配置する
ポップアップメニューの中に"Create Empty"という項目があります。これを選択すると付属要素のないGameObject が生成されます。 このGameObject をクリックするとオブジェクト名を変更することも可能です。
このGameObject を操作して実際のゲームで制御するためにはC#というプログラミング言語を用いてプログラムを記述する必要があります。
プログラムを追加する
Unity のProject 欄で右クリックし、Create -> C# Script と選択することで、 新たにC#のプログラムファイルを作成することができます。
プログラムファイルを作成した直後、このファイルの名前を変更できる状態になっていますので、すぐにファイルの名前を変更してください。するとその名前と同じ名前のクラス(プログラムの塊のようなもの)がプログラムファイル内に生成されます。
このファイルをダブルクリックするとVisual Studioが起動し、 プログラムを作成できるようになります。 例えばファイル名をSamplePlayer とした場合、下記のようなコードが生成されているはずです。
using System.Collections; using System.Collections.Generic; using UnityEngine; public class SamplePlayer : MonoBehaviour { // Start is called before the first frame update void Start() { } // Update is called once per frame void Update() { } }
これがUnity のプログラムの初期構成になります。 続いてこのプログラムの意味について順番に説明していきます。
外部機能の取り込み
プログラムを記述する際、多くの場合は様々な外部のプログラムと連携しながら動作するプログラムを記述するのが一般的です。
using System.Collections; using System.Collections.Generic; using UnityEngine;
このように、'using' の後に取り込みたい機能群を記述すると、その機能群をこのプログラムで使用することができるようになります。この機能群をここでは「名前空間」と呼びます。 ここで記述したそれぞれの名前空間は大まかに下記のような機能群を提供してくれます。
名前空間名 | 提供される機能群 |
---|---|
System.Collections | 配列やリストといった基本的なデータ構造を扱うために必要な機能群。 |
System.Collections.Generic | ちょっと高機能なデータ構造を扱うために必要な機能群。 |
UnityEngine | Unity の機能を扱うために必要な機能群。Unity のプログラムを記述するときは必須。 |
クラス
クラスの宣言
public class SamplePlayer : MonoBehaviour
このように記述すると、SamplePlayer という名前のクラスを定義することができます。 クラスというのは一種のプログラムの塊のようなもので、属性や振る舞いを記述したものが列挙されていると考えてください。
継承
クラス名の後ろに ': MonoBehaviour' と記述されているのは「このクラスはMonoBehaviour というクラスを継承している」ということを意味します。 このMonoBehaviour というクラスはGameObject と同様にUnity では重要なクラスで、先ほど配置したGameObject にアクセスしたり、コンポーネントと呼ばれるUnity の様々な機能要素を扱うのに必須のクラスです。 (言い換えると、Unity の機能要素を直接扱わないようなクラスであればMonoBehaviour を継承する必要はありません。)
アクセス制限
あとこれはあまり最初は気にしなくても大丈夫ですが、class の先頭にpublic と記述することで他のクラスからこのSamplePlayer クラスを参照することができるようになります。 もし他のクラスから参照されては困るクラスの場合はclass の先頭に何もつけないか、先頭にprivate と記述すると外部からの参照を制限することができるようになります。 (参照が制限されているクラスを外部のクラスから参照しようとするとエラーが出ます。)
クラスの初期化
// Start is called before the first frame update void Start() { }
クラスにはメソッドと呼ばれるものを記述し、クラスの振る舞いを定義することができます。 (メソッドの説明についてはUnity というよりはC#の説明になりますので、本記事では説明を省略します。) このメソッドのうち、MonoBehaviourを継承したクラスではいくつか特殊なメソッドを扱うことができます。この特殊なメソッドの一つがStart です。Startメソッドではこのクラスの初期化処理を主に記述します。
描画ごとの処理
// Update is called once per frame void Update() { }
Unity に限った話ではありませんが、画面に何かを表示するプログラムではキャラクターの移動のような制御処理や描画処理を何度も繰り返し実行し、パラパラ漫画のように少しずつ表示内容を変化させることで画面に変化をもたらします。 これに対し、Update メソッドでは描画に必要な制御処理を記述します。
MonoBehaviour を使った具体的な作業内容
前述したようにMonoBehaviour というクラスを継承したクラスSamplePlayer ではMonoBehaviour の機能、すなわちGameObject へのアクセスやコンポーネントの使用が可能となります。今回はまず最も簡単な処理であるGameObject の有効・無効状態を切り替える処理を記述してみます。
先ほどのUpdate メソッドを下記のように記述します。
// Update is called once per frame void Update() { gameObject.SetActive(false); }
このように記述すると、SamplePlayer が割り当てられたGameObject に対してSetActive メソッドを呼び出し、このGameObject を無効(false)にすることができます。
このプログラムをUnity 上のオブジェクトに割り当てるには、Unity エディタ上でソースファイルをGameObject のInspector 欄にドラッグ&ドロップします。 今回は見た目が分かりやすいように、Hierarchy 上でCreate -> 3D Object -> Cube を選択し、立方体を生成します。この立方体GameObject にプログラムを割り当てます。
これで先ほどのSamplePlayer クラスがGameObject に割り当てられました。 早速Unity のプログラムを起動してみましょう。プログラムを起動するにはUnity エディタの再生ボタンをクリックします。
プログラムが起動すると、立方体が見えなくなっていることが確認できると思います。 今回はUpdate メソッド内でフレーム毎にGameObject を無効化しているため、 Unity Editor 上でこのGameObject のチェックボックスにチェックを入れようとしても チェックが入らない(有効にならない)ようになっています。
おわりに
今回はUnity の最初のステップであるGameObject の概要と簡単なプログラムの動かし方について説明しました。 この流れはUnity プログラミングでは頻出する内容ですので、しっかりとおさえて次につなげていきましょう。