BLOG

ブログ

【Unity】Unityを使用したWebコンテンツの作成

こんにちは!6月1日からマーベリックスの一員になり、少しずつ仕事と生活に慣れてきた内野澤です。

私の前職は「ゲームプログラマー」です。
ゲームのキャラクターをプレイヤーの操作に合わせて動くようにしたり、敵のAIを作成したり、プレイヤーがアイテムを選択するUI(ユーザーインターフェイス)を作成したりとガリガリとコーディングをしてきました。

今回はそんな「ゲームプログラマー」だった技術を「Webエンジニア」として活かせないか考え
ゲームエンジンである「Unity」を使用した「Webコンテンツ」の作成についてご紹介します。

Unityとは


Unityはユニティ・テクノロジーズ社が提供するゲーム開発プラットフォームで、2D・3Dゲームを簡単に作成できます。
使いやすさと多機能で知られ、幅広いプロジェクトに利用されています。
また、初心者でも扱いやすく、無料で活用できる点も魅力です。

Unityのセットアップ

・Unityアカウントを作成する

https://unity.com/ja
Unityの公式ページにアクセスし、右上の人型のアイコンから「Unity ID を作成」を選択して
メールアドレスや名前を入力してUnityIDを作成してください。

・Unityをインストールする

UnityIDを作成してサインインした後、上記画像の真ん中にあるダウンロードから「Unity Hub」をダウンロードして、インストールします。

「UnityHub」はバージョン別のUnityソフトウェアを一括管理するマネージャソフトウェアです。
インストールの際の設定がある場合は、すべてデフォルトで大丈夫です。

「Install Unity Editor」ボタンをクリックして、インストールします。
これで、UnityEditorがインストールできました!

UnityEditorでwebで表示したいコンテンツを作成

では、早速web上で表示したいコンテンツをUnityEditorで作成してみましょう!

・NewProjectを作成する

UnityHubを開き、NewProjectをクリック

最初に使用するテンプレートを選択します。
今回は、「3D(Built-in Render Pipeline)を使用しましょう!

UnityEditorが開いたら左の「Hierarchy」エリアで右クリックして
以下の手順でオブジェクトを追加してみてください。

  • 3D Object -> Plane で床を追加
  • 3D Object -> Cube で立方体を追加

床と立方体の位置を調整しておきます

  • HierarchyのPlaneを選択し、Positionを(0, 0, 0)に設定
  • CubeのPositionを(0, 1, 0)に設定
  • PlaneのPositionを(0, 0, 0)に設定

フィールドに平面と立方体を綺麗に並べることができました。
それでは、このアプリケーションを一旦Webページとして確認して見ましょう。

Webページで確認してみる

File -> BuildSettingを開きます

開いたウィンドウで以下の順番にビルドをしてみましょう!

①Add Open Scenesを使用して、開いているSceneをBuild対象に加えます。
②PlatformをWebGLに変更します
③Switch Platformボタンをクリックして、プラットフォームをWebGLに変更します

しばらく待つと、プラットフォームの切り替えが終わり、「Build And Run」が実行可能になります!
では、Build And Runを実行して見ましょう。
クリックすると、保存先を聞かれますので適当な保存先を指定してくださいね。
ビルドが終わると、自動的にローカルサーバーが起動し、ページが確認できます!

無事、Webページが開いたでしょうか?
UnityEditorで作成した画面がWebページ上で確認ができるようになりました!!

UnityコンテンツとWebページの連携

それでは、WebとUnityで作成したコンテンツを連携してみましょう〜!

連携するには?

Unity 側からWeb側のJavaScript を呼び出す方法は、以下の関数を使ってJavaScriptコードを起動することができます。

Application.ExternalCall();
Application.ExternalEval();

一方、ブラウザからJavaScriptを使ってUnity側のメソッドを呼び出すには、以下のコードを使用できます。
unityInstance.SendMessage ('MyGameObject', 'MyFunction', 'foobar');

こちらを使用して、WebページからUnityアプリケーションへの連携をしてみましょう。
ビルド結果を保存した箇所を確認すると、index.htmlが格納されています。

開いてみると、Unityアプリケーションを埋め込むコードが記載されていますね。
ここに、ボタンなどを設定してUnity側のコードを呼び出すようにすれば
WebページからUnityアプリケーションの操作が可能になりそうです!

Unity側にCubeの色を変更する関数を用意する

Assetsウィンドウで、右クリック→Create→Folderで新しいフォルダを作成します。
フォルダの名前は「Materials」にしてください。

Materialsフォルダに入り、右クリック→Create→MaterialでCubeに適用するマテリアルを作成します。
マテリアルとは、オブジェクトの色等の表示の設定を行う素材のようなものです。
マテリアルの名前は「CubeMaterial」とします。

CubeにCubeMaterialを適用します!
ドラッグ&ドロップでCubeMaterialをCubeに渡してください。
これで、Cubeの色を変更できるようになりました!

Webページから呼び出すUnity側の処理を実装する

いよいよ、コーディングです。
CubeオブジェクトにC#スクリプトを設定して色を変更する部分を作成します!

Scriptsフォルダを作成する

Assetsウィンドウで右クリック→Create→Folder
を実行し、新しいフォルダを作成し名前を「Scripts」としてください。

Cubeの色を変更するスクリプトを作成

Scriptsフォルダ内に入り、右クリック→Create→C# Script
を選択しスクリプトを作成します。
名前を「CubeColorChange」としてください。

CubeColorChange.csを開き
public class CubeColorChange
以下を下記のプログラムに書き換えてみてくださいね。

public class CubeColorChange : MonoBehaviour
{
    private MeshRenderer meshRenderer;

    // Start is called before the first frame update
    void Start()
    {
        meshRenderer = GetComponent<MeshRenderer>();
        
    }

    // Update is called once per frame
    void Update()
    {
        
    }

    public void ChangeColor(string str){
        if(str.CompareTo("red") == 0){
            meshRenderer.material.SetColor("_Color", new Color(255, 0, 0, 1));
        } else if( str.CompareTo("blue") == 0){
            meshRenderer.material.SetColor("_Color", new Color(0, 0, 255, 1));
        } else if( str.CompareTo("green") == 0){
            meshRenderer.material.SetColor("_Color", new Color(0, 255, 0, 1));
        }
    }
}

作成したCubeChangeColor.csをCubeへドラッグ&ドロップして、スクリプトをオブジェクトに設定します。

これで、Unity側の準備は完了です!
HTML側の実装を行いましょう。

HTML側にボタンを用意して、Unityアプリ側のCubeの色を変更する

さぁ〜WebページからUnityアプリケーションを操作できるのか
わくわくしてきましたね!今回は簡単に実装を行なってみます。

index.htmlを開いて10行目の<body >の下に以下のボタンテーブルを追加します。

<tr>
  <th><button type="button" id="btn_red" onClick='changeCubeColor("red")'>赤に変更</button></th>
  <th><button type="button" id="btn_green" onClick='changeCubeColor("green")'>緑に変更</button></th>
  <th><button type="button" id="btn_blue" onClick='changeCubeColor("blue")'>青に変更</button></th>
</tr>

script部分にボタンイベントを受け取る関数を追加します。

<script>
...
var myUnityInstance = null;
function changeCubeColor(msg){
    myUnityInstance.SendMessage("Cube", "ChangeColor", msg);
}
...
</script>

index.htmlの下部の方に以下と同様なコードがあるため
ここで、myUnityInstanceにUnityアプリのインスタンスを渡します。
コピペしても問題ありません!

     script.onload = () => {
        createUnityInstance(canvas, config, (progress) => {
          progressBarFull.style.width = 100 * progress + "%";
              }).then((unityInstance) => {
                myUnityInstance = unityInstance;

                loadingBar.style.display = "none";
                fullscreenButton.onclick = () => {
                  unityInstance.SetFullscreen(1);
                };
              }).catch((message) => {
                alert(message);
              });
            };

何をやっているのか?

index.htmlが開くと、createUnityInstanceが呼ばれUnityアプリケーションが起動します。
その開いたアプリケーションのインスタンスをmyUnityInstanceで保持しています。
用意したボタンをクリックするとchangeCubeColor関数が呼ばれ
myUnityInstance.SendMessageで、Cubeオブジェクトに追加したCubeColorChange.csのChangeColor関数にmsgを引数として実行しているという流れになります。

動作確認してみよう

ついに動作確認です!
Unityのメニューから、File->Build And Runを実行すると
完成したWebページが開きます

ボタンをクリックすると、アプリ内のCubeの色が変わります!

最後に

いかがでしたでしょうか?
今回はUnityとWebコンテンツの連携方法をご紹介しました。

Unityで作成できるコンテンツは主にゲームですが
例えば3Dビューアなども作ることができるので
Webからユーザが選択した情報をUnityに送信して、
Unity側でその情報を元に服や家具などのモデルを表示したり
可能性は色々広がりますね!

今回は簡単な連携を試してみました。
さらに高度な連携も可能なので、また続きを書いてみようと思います!

それではまた!

RELATED ARTICLE

  • この記事を書いた人
  • 最新の記事

satoshi-uchinosawa

ゲームプログラマとして10年以上を過ごし、2024年6月よりエンジニアとして入社しました! ゲームとキャンプ等のアウトドアが大好きです! 日々成長し、目標に向かって業務に携わっています!よろしくお願いします!