はじめに
ゲーム開発エンジンUnityでは、C#というプログラミング言語によってゲームオブジェクトに独自の役割を与えることができます。
今回はその最も根本的な部分となる、C#のクラスにスポットを当てて解説していきます!
スクリプトファイルとクラス
Unity ではメニューから C# Script としてスクリプトファイルを作成できます。
スクリプトファイルを作成すると、スクリプトファイルと同じ名前のクラスを作成することが出来ます。
特に最初のうちは、【スクリプトファイルを作成する = クラスを作成する】と考えておいて差し支えありません。
すでに書いたことがある方もいらっしゃるかと思いますが、 下記のようなプログラムの言葉をスクリプトファイル内に書くことができます。 これをクラスの定義をするといいます。 また、このようなプログラミング言語の文字列を「ソースコード」と呼びます。
<サンプル>
public class PlayerController : MonoBehaviour { public float moveSpeed = 5f; // Update is called once per frame void Update() { float horizontal = Input.GetAxis("Horizontal"); float vertical = Input.GetAxis("Vertical"); transform.position += new Vector3(horizontal, 0, vertical) * moveSpeed * Time.deltaTime; } }
最初に public class と書いてありますが、ここの右側に書いてあるのがクラスの名前です。 その下の { から最後の } までが、クラスの中身(定義)と呼ばれる部分になります。 (今回の記事はクラスの説明ですので、中身である変数やメソッドについては触れません。)
public class PlayerController // ← クラスの名前 { // クラスの中身(定義) }
このサンプルですと、PlayerController がクラスの名前になります。 つまり、PlayerController のスクリプトファイルを作る = PlayerController クラスを作るという作業を行っていることになります。
ではそもそも、クラスとはなんなのでしょうか? そしてどんなことが出来るのでしょうか? 順番に調べていきましょう。
Unityにおけるクラスとはどのようなものなの?
Unity のゲームオブジェクトには好きな名前を付けることができますが、あくまでもそれはラベルのようなものです。 例えば移動速度アップアイテムとして【SpeedUpItem】という名前のゲームオブジェクトがヒエラルキーにあったとしても、 名前を付けるだけでは移動速度アップの【効果を持つゲームオブジェクト】にはなりません。
このとき、ゲームオブジェクトに【移動速度アップアイテム】としての役割(効力)を与えるために、今回説明しているクラスが利用できます。
早速、新しく SpeedUpItem クラスを作成してみます。
public class SpeedUpItem : MonoBehaviour { // クラスの定義(中身)として、移動速度アップの効果を書いておく public float speedAmount = 10.0f; }
Unity では、作成したクラス(スクリプトファイル)はコンポーネントと同じようにアタッチすることが出来ます。 作成した SpeedUpItem クラスを同名のゲームオブジェクトにドラッグアンドドロップしてアタッチしてみましょう。
アタッチすることにより、クラスの中に書いてある内容を使って、ゲームオブジェクトの制御をしたり、役割を与えることができます。
SpeedUpItem ゲームオブジェクトにクラスが与えられることで移動速度の設定値が追加されました。
そうなんです。
クラスを作成することで、ゲームオブジェクトには新しい機能を追加していくことが出来るようになっているのです。 その結果、SpeedUpItem ゲームオブジェクトも先ほどまでとは違い、【移動速度アップアイテム】としての【役割】を持つことができました。
この記事では触れませんが、あとはこの役割をどうやってゲーム内で活用するかを考えて、プログラムを書いていきます。
どんな風に考えたらいい?
クラスを利用することでゲームオブジェクトの制御が出来るとお伝えしていますが、 制御という言葉で考えると単純に移動させたり、画像を変えたり、というイメージを持ちがちです。
ですが、クラスは他にも「ゲームオブジェクトに自分の考えている役割を与えて、 自分の考えているイメージ通りに動いてもらう」という形での活躍も出来ます。
あなたがもしも移動する敵をゲーム内に登場させたいのであれば、 MovingEnemy という名前をゲームオブジェクトを作ると同時に MovingEnemy というクラスも一緒に作成するようにしてみてください。
同じように、プレイヤーが乗ると落下する床をゲーム内に登場させたいのであれば FallingFloor という名前をゲームオブジェクトを作ると同時に FallingFloor というクラスも一緒に作成するようにしてみてください。
いかがですか?
クラスが Unity の中でどんなことをしてくれるのか、イメージは湧いてきましたか?
Scene ビューでジオラマを作って、クラスを使って動かす!
すごく端的に説明すると、見出しのようなことがクラスの目的になります。
Unity の Scene ビューにはドラッグアンドドロップして色々なゲームオブジェクトを配置出来ます。
ただしこれらはジオラマの状態ですので、ゲーム再生ボタンを押しても動き出すことはありません。
ここで先ほどのクラスの出番です。 移動制御のクラスを作成し、クラス内に移動制御をする機能を定義(記述)してから、Scene にいる女の子にアタッチします。 このクラスの定義により、女の子には【プレイヤーが制御できるキャラクター】としての役割が与えられます。 ここがポイントです。
同様に、敵役のゲームオブジェクトにも女の子を追跡するためのクラスを作成し、クラス内に女の子を見つけて追跡する機能を定義してからアタッチします。
そしてゲームを再生してみます。
ジオラマ状態のシーンに動きが生まれて、見事ゲームになりました!
まとめ
この記事のポイントをまとめます。
クラスはスクリプトファイルを作成することで作成できる。
クラスの中には変数やメソッドといった内容を定義(記述)できる。ここに定義した情報をゲームオブジェクトに新しい機能として与えることが出来る。
ゲームオブジェクトの名前はあくまでもラベル。実際に制御機能や役割を与えるには Unity の用意しているコンポーネントや、自分で作成したクラスをアタッチする必要がある。
ここまで理解できていれば OK です!
実際には自分で作成したクラスの中にゲームオブジェクトの制御や役割に応じたソースコードを記述することで、 先ほどの動画のような動きのあるゲームを作っていくことが出来ます。
例えば日本語であれば「女の子を見つけて追跡する」と1行で済んでしまうものも、プログラミングではそうはいきません。 そのため、自分のイメージしていることをゲームとして再現するためには、基礎から始めて、たくさんのプログラミングの処理を学習することがとても大切です。