Unity ✖️Node.jsを導入してみた

「Unityに対してサーバサイドをクラウド上に作ってみたい」と思い、Node.jsとUnityを繋げてみました。

Unity側で主に使ったのはUnityWebRequestです。Unityだけの記事は結構あるのですが、サーバと合わせて書いてあるのは見当たらない感じがしたので、両サイドを書いていきます。

Node.js、javascriptは今回初めて触った超初心者なので、お手柔らかにお願いしますm(_ _)m

環境

Unity側

macOS Catalina 10.15.6

Unity 2018.4.19.f1

サーバ側

Linux (ubuntu 18.04)

node.js version v10.22.0

npm version 6.14.6

サーバサイドの補足

サーバOSは以下の記事を参考にAzureで建てました。

注意する点は、パブリック受信ポートでsshだけでなく、http、httpsも開く点です。既存のVMでhttpが開いていないと、ローカルでしか動かない(つまり、サーバとして機能しない)ことになっちゃいます。

また、使用するport(今回は3001)を開くことも忘れないでください。Azureの場合、ネットワーク→受信ポートの規則を追加する ボタンを押せば設定できます。

Unity側の設定

Unity側はいろんな記事があるので軽く流します。参考にさせてもらったのは以下の記事のUnityからHTTPにPOST接続する方法の部分です。

ほぼ一緒のコードではありますが、僕が使ったコードも載せておきます。

<SendDataToServer.cs>

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Networking;
using UnityEngine.UI;
public class SendDataToServer : MonoBehaviour
{
   public string iPAdress;
   public string port;
   public Button sendButtnn;
   // Start is called before the first frame update
   void Start()
   {
       sendButtnn.onClick.AddListener(onClickSendButton);
   }
   private void onClickSendButton()
   {
       string URL = "http://";
       URL += iPAdress;
       URL += ":";
       URL += port;
       URL += @"/";
       Debug.Log("Server URL = " + URL);
       StartCoroutine("OnSend", URL);
   }
   //コルーチン
   IEnumerator OnSend(string url)
   {
       //POSTする情報
       WWWForm form = new WWWForm();
       form.AddField("name", "taro");
       form.AddField("ID", 77);
       //URLをPOSTで用意
       UnityWebRequest webRequest = UnityWebRequest.Post(url, form);
       //UnityWebRequestにバッファをセット
       webRequest.downloadHandler = new DownloadHandlerBuffer();
       //URLに接続して結果が戻ってくるまで待機
       yield return webRequest.SendWebRequest();
       //エラーが出ていないかチェック
       if (webRequest.isNetworkError)
       {
           //通信失敗
           Debug.Log(webRequest.error);
       }
       else
       {
           //通信成功
           Debug.Log(webRequest.downloadHandler.text);
       }
   }
}

このスクリプトをgameobjectにアタッチし、ボタンをドロップします。

またアタッチしたgameobjectにサーバ0SのIPアドレスとportを入力します。

次に、サーバ側を作って行きます。

サーバ側

サーバサイドのコマンドに移動し、ファイルを置くフォルダまで移動します。(コマンドは移動:cd、フォルダ作成:mkdirです)

移動したら、nano 等のテキストエディタを開くコマンドを叩きます。

<コマンドの例>

mkdir nodejs
cd mkdir
nano

テキストエディタを開いたら、以下のjsコードを書き(またはコピペし)ます。

<server.js>

const http = require('http');
const PORT = 3001;
http.createServer(function(req, res) {
 if(req.method === 'GET') {
   console.log('Hello World\n');
 } else if(req.method === 'POST') {
   var datas = '';
   var dataList = [];


  //POSTデータを受けとる
  req.on('data', function(chunk) {datas += chunk})
     .on('end', function() {
       dataList = datas.split('&')
       res.writeHead(200, {'Content-Type': 'text/plain'});
       res.end('Succeded to receive ' + datas);
       dataList.forEach(function( data ) {
          console.log( data );
          });
     })
  }
}).listen(PORT);
console.log(`Server running. Port is ${PORT}`);

書き終わったら、

control+x → Y → ファイル名(server.js)を入力 → Enter

で元のコマンドに戻ると思います。

javascriptのコードについては、以下の記事を参考にしました。


最後に、以下のコマンドでserver.jsを起動します。

sudo node server.js

結果

Unityの再生ボタンを押し、ドロップしたボタンをクリックして動作確認してみましょう。

Unity側

以下のログが出たら成功です。

Succeded to receive name=taro&ID=77

サーバ側

以下のログが出たら成功です。データがうまく送信できているのがわかります。

Server running. Port is 3001
name=taro
ID=77

いいなと思ったら応援しよう!