[Unity / ROS2 / Windows] 【公式準拠】WSL2 上で Unity-Robotics-Hub を使って ROS2 通信する

# 1. 概要

以下のような記事です(\*´ｖ｀)

- `Unity` を初めて触るITエンジニアが、Windows WSL2 で `Unity-Robotics-Hub` を試してみた
- Unity の`公式ツール`及び`公式手順`を利用
- 環境構築には `docker` を使用
- 高速と言われている `ROS` 通信の中でも、 `ROS2` を使う

他にも類似記事はありますが、この記事は「**余計なものを一切インストールせず**に、**公式手順に沿った最低限のものをインストールする手順を知りたい**」という方にとって嬉しい内容になっていると思います。

## 補足

「5. 関連記事」の [3. ros2-for-unity-について](#3-ros2-for-unity-について) で少し触れているのですが、どうやら、「Unity-Robotics-Hub」よりも 3rd パーティツールの「ros2-for-unity」の方が速度面では有利？と言われています。
速度をゴリゴリに重視したい人は「ros2-for-unity」を使っていただいた方が良いのかもしれません|qд･,,)...


# 2. イメージ

## 2-1. 通信のイメージ図

正確ではないかもしれませんが、概ねこのようなネットワーク構成になるように目指します。

```mermaid
graph TD
    subgraph Windows
        Unity[Unity Editor]
        WSL2[WSL2]
    end

    subgraph WSL2
        Docker[Docker Container<br>Unity-Robotics-Hub]
    end

    Unity -- TCP/UDP --> Docker
```

## 2-2. 作業完了後の動作イメージ

以下のような動作を確認できます。

![250504_unity_ros2_demo.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/327407/92ac6a35-6445-405c-a60b-8f4da4155032.gif)

実は、ロボットや固定の置物は Unity のチュートリアルで自動生成できるのですが、今回チャレンジするデモでは、**宙に浮いているブロックの位置や姿勢の情報**が `ROS2` 経由で `Unity-Robotics-Hub` へと送信されていることを確認することができます。

ここまで頑張っていきましょう！(\*˘︶˘\*)


# 3. 前提

## 3-1. 対象者

「**Unity を全く触ったことがない**」というシステムエンジニア向けの記事です。
Linux コマンドや Docker の扱いにはそこそこ慣れている前提で記事が書かれています。
一方、 Unity に関する知識はゼロという前提なので、 Unity 周りの操作はウザイくらいに細かく手順を記載しています。


## 3-2. 実行環境

私が各作業を実施した環境です。

Tool | Version
--|--
OS | Windows 11 Home
Windows | 24H2
プロセッサ (CPU) | AMD Ryzen 7 4700U with Radeon Graphics 2.00 GHz
WSL | 2


## 3-3. Dependencies

WSL 上に以下の package をインストールしておく必要があります。

- git
- docker

これらのインストール方法は割愛します。


# 4. 手順

## 4-1. Unity インストール

Unity インストール済みの人は、「[2.]()」へ飛んでください( \*¯ ꒳¯\*)✨

<details><summary>Unity のインストール手順を見る</summary>

### インストーラのダウンロード

以下の公式サイトにアクセスすると、

https://unity.com/ja


以下のような画面が現れますので、真ん中の「ダウンロード」をクリックしましょう。

![スクリーンショット 2025-05-03 202537.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/327407/c6ffabd3-59a1-49cd-bff2-ff66e5fb62de.png)

次に「DOWNLOAD FOR WINDOWS」をクリックします！

![スクリーンショット 2025-05-03 202551.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/327407/fd3368a9-2adf-4592-9792-d0e99eb5c7d4.png)

すると、`UnityHubSetup.exe` というファイルがダウンロードされます。

### Unity インストール

downloadした `UnityHubSetup.exe` を実行しましょう！
実行すると以下のような window が現れます。

![スクリーンショット 2025-05-03 202902.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/327407/acb02cdc-2ba8-4e1e-bf1d-73852a203321.png)

同意すると、以下の画面に切り替わります。
「インストール」をクリックしましょう。

![スクリーンショット 2025-05-03 202915.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/327407/bcbc825f-4ca4-499d-bcaf-8f50c2c84c92.png)

待ちます...c(⌒(_\*˘ㅿ˘)_ｽﾔｧ

![スクリーンショット 2025-05-03 202924.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/327407/becbb08d-8abf-4603-b1cb-090db378853b.png)

「Unity Hub を実行」と書かれたチェックボックスをオンにしたまま「完了」ボタンをクリックすれば、Unity が起動されます。

![スクリーンショット 2025-05-03 202935.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/327407/6511f2fb-b4a6-4cbb-ad9a-443ba21524a2.png)

</details>

## 4-2. Unity の基礎セットアップ

「アカウント作成」と「Unity Editor」のインストールを行います！
これらが済んでいる方は、次の「[3.]()」へ移動してください。

<details><summary>Unity の基礎セットアップ手順を見る</summary>

Unity を起動したところ、「Sign in」と書かれたボタンが現れました。
Unity のソフトウェアを使うためには、アカウントが必要なようです。

「Create account」からアカウントを作成します。

![スクリーンショット 2025-05-03 203750.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/327407/986e5b1b-c14c-490d-9202-2285e2013999.png)

アカウントを作成したら、今度は「Sign in」ボタンをクリックします。
今度は「Unity Editor」のインストール画面が現れます。「Install Unity Editor」と書かれたボタンをクリックします。

![スクリーンショット 2025-05-03 204551.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/327407/8772ae68-51ba-40a2-9b54-ad7cc1719287.png)

「Agree」！

![スクリーンショット 2025-05-03 204600.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/327407/01e0521d-76a3-4f29-a8d5-5f6ca116b87f.png)

Unity Editor のインストールが始まります。
**注意：UAC:ユーザーアカウント制御のポップアップが出てきたら適宜承認**して下さい。

![スクリーンショット 2025-05-03 204824.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/327407/4a4baa93-1b6c-4863-a342-0ff45403aba1.png)

このインストール、結構時間がかかります！( \*｀ω´\*) ≡3≡3ふんす！

私の場合は、10～20分くらいかかった気がします。もしかしたら、気長に待つ必要があるかもしれません（ネットワーク環境次第か？）

![スクリーンショット 2025-05-03 205848.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/327407/058038c5-8cf3-4ed9-b039-f972efe9eae2.png)

上記のように、「Install complete」と表示されれば、インストール完了の合図です！

</details>


## 4-3. Unity-Robotics-Hub の準備 (In WSL)

ここまでは Windows の UI 上での作業でしたが、この項目では、**WSL 内で作業**をしていきます。

以下の Unity 公式の GitHub のドキュメントに従って作業していきます。

https://github.com/Unity-Technologies/Unity-Robotics-Hub/blob/main/tutorials/ros_unity_integration/setup.md#-unity-setup

まず、 `Unity-Robotics-Hub` のリポジトリをクローンします。

```bash:WSL 内で実行
# repository をクローン
$ git clone https://github.com/Unity-Technologies/Unity-Robotics-Hub.git

# Dockerfile のあるディレクトリへ移動
$ cd Unity-Robotics-Hub/tutorials/ros_unity_integration

# Docker image 作成
$ docker build -t foxy -f ros2_docker/Dockerfile .

# Docker コンテナ起動
$ docker run -it --rm -p 10000:10000 foxy /bin/bash

# コンテナ内で、 Unity-Robotics-Hub のサーバを起動
root@c1630e8588aa:/home/dev_ws# ros2 run ros_tcp_endpoint default_server_endpoint --ros-args -p ROS_IP:=0.0.0.0

# 実行結果
[INFO] [1746270912.834092684] [UnityEndpoint]: Starting server on 0.0.0.0:10000
```

`[INFO] [1746270912.834092684] [UnityEndpoint]: Starting server on 0.0.0.0:10000` のようなメッセージが現れれば、ひとまず「4-3.」は成功です。


## 4-4. Project の作成

ここからは、 Windows UI 側での操作です。

Unity におけるもっとも大きな管理対象は `Project` と呼ばれているようです。
そのプロジェクトの中に、物体やキャラクター、音声などが作成されます。

「4-4.」では、この最も基本的な単位である `Project` を作成します。
作成済みの方は「4-5.」へスキップして下さい。

<details><summary>Unity Project 作成手順を見る</summary>

まず、「New project」をクリックします。

![スクリーンショット 2025-05-04 191351.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/327407/d92c4627-6759-481e-9437-5f0e92d1ccf7.png)

次に、どれか一つ template を選択して、「Download template」を選択します。
私は、一番基礎のチュートリアルが入っていそうな、「Get Started With Unity」を選択してダウンロードしました。

![スクリーンショット 2025-05-04 191528.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/327407/efc2cf1c-a8ec-4d73-af61-4e74fae57dd0.png)

「Projet name」の欄は自由に変えられるようなので、これを更新して、「Create project」をクリックします。

![スクリーンショット 2025-05-04 191938.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/327407/1d2a90da-2060-4a49-b9c9-9a59bb6a96df.png)

すると、Project 作成が始まります。
ちょっとカッコイイロゴと、プログレスバーが表示されます（赤色矢印の先がプログレスバー）

![スクリーンショット 2025-05-04 192219.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/327407/b6fe8f8e-19be-458a-87be-75b811b72486.png)


地味に待ち時間が長いですが、しばらくすると、以下のように Get started With Unity と書かれたポップアップウィンドウが現れました。これは選んだ template によって違うと思いますが、これで Project 作成は成功です。

![スクリーンショット 2025-05-04 192805.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/327407/7b860674-7361-4bdd-864c-c94f65dbe84f.png)

ちなみに、「Start the tour」をクリックすると、 Unity のチュートリアルを受けることができます。すぐに終わるので、初めて Unity に触る人は見ておいて損はないと思います。

</details>


## 4-5. ROS2 通信用のセットアップ

「4-3」起動した `Unity-Robotics-Hub` のサーバに対して、 Unity からアクセスできるようにします。

GitHub の以下のリンク先の記載に従って、ROS2 通信を行うために、 Unity 側の設定を行います。

https://github.com/Unity-Technologies/Unity-Robotics-Hub/blob/main/tutorials/ros_unity_integration/setup.md#-unity-setup

私の場合、 Version が変わっていたのか、GitHub のドキュメントとは若干差異がありました。


### 4-5-1. ROS-TCP-Connector のインストール

ROS 通信を行うためのモジュールである、 `ROS-TCP-Connector` を git を利用して Unity 内に install します。
以下の添付画像の通り、メニュー内の「window」-->「Package Management」-->「Package Manager」の順にクリックしてください。

![スクリーンショット 2025-05-04 195559.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/327407/112c0f40-fbd0-43d0-ba16-a2fa4fd397cc.png)

すると、次の画像のようなポップアップメニューが現れますので、やはり画像の通り、「+」ボタン -->「Install package from git URL ...」の順にクリックしてください。

![スクリーンショット 2025-05-04 195803.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/327407/1c99042d-15a4-42d7-92f2-d930df971b9d.png)

次に、「Install package from git URL」というテキストの下にある入力フォームに、[公式ドキュメント](https://github.com/Unity-Technologies/Unity-Robotics-Hub/blob/main/tutorials/ros_unity_integration/setup.md#-unity-setup) に記載されている通り、 `https://github.com/Unity-Technologies/Unity-Robotics-Hub/blob/main/tutorials/ros_unity_integration/setup.md#-unity-setup` と入力し、「install」ボタンをクリックします。（以下の画像を参照）

![スクリーンショット 2025-05-04 195827.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/327407/ffd81bd9-8a7a-49b5-bbd3-8ca41bd4d5dc.png)

すると、以下のように待機中のメッセージやプログレスバーなどが表示されますが...

![スクリーンショット 2025-05-04 195849.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/327407/72746b3a-0648-4939-87e9-904f04837008.png)

![スクリーンショット 2025-05-04 195858.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/327407/d165ad4f-7255-4cd3-b343-91f4d853892e.png)

やがて、以下のように「ROS-TCP-Connector」という表示が現れます。

![スクリーンショット 2025-05-04 195947.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/327407/b82ce104-c789-4c8c-bdcc-c91ecdcb2749.png)

これで、「4-5-1. ROS-TCP-Connector のインストール」は完了です。

### 4-5-2. ROS 通信の設定

引き続き Unity の UI 画面から設定の変更を行っていきます。
以下の画像の通り、「Robotics」-->「ROS Settings」の順にクリックしていきましょう！

![スクリーンショット 2025-05-04 200044.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/327407/5ea88068-6dd9-4079-ab66-f46a04aec9fc.png)

すると、以下のようなウィンドウが現れますので、「**Protocol**」を「**ROS2**」に変更します。
今回は docker で ROS-Robotics-Hub を構築しているので、それ以外の変更は不要です。

![スクリーンショット 2025-05-04 202755.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/327407/871cfd2c-bf72-4cad-b947-21f75191da2a.png)

プルダウンを「ROS2」に変更したら、「ROS Settings」はもう「x」ボタンで閉じてしまって大丈夫です。


## 4-6. デモによる動作確認

ここまでの設定が全て正しく行えているかを確認するため、デモプロジェクトを用意して動かしてみます。楽しみですね！(\*>ᴗ<\*)

### 4-6-1. デモのインストール

今度は UI ではなく、 WSL の中での操作になるので、コマンドをぽちぽちしていきます。

項目としては、以下のリンク先の「Install Unity Robotics Demo」の作業を進める形になります。

https://github.com/Unity-Technologies/Unity-Robotics-Hub/blob/main/tutorials/ros_unity_integration/setup.md#install-unity-robotics-demo


ここからはちょっと、WSL や docker の操作に慣れていないと難易度高いかもですが、頑張りましょう(; ･`д･´)

まず、 Docker コンテナの中に入ります。
以下の、「1. Docker コンテナを起動する」か「2. Docker コンテナ内へアクセスする」のうち、どちらかのみを実施します。

```bash:WSL 内で実行
# Dockerfile のあるディレクトリへ移動
$ cd Unity-Robotics-Hub/tutorials/ros_unity_integration

# ----------- 1. Docker コンテナを起動する（起動前の場合） -----------
$ docker run -it --rm -p 10000:10000 foxy /bin/bash

# ----------- 2. Docker コンテナ内へアクセスする（起動済の場合） -----------
# 起動されているコンテナ名を確認
$ docker container ls
CONTAINER ID   IMAGE     COMMAND                  CREATED         STATUS         PORTS                                           NAMES
e960f81518b9   foxy      "/ros_entrypoint.sh …"   4 minutes ago   Up 3 minutes   0.0.0.0:10000->10000/tcp, :::10000->10000/tcp   hardcore_johnson

# 確認した Name のコンテナへアクセス
$ docker exec -it hardcore_johnson /bin/bash

# 結果
root@e960f81518b9:/home/dev_ws# 
```

上記のように、`root` アカウントでコンテナ内へログインできていれば、ここまで成功です。
次は、ディレクトリ位置はそのまま変更せずに、 `colcon build` と `source install/setup.bash` を実行します。


```bash:Docker コンテナ内で実行
root@e960f81518b9:/home/dev_ws# colcon build
Starting >>> ros_tcp_endpoint
Starting >>> unity_robotics_demo
Starting >>> unity_robotics_demo_msgs
Finished <<< ros_tcp_endpoint [1.35s]                                                                                                
Finished <<< unity_robotics_demo_msgs [1.33s]
Finished <<< unity_robotics_demo [1.36s]

Summary: 3 packages finished [1.65s]
root@e960f81518b9:/home/dev_ws# source install/setup.bash
```

`source install/setup.bash` を実行しても何も起きませんが、これで成功のようです。

次は UI から Unity を操作していきます。
まず、以下のように「Robotics」-->「Generate ROS Messages..」の順にクリックしましょう(\*´ｖ｀)

![スクリーンショット 2025-05-04 210404.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/327407/25659b83-1161-49ea-a9ef-378658c9ae44.png)

次に、以下の画像に表示されている「ROS message path」の部分に WSL の中にあるディレクトリである、 `tutorials/ros_unity_integration/ros_packages/unity_robotics_demo_msgs` ディレクトリへのフルパスを記載する必要があります。これがちょっと難しいですが、集中していきましょう。

![スクリーンショット 2025-05-04 212956.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/327407/30888f34-de3c-4b73-a47f-2f007b518931.png)

「ROS message path」の横の「Browse」ボタンをクリックしてください。
そうすると、以下のような Windows のエクスプローラが起動します。

![スクリーンショット 2025-05-04 212126.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/327407/14c5ba1a-0547-4d16-b9c5-b4d1eef791b3.png)

ここでヒントなのですが、 **Windows UI 側から WSL 内のディレクトリにアクセスする方法**は以下の記事に書かれているのですが、パス入力の際に `\\wsl$` を先頭に渡すとよいです。

https://zenn.dev/o2z/articles/zenn-20210622_wsl_directory

具体的にどうするかというと、一つ上の画像において赤丸で囲んだパス入力欄に、 `\\wsl$` と入力して Enter キーを押下します。すると、以下のように、あなたの WSL に用意されている Linux Distribution の名前が表示されると思います。

![スクリーンショット 2025-05-04 212151.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/327407/febe1ea8-641a-4c29-a935-fc3ff841791e.png)

上記のような状態になったら、今回使用している Linux を選択してダブルクリックすると、もうそこは WSL の中のディレクトリになっています。
あとは、 `tutorials/ros_unity_integration/ros_packages/unity_robotics_demo_msgs` ディレクトリまでたどって、「フォルダーの選択」ボタンをクリックすればOKです！

ちなみにですが、私の場合は「フォルダーの選択」をクリックしたところ、以下のようなパスになりました。

`\\wsl.localhost\Ubuntu/home/user_name/unity_dev/Unity-Robotics-Hub/tutorials/ros_unity_integration/ros_packages/unity_robotics_demo_msgs`

あとは、以下の画像の通り、「unity_robotics_demo_msgs」の横の三角、その下の三角を順にクリックし、その後、「Build 2 srvs」「Build 2 msgs」をクリックしましょう。

![スクリーンショット 2025-05-04 210915.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/327407/d92b4c1d-73b2-444f-8026-d431e493dad9.png)

すると、以下の画像のように Unity のプロジェクト画面の Project タブ - Assets 以下に、「RosMessages/UnityRoboticsDemo/msg」などが生成されています。

![スクリーンショット 2025-05-04 211111.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/327407/5edf2ce9-79e1-4fd8-b727-f9c697d71eb5.png)

これで、ここまでの操作が成功していることが確認できます。

### 4-6-2. Publisher によるデモ動作確認

ここまでお疲れさまでした( \*¯ ꒳¯\*)✨
遂にデモ動作の確認です！

引き続き、公式 GitHub ドキュメントの以下の手順に従ってやっていきます。

https://github.com/Unity-Technologies/Unity-Robotics-Hub/blob/main/tutorials/ros_unity_integration/publisher.md

上記リンク先の「Setting Up」は既にこれまで実施してきているので、そこはスキップしましょう。

ここでは、「GameObject の位置と姿勢を publish する」ということをやるようです。何が起きるのか楽しみですね|･`ω･´)

ここからの操作も、 Unity の Project の UI 画面から行っていきます。

#### 4-6-2-1. C# ソースコードの作成

まず空のファイルを作成します。
以下の画像のように「Assets」-->「SourceFiles」-->「Scripts」を開いた状態で、「`RosPublisherExample`」という空のファイルを追加します。

![スクリーンショット 2025-05-04 215807.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/327407/5c2314ed-6471-4168-983d-65b110ac0ffb.png)

ファイルの追加は以下のように行うことができます。
ファイルを追加したいディレクトリの中で右クリックし、「Create」-->「Scripting」-->「Empty C# Script」をクリックすると、空のファイルが作成されます。あとは、ファイル名を `RosPublisherExample` へと変更しましょう。

![スクリーンショット 2025-05-04 215521.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/327407/2629dc31-2a89-4936-a350-ebb6a249a7a3.png)

次に、このファイルの中身を編集します。
以下のように、ファイルを右クリックして「Open」をクリックすると、お使いのエディタ上にファイルが開かれます。

![スクリーンショット 2025-05-04 215727.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/327407/146e06e6-3665-4577-afe6-261c2ac23275.png)

ファイルが開かれたら、中身の文字列を消して空ファイルにし、その後、 `Unity-Robotics-Hub` のドキュメントに記載されている [RosPublisherExample.cs のコード](https://github.com/Unity-Technologies/Unity-Robotics-Hub/blob/main/tutorials/ros_unity_integration/publisher.md#create-unity-publisher) をコピーしてきて貼り付けます。

これを保存すれば OK です。

#### 4-6-2-2. 回転体オブジェクトの追加

デモで操作対象になる `Cube` というオブジェクトを Unity のプロジェクトに追加します。
以下のようにして行うことができます。

Unity の Project 画面内左上にある Hierarchy と書かれたタブ内の「+」ボタンを押下し、「3D Object」-->「Cube」の順にクリックします。

![スクリーンショット 2025-05-04 215935.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/327407/1b296efa-f1ed-4824-8c7d-327966989c8a.png)

すると、以下のように「Cube」という項目が Hierarchy タブに追加されています。

![スクリーンショット 2025-05-04 220240.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/327407/bd660e16-42a6-4722-8b69-ab38b296a6b2.png)


また、画面内にも黒い立方体が追加されています。この状態で、この立方体の位置を移動させることも可能です。

![スクリーンショット 2025-05-04 222137.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/327407/423d48cf-bd59-4ed1-afa4-0fcca706556c.png)


#### 4-6-2-3. C# ソースを Cube オブジェクトにアタッチ

ドキュメントの説明が端折りすぎていて、何をどうすればいいかわからなかったのですが、これもイメージ画像付きで解説します。

まず、「4-6-2-2. 回転体オブジェクトの追加」と同様の要領で、空のオブジェクトを追加します。

以下のように、「+」ボタン -->「Create Empty」の順にをクリックし、オブジェクトの名前を `RosPublisher` 変えてあげればOKです。

![スクリーンショット 2025-05-04 220216.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/327407/eca32c29-0d33-4baa-bdcc-9c41286febf6.png)

次に、「Hierarchy」タブの中にある Cube をクリックして、 「Inspector」タブの中に Cube の属性情報を表示しておきます。結果は以下のようになればOKです。

![スクリーンショット 2025-05-04 222137.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/327407/df8e9af9-da93-44be-965c-7fa1d93218f0.png)

今後は、以下のように「Project」タブにある「RosPublisherExample」を「Inspector」タブの中の Cube の属性欄までドラッグ&ドロップします。ドロップできるところは青色に色が変わるので、よく見て作業しましょう。

![スクリーンショット 2025-05-04 222154.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/327407/f341b566-534d-460d-8420-b7fb3727f205.png)

すると、「Inspector」タブには、「Ros Publisher Example」の項目が追加されます。以下の画像を参照。

![スクリーンショット 2025-05-06 210014.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/327407/b3cd2b19-8553-4433-9ee5-6f97dd219e99.png)

その次は、以下の画像のように「Hierarchy」タブの中の Cube を、たった今追加した「Ros Publisher Example」の中の Cube と書かれた入力フォーム（None と表示されている）までドラッグ&ドロップします。

![スクリーンショット 2025-05-04 222242.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/327407/7df4fdab-f668-4b32-a8c5-498c2ac9cf0a.png)

ここまで終わると、「Ros Publisher Example」属性の「Cube」欄に「Cube」と表示されているはずです。

![スクリーンショット 2025-05-06 205303.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/327407/4b37fc59-1882-4490-8a06-339df85f656c.png)

#### 4-6-2-4. ゲーム起動と通信結果の確認

ここまできて、やっとこゲームを起動する時が来ました( \*¯ ꒳¯\*)✨
Unity のプログラムウィンドウの上部中央にある、「▶」マークのボタンをクリックしましょう！

![スクリーンショット 2025-05-06 210858.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/327407/7f4c2233-fc83-479a-8c97-ed1caabb1454.png)

すると、ゲームが起動すると同時に、「4-3.」で起動していた WSL 側の標準出力に、以下のような文字列が現れるはずです。これで、ROS2 の通信が Unity から WSL 上のサーバに届いていることがわかります。

```bash:WSL の標準出力
root@e960f81518b9:/home/dev_ws# ros2 run ros_tcp_endpoint default_server_endpoint --ros-args -p ROS_IP:=0.0.0.0
[INFO] [1746359504.808020094] [UnityEndpoint]: Starting server on 0.0.0.0:10000
[INFO] [1746533217.498079298] [UnityEndpoint]: Connection from 172.29.0.1
ros2_container  | [WARN] [1746533217.502585318] [rcl.logging_rosout]: Publisher already registered for provided node name. If this is due to multiple nodes with the same name then all logs for that logger name will go out over the existing publisher. As soon as any node with that name is destructed it will unregister the publisher, preventing any further logs for that name from being published on the rosout topic.
ros2_container  | [INFO] [1746533217.520611966] [UnityEndpoint]: RegisterSubscriber(/tf, <class 'tf2_msgs.msg._tf_message.TFMessage'>) OK
ros2_container  | [WARN] [1746533217.552314796] [rcl.logging_rosout]: Publisher already registered for provided node name. If this is due to multiple nodes with the same name then all logs for that logger name will go out over the existing publisher. As soon as any node with that name is destructed it will unregister the publisher, preventing any further logs for that name from being published on the rosout topic.
ros2_container  | [INFO] [1746533217.566740144] [UnityEndpoint]: RegisterPublisher(pos_rot, <class 'unity_robotics_demo_msgs.msg._pos_rot.PosRot'>) OK
ros2_container  | [INFO] [1746533217.584309250] [UnityEndpoint]: RegisterPublisher(pos_rot, <class 'unity_robotics_demo_msgs.msg._pos_rot.PosRot'>) OK
```

最後に、Unity から送られてきたデータの確認を行いましょう！
公式ドキュメントでいうところの、[`Start the Echo monitor` の部分](https://github.com/Unity-Technologies/Unity-Robotics-Hub/blob/main/tutorials/ros_unity_integration/publisher.md#start-the-echo-monitor)ですよ。

[「4-6-1.」](#4-6-1-デモのインストール)で起動した、Docker コンテナ内にいるターミナルが残っていれば、そこで以下のコマンドを実行します。

```bash:WSL 側の Docker コンテナ内で実行
source install/setup.bash
ros2 topic echo pos_rot
```

既にターミナルを閉じてしまっていた場合は、「4-6-1.」と同じ手順で再度立ち上げて Docker コンテナの中に入ってから、上記コマンドを実行しましょう。

すると、公式ドキュメントに添付されている動画のように、座標 (pos) と姿勢 (rot) の値が表示され、以下のようになるはずです。

```bash:WSL 内のターミナルの様子
root@c5e1452e4203:/home/dev_ws# source install/setup.bash
root@c5e1452e4203:/home/dev_ws# ros2 topic echo pos_rot
pos_x: -3.4800000190734863
pos_y: 5.610000133514404
pos_z: -4.300000190734863
rot_x: 0.5852684378623962
rot_y: 0.5256537199020386
rot_z: 0.3468748927116394
rot_w: 0.5107120871543884
---
pos_x: -3.4800000190734863
pos_y: 5.610000133514404
pos_z: -4.300000190734863
rot_x: 0.0844053253531456
rot_y: 0.6478017568588257
rot_z: -0.7427700161933899
rot_w: 0.14670155942440033
---
pos_x: -3.4800000190734863
pos_y: 5.610000133514404
pos_z: -4.300000190734863

...

# 以降繰り返し
```

これで、「4-6-2. Publisher によるデモ動作確認」は成功です！(\*´▽｀\*)


# 5. 結果 (再掲)

ここまでの結果は確認できましたか？

![250504_unity_ros2_demo.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/327407/92ac6a35-6445-405c-a60b-8f4da4155032.gif)

これをベースに、どんどん面白いものを作っていきたいですね！
最後まで、お疲れさまでした(´ ｡•ω•｡)っ🍵~㌧


# 6. 今後について

記事にするかどうかは別として、まだまだ Tutorial は続くので色々試してみたいと思っています( \*˙︶˙\*)وｸﾞｯ!


# 関連記事

## 1. Unity インストール手順

UI 側の Unity をインストールするための手順を記載してくれている記事です。「4-1.」「4-2.」の作業は、この記事を頼りにして行いました。

https://cad-kenkyujo.com/unity-tsukaikata/

## 2. Unity-Robotics-Hub 公式 GitHub

WSL 上での作業は、この記事を頼りに行いました。

- GitHub トップページ

https://github.com/Unity-Technologies/Unity-Robotics-Hub/tree/main

- ROS を使った通信に関する README.md

https://github.com/Unity-Technologies/Unity-Robotics-Hub/blob/main/tutorials/ros_unity_integration/README.md


## 3. ros2-for-unity について

### 3-1. ros2-for-unity のメリット

以下の記事では `ros2-for-unity` のどこが良いのかが明確に記載されているので、気になる方は目を通してみましょう！

https://zenn.dev/hakuturu583/articles/ros2_for_unity#ros2-for-unity

### 3-2. ros2-for-unity の簡易インストール手順

私は実施していませんが、 `Unity-Robotics-Hub` ではなく、 `ros2-for-unity` を使いたい方は、以下の記事が参考になりそう。

https://qiita.com/devemin/items/4613705a4631975f24c1

この記事は、 `ros2-for-unity` を使う場合の最低限の構成で環境構築しているように見えます。私が `ros2-for-unity` を試す時が来たら、この記事でためしたいなとおもっていま


## 4. Unity 自体の使い方

私はまだ着手できていませんが、 UI 側での様々な操作方法、主にゲーム作りの基本について記載されている記事です。
今後こういった記事を読んで、さらに勉強してみたいなと思っています

https://online.dhw.co.jp/kuritama/unity-website/


## 5.　Navigation 2 SLAM Example

私は SLAM に興味があります！それを Unity 上でお試しできるサンプルがあるらしく、その解説をしている記事になります。

https://note.com/npaka/n/n42fb20a9dc2a