Pico VR開発スタートガイド

Web開発スキルを活かす:Unityでのコード記述入門(MonoBehaviourとコンポーネント構造)

Tags: Pico VR開発, Unity, MonoBehaviour, C#, ゲーム開発

Web開発の経験をお持ちのエンジニアの皆様、こんにちは。Pico VR開発スタートガイドへようこそ。

これまでWebサイトやアプリケーションを構築されてきた皆様にとって、3D空間でのインタラクティブな体験を生み出すVRゲーム開発は、新しい挑戦であると同時に、既存のスキルを活かせる領域でもあります。しかし、Web開発とは異なるUnity特有の概念や開発手法に戸惑うこともあるかもしれません。

特に、WebページがHTMLの構造とJavaScriptによるイベント処理、CSSによるスタイルで構成されるように、Unityでの開発においても、オブジェクトの構造やそれらを制御するコードの書き方には独特のルールがあります。この記事では、Unityでコードを記述する際の最も基本的なクラスである「MonoBehaviour」と、Unityの根幹をなす「コンポーネント指向」について、Web開発の知識と対比しながら解説します。

この記事を読むことで、Unityにおけるスクリプトの役割、GameObjectへのアタッチ方法、そしてアプリケーションの挙動を制御する基本的な「ライフサイクル」について理解を深めることができるでしょう。

Web開発とUnityの概念対比

まず、Web開発で慣れ親しんだ概念とUnityの概念を対比させてみましょう。

| Web開発 | Unity開発 | 説明 | | :--------------------------- | :------------------------------ | :------------------------------------------------------------------- | | HTML要素 (DOMノード) | GameObject | シーン内に存在する物体や概念を表す基本単位 | | CSSスタイル | Componentのプロパティ | GameObjectの見た目や振る舞いを設定する要素(例: MeshRenderer, Light) | | JavaScriptコード | Component (MonoBehaviourを継承) | GameObjectにアタッチして機能や振る舞いを記述するコード | | イベントリスナー/ハンドラ | MonoBehaviourのライフサイクルメソッド | 特定のタイミングで実行される処理(例: Start, Update, OnClick) | | DOMツリー | Hierarchy (親子構造) | GameObject間の階層構造 |

Web開発において、HTML要素にJavaScriptで記述した機能(イベントハンドラなど)を持たせることでインタラクティブな要素を実装します。Unityでは、この考え方が「GameObject」と「Component」の関係に非常に似ています。

Unityの基本構造:GameObjectとComponent

Unityシーンに配置されるすべての実体(キャラクター、カメラ、ライト、空のゲームオブジェクトなど)は、「GameObject」と呼ばれます。GameObject自体は単なる「入れ物」であり、それだけでは何も表示されたり動いたりしません。

GameObjectに機能や振る舞いを持たせるのが「Component」です。例えば、画面に表示されるメッシュデータは「Mesh Filter」コンポーネント、それをレンダリングする見た目(マテリアルなど)は「Mesh Renderer」コンポーネント、物理的な挙動を制御するなら「Rigidbody」コンポーネント、そしてカスタムのスクリプトで独自の処理を記述するなら「スクリプトコンポーネント」をGameObjectにアタッチします。

この「GameObjectに複数のComponentをアタッチして機能を組み合わせていく」という考え方が、Unityの根幹をなす「コンポーネント指向プログラミング」です。Web開発における、特定の役割を持つモジュールやライブラリを組み合わせてアプリケーションを構築する考え方に近い部分があるかもしれません。

MonoBehaviourとは

UnityでC#などのスクリプトを作成する際、ほとんどの場合、作成するクラスはMonoBehaviourクラスを継承します。

using UnityEngine;

public class MyCustomScript : MonoBehaviour
{
    // ここにコードを記述します
}

このMonoBehaviourクラスを継承することで、そのスクリプトはUnityのフレームワークと連携し、Unity特有の機能(例えば、transformプロパティで自身の位置や回転を取得・設定する、他のGameObjectやComponentにアクセスする、特定のタイミングでコードが実行される)を利用できるようになります。

作成したMyCustomScriptは、Unityエディタ上でGameObjectのインスペクターにドラッグ&ドロップすることで、そのGameObjectのComponentとして追加されます。これにより、スクリプト内の処理がそのGameObjectと関連付けられて実行されるようになります。

MonoBehaviourのライフサイクル

Web開発において、ページの読み込み完了時(DOMContentLoaded, window.onload)や、ユーザーのアクション(クリック、入力)、アニメーションフレーム要求(requestAnimationFrame)など、特定のタイミングでJavaScriptコードが実行されるのと同様に、UnityのMonoBehaviourにはあらかじめ定義された実行タイミングがあります。これらを「ライフサイクルメソッド」と呼びます。

主なライフサイクルメソッドは以下の通りです。これらはUnityエンジンによって自動的に呼び出されます。

これらのメソッドをMonoBehaviourを継承したクラス内に定義することで、そのタイミングで任意の処理を実行させることができます。

コード例:オブジェクトの回転

簡単な例として、GameObjectを毎フレーム回転させるスクリプトを作成してみましょう。

using UnityEngine; // Unityの機能を使うために必要

public class RotateObject : MonoBehaviour // MonoBehaviourを継承
{
    // 公開フィールド。Inspectorから値を設定できます。
    public float rotateSpeed = 50.0f; // 回転速度(度/秒)

    // Start()は、最初のフレームのUpdate()の前に一度だけ呼ばれます
    void Start()
    {
        // このスクリプトがアタッチされているGameObjectの名前をコンソールに出力
        Debug.Log("オブジェクト '" + gameObject.name + "' の回転を開始します。");
    }

    // Update()は、毎フレーム呼ばれます
    void Update()
    {
        // このスクリプトがアタッチされているGameObjectのTransformを取得し、回転させる
        // Time.deltaTimeは前回のフレームからの経過時間。これによりフレームレートに依存しない回転速度を実現
        transform.Rotate(0, rotateSpeed * Time.deltaTime, 0);
    }

    // オブジェクトが破棄されるときに呼ばれます
    void OnDestroy()
    {
        Debug.Log("オブジェクト '" + gameObject.name + "' が破棄されました。回転を停止します。");
    }
}

このスクリプトをUnityエディタで作成し、回転させたいCubeなどのGameObjectにアタッチします。ゲームを実行すると、そのCubeがY軸を中心に毎秒50度の速さで回転するようになります。rotateSpeedのようなpublicな変数は、UnityエディタのInspectorウィンドウから値を変更できます。

このように、MonoBehaviourを継承したスクリプトをComponentとしてGameObjectにアタッチすることで、シーン内のオブジェクトに独自の振る舞いを簡単に与えることができます。

まとめ

この記事では、Pico VR開発をUnityで始めるWebエンジニアの皆様に向けて、Unityの基本的なコード構造であるMonoBehaviourと、コンポーネント指向の概念、そして主要なライフサイクルメソッドについて解説しました。

これらの基本的な概念は、Pico SDKやUnityのXR Interaction Toolkitを使ったVR特有の機能実装においても土台となります。まずは簡単なスクリプトを作成し、GameObjectにアタッチして動作を確認してみることから始めてみてください。

次のステップでは、これらの基本構造を用いて、プレイヤーの入力に応じた処理や、オブジェクト間のインタラクションの実装方法などを学んでいくことになるでしょう。Pico VR開発の世界へようこそ。