Unity ゲーム開発日記:プロジェクト作成と GitHub
はじめに
これまで二年以上Unityを使って色々してきましたが、 一つのゲームを完成させたことはありませんでした。
今回は思い切って、すぐ完成させられそうなシンプルなゲームを作成し、 Google Play Store などにリリースしてみようと思います。
作成するゲームは2Dのシューティングゲームです。
できる限りシンプルでオシャレなゲームにする予定です。
タイトルは「オシャレなロケット Oshare-Na-Rocket」
流れ
- Unityプロジェクト作成、GitHubで管理
- ゲームシステム作成
- 素材作成(イラスト、BGM)
- リリース
環境
- Windows10
- Unity 2018.2.14f1
参考
Unity公式チュートリアル
こちらも
プロジェクト作成
現在の最新バージョン Unity 2018.2.14f1 をインストール
Unity のバージョン管理は公式の「Unity Hub」を使うと便利です
インストールが終わったら新規プロジェクトを作成
GitHub で管理
Git を利用するとプロジェクトのバージョン管理が簡単にできます
GitHub の利用方法が分からない人は各自でググってください(私は良く分かっていません笑)
UnityのプロジェクトをGitHubにあげる場合はきちんと「.gitignore」を設定すると楽になります
GitHub で Repository を作成するときに .gitgnore を選択できるのでそこで「Unity」を選択するだけで済みます。
一応、方法は以下にまとめておきます
以下が私のGitHubのページです
おわりに
この記事ではUnityのプロジェクトを作成してGitHubにあげました。
次はゲームのシステムを作っていきます。山場です。
Unity と ROS の通信 ( ROS# : ros-sharp )
はじめに
UnityアプリとROSの間でデータをやり取りしたい
ROS#というライブラリを使うと簡単に実現できるようです
公式の情報を見ればだいたい分かりますが、 一応メモを残しておきます
参考
バージョン1.3以降の場合
環境
Unity側
- Windows10
- Unity 2018.2.8f1
- ROS# v1.0 (バージョン:v1.3 → v1.0)
ROS側
- Ubuntu 16.04 LTS
- ROS Kinetic
ROS#をインポート
GitHubページから最新版UnityPackageをダウンロードしてインポート
UnityのAsset Storeからもインポートできるようです
ros-sharpパッケージ内にサンプルシーンが入っているのでそれを見るとだいたい使い方が分かります
(Assets > RosSharp > Scenes)
オブジェクトのPoseを配信してみる
Unity側の準備
Hierarchyで空(Empty)のオブジェクトを作成(名前:ROSConnector)
Create>Create Enpty で作成
そのオブジェクトに Assets > RosSharp > Script > RosCommunication > RosConnector.cs をアタッチ
(もしくはRosSharp > Prefabs > RosConnectorから作成)
InspectorでROS側PCのURLを入力
次にCubeを作成します。ここではこのCubeのPoseを配信してみます。
HierarchyでCreate > 3D Object > Cube で作成
作成したCubeに RosSharp > Scripts > MessageHandling > PoseProvider.cs をアタッチ
PoseProviderのframeId
は、特に何もなければUnity
と入力
最後にROSConnectorに RosSharp > Scripts > RosCommunication > UnityTimePublisher.cs をアタッチ
Topic
に/pose
と入力
Message Provider
はCube
を選択
ROS側の準備
すでにROSがインストールされているUbuntuを用意
以下のコマンドでrosbridge-serverをインストール
sudo apt-get install ros-kinetic-rosbridge-server
rosbridge-serverはROSとROSではないソフトウェアで簡単に通信を行えるようにするものです
以下のコマンドで実行
roslaunch rosbridge_server rosbridge_websocket.launch
やってみる
準備が整ったらUnityのプレイボタンを押します
UnityとROSの接続が成功するとubuntu側の端末にClient connected. 1 clients total.
と表示されます
接続が成功したら以下のコマンドを打ってPoseが配信されているかを確認します
rostopic list
次に以下のコマンドを打ってメッセージの内容を確認します
rostopic echo /pose
/poseトピックのメッセージが確認できると思います
ここでUnity側のCubeのPositionやRotationを変更するとメッセージの内容も変わることが確認できます
座標系について
ちなみにですが、UnityとROSでは座標系が異なっています
そのことについてまとめたので確認してみてください
通信が上手くいかない場合
考えられる点
- ROSConnectorで入力するROS側PCのURLが間違っている
- Unity側PCとROS側PCが同じネットワークにいない
- rosbridge-serverを起動していない
- Unity側の準備が足りていない
など
配信されているPoseの可視化について
ROSには可視化ツールとしてRvizというソフトウェアがあります
このrvizで今回Unityから配信したPoseデータを可視化してみるとおもしろいかと思います
以下のコマンドで実行できます
rosrun rviz rviz
使い方は調べれば出てきます
rvizで可視化する場合、Unity上でCubeにアタッチしたPoseProviderのFrameIdを設定する必要があります
気になること
ROS#がiOS端末上では上手く動かない問題
(2019/04/17追記)
以下情報
まとめ
ROS#を利用してUnityとROSでデータをやり取り
おわりに
今回はUnityからROSへデータを送りましたが、 もちろんROSからUnityへデータを送ることもできます
またROS#の強みは、簡単であることと、URDFも扱えるということみたいです
ROS#の存在はありがたい
おまけ
ROS と Unity における座標系の違いについて
はじめに
ROS と Unity でロボットの座標データをやり取りするときに、 座標系の違いを調べる必要があったのでまとめておきます
座標系について
- ROS : 右手系
- Unity : 左手系
変換方法
Unity -> ROS
Position: Unity(x,y,z) -> ROS(z,-x,y) Quaternion: Unity(x,y,z,w) -> ROS(z,-x,y,-w)
ROS -> Unity
Position: ROS(x,y,z) -> Unity(-y,z,x) Quaternion: ROS(x,y,z,w) -> Unity(-y,z,x,-w)
おわりに
メモしておかないと忘れます
Unity, ROS 間での JSON パースメモ (nav_msgs/Odometry.msg)
はじめに
/opt/ros/kinetic/share/nav_msgs/msg/Odometry.msg
この型のデータを ROS から Unity アプリへ送信したときのパースの方法のメモ
Odometryメッセージの型の中身
階層構造が重要
- Header header
- uint32 seq
- time stamp
- string frame_id
- string child_frame_id
- geometry_msgs/PoseWithCovariance pose
- Pose pose
- Point position
- float64 x
- float64 y
- float64 z
- Quaternion orientation
- float64 x
- float64 y
- float64 z
- float64 w
- Point position
- float64[36] covariance
- Pose pose
- geometry_msgs/TwistWithCovariance twist
- Twist twist
- Vector3 linear
- Vector3 angular
- float64[36] covariance
- Twist twist
気をつけること
poseとtwistの変数名が重複しているので区別する
コード例
[System.Serializable] public class Odom { public string topic; //トピック名 public Msg msg; // メッセージ内容 public string op; // Operation : publish, subscribe など } [System.Serializable] public class Msg { public Header header; public string child_frame_id; public Pose pose; public Twist twist; } [System.Serializable] public class Header { public Stamp stamp; public string frame_id; public string seq; } [System.Serializable] public class Stamp { public int secs; public int nsecs; } [System.Serializable] public class Pose { public Pose2 pose; // 変数名がJSONのキーと合っていれば良い float[] covariance; } [System.Serializable] public class Pose2 { public Vector3 position; public Quaternion orientation; } [System.Serializable] public class Twist { public Twist2 twist; // 変数名がJSONのキーと合っていれば良い float[] covariance; } [System.Serializable] public class Twist2 { public Vector3 linear; public Vector3 angular; }
受け取るとき
// message = 受け取ったJSONデータ Odom odomMsg = JsonUtility.FromJson<Odom>(message);
websocket-sharp を使った通信例
おわりに
ROS から Unity アプリへJSONデータを送ったときのパースの一例をまとめた
Raspberry Pi 3B, Ubuntu 16.04 LTS で Docker を使うメモ
はじめに
Raspberry Pi3 Model B の Ubuntu 16.04 上で Docker を使ってみた
Docker は docker-ce を使う。この CE が無料版らしい。
環境
- Raspberry Pi3 Model B
- Ubuntu 16.04 LTS
- Docker 18.06.1-ce
インストール方法
公式ページを参考にしてインストール
流れの通りにやればインストールできる
一つ注意点としてCPUによってコマンドが異なるところがある
(arch
コマンドでCPUが分かる)
ARMなので「armhf」用のコマンドをうつ
インストールが終わったら以下のコマンドで確認
sudo docker run hello-world
以下のメッセージが表示されたらOK
Hello from Docker!
nginxでサーバを立ち上げてみる
以下の記事を参考
sudo docker run -d -p 8080:80 --name webserver nginx
このコマンドでサーバが立ち上がる
初回ではダウンロードがあるので少し時間がかかる
http://[raspberry Pi の ip adress]:8080
にアクセスできる
以下のコマンドでコンテナの一覧が表示される
ここではnginxのコンテナが表示されるはず
sudo docker ps
以下のコマンドでコンテナを終了させる
sudo docker kill webserver
以下のコマンドでコンテナを削除
sudo docker rm webserver
まとめ
Raspberry Pi3 Model B の Ubuntu 16.04 LTS 上で Docker を使った
インストールをして、nginxでサーバを立ててみた
おわりに
噂に聞いてた通りDocker便利
ぜひ使っていきたい
VRChat ワールドに動きを付けるアニメーション
はじめに
VRChatではオブジェクトに動きをつけるためにアニメーションを利用します。(C#スクリプトは使えないはず)
今回はパパっとアニメーションを使ってみようと思います。
環境
- Unity5.6.3p1
- Windows10
- VRChat SDK 2018.06.21
ワールドの準備
ワールド作成の準備を行った状態にします。(画像は最低限の準備をした状態)
ワールド作成方法については以下の記事を参照。
Cubeを作成
今回は動かす対象としてCubeを用います。
Hierarchyで、Create -> 3D Object -> Cube を選択。
CubeのTransformでPositionを(X, Y, Z) -> (0, 2, 0)にします。
Cubeのアニメーションを作成
Cubeを選択した状態でWindow -> Animationを選択します。
するとAnimationのウインドウが出てくるので、Createボタンを押します。
アニメーションの名前は適当に決めます。(例えば"CubeAnimation")
次にAdd Propertyボタンを押し、Transform -> Rotationを選択。("+"ボタンを押す)
1:00のところをクリックして赤い線が移動したことを確認してから、Rotation.yの値を「360」にします。
アニメーションの再生ボタンを押すと、Cubeが0秒から1秒の間でY軸周りに360度回転しているはずです。
以上でアニメーションを作成できました。
VRChatで確認
作成したワールドをアップロードして、VRChat上で確認してみてください。
ずっとCubeが回転しているはずです。
何かをきっかけにアニメーションを起動
今の状態だとCubeはずっと回転しています。
何かをきっかけにアニメーションを起動したい場合は、 「VRC_Trigger」を利用するか、 Assets -> VRCSDK -> Examples -> Sample Assets -> Animation -> CustomOverrideEmpty を利用するといいと思います。
おわりに
VRChatでのアニメーションについて書きました。
と言ってもVRChatだからと言って何か特別な設定が必要なわけではないので、 「Unity アニメーション」と検索すれば情報はたくさん出てくると思います。
もっと詳しく情報がたくさんあると思うので調べてみてください。
VRChat 10分でできるワールド作成
はじめに
VRChatでパパっとワールドを作ります。
すぐできます。
目次
環境
- Unity5.6.3p1
- Windows10
- VRChatSDK 2018.06.21
Unity 2017.4.15f1 でも大丈夫
本記事では Unity5.6.3p1 を使用しています。
VRChat は Unity 2017.4.15f1 に対応したようですが、 ワールドをアップロードする手順に変更はないようです。
ワールドをアップロードするまでの流れ
Unity のインストール
まず、Unity をインストールします。
バージョンは「Unity 2017.4.15f1」です。
バージョンが正しいことを確認してインストールしてください。
VRChat SDKをインポート
VRChat SDKをダウンロードして、 Unity にインポートします。
「VRChat SDK」とは VRChat のワールド作成や アバターのアップロードを行うために必要となるものです。
VRChat SDK は、VRChat 公式サイトで入手できます。
VRChat の公式サイトにログインして(アカウントを持っていない人は新規登録する)、 「Download」で「VRchat SDK」を入手します。
新規のUnityプロジェクトを作成し、 VRChat SDKをインポートします。
Assets -> Import Package -> Custom Package からVRChat SDKを選択。
VRCWorldをHierarchyへ
Assets -> VRCSDK -> Prefabs -> World -> VRCWorld をHierarchyへドラック&ドロップ
最低限の地面を作成
Hierarchyで、 Create -> 3D Object -> Plane を選択(Plane以外のものでもOK)。
ワールドをアップロード
VRChat SDK -> Settings でVRChatにログインします(一度ログインしたらもう大丈夫)。
VRChat SDK -> Show Build Control Panel からアップロードを行います。
Publish の "New Build" ボタンを押します。
World Nameを入力して、チェックボックスにチェックを入れ、"Upload" ボタンを押すとアップロード完了です。
もし、画面のサイズが小さくてUploadボタンが見えなかったりしたら、 画面のサイズを大きくしたり、画像で示す"Maximize On Play"をONにしてから、もう一度やり直してみてください。
以上で完了です。
VRChatで確認
これで無事にアップロードできているはずです。
VRChatにいって自分が作ったワールドを確認してみてください。
自分が作成したワールドは、ワールド選択画面の一番下"Mine"のところにあります。
今回作成したワールドに行ってみました。何もないです。
おわりに
簡単にワールドが作成できました。
VRChatすごい。楽しい。
このあとは、好きな3Dモデルを置いたり、Particle Systemやアニメーション、シェーダーなどを利用してみたり、 色々やっていきましょう!
参考
以下の記事を参考にさせていただきました。