Photonを使ってUnityで簡単なMMOアプリを作ってみる(下準備編)
サーバーとかほとんど触ったことない自分ですが、Unityで軽いMMO的なアプリを作りたくなったので挑戦したいと思います!
自分が自由に使えるサーバーは研究室にある1台のPC(CentOS)のみなので、流行りのクラウドサーバーを使ってみます
Photonに登録
まず、Photonとはさまざまなゲーム開発環境で使えるネットワークエンジンです
何より驚くべきは、基本料金が無料のところ
Photon realtimeなら同時接続可能なユーザー数が20人までならずっと無料で使えちゃう!!いったいどうなってるんだ。。
それではここからPhotonの公式サイトにとんで、メールアドレスを登録し届いたメールからパスワードを設定しましょう
Unityの設定
Photon Unity Networking Free のインポート
[AssetStore]→[Photonと検索]→[Photon Unity Networking Freeをインポート]
有料版ではなく無償版を選択しましょう
設定
[Window]→[Photon Unity Networking]→[PUN Wizard] を選択
そして[Setup Project]を選択し、AppIDに、photonのサイトのダッシュボードにあるアプリケーションIDを登録します
続いて[Setting]でregionを"jp"に変更
検証
[Photon Unity Networking]→[Demos]→[DemoBoxes]→[DemoBoxes-Scene]をダブルクリック
するとデモシーンが開くのでUnity上で実行します
上のようなゲーム画面が出力され、クリックしたらボックスが落ちてくればPhotonへの接続ができています!
非常に簡単!すげー!
実行環境のPCにアプリをビルドして複数同時接続が可能なことを確認するのだけでも楽しい。笑
これで設定完了です
次回は、実際にゲームを作っていきましょう!
参考記事はこちら
忘れがちで便利なコマンド(grepやlogの出力)
grep
ファイル名を指定して指定したフォルダ以下すべてを検索する
$ grep -e ファイル名 ./
make
makeでerrorになってしまう時にlogへ出力する
$ make 2>&1 | tee make.log
makeしたときにどんなコマンドが叩かれているか出す
$ make -n
install オプションをつけるとどこにinstallされるかもわかる
$ make -n install
Macで5ボタンマウスを使って”進む””戻る”をかんたんにやる
Windowsだとすんなり”進む戻る”ボタンが適応されるんだけど、なぜかMacだとすんなりいかない。。
そこで調べたらKarabinerを使えば解決しました!
Karabinerほんと使えるなー。これでますますOS Sierraにできなくなっちゃった 笑
1. Karabinerをインストール
2. Preferences -> Misc & Uninstall -> Open private.xml を選択
3. private.xml をなんかのエディタで開いて下のコードを上書き
<?xml version="1.0"?> <root> <list> <item> <name>MouseButton 4 and 5</name> <identifier>remap.mouse_button4_5</identifier> <autogen> --PointingButtonToKey-- PointingButton::BUTTON4, KeyCode::JIS_BRACKET_LEFT, ModifierFlag::COMMAND_L </autogen> <autogen> --PointingButtonToKey-- PointingButton::BUTTON5, KeyCode::JIS_BRACKET_RIGHT, ModifierFlag::COMMAND_L </autogen> </item> </list> </root>
もとに書いてある3行程度のコードを消して挿入するように
4. Change Key -> Reload XML を選択
5. Change Key -> MouseButton 4 and 5 にチェックを入れる
Daydreamまとめ(新規VR開発者向けに他VRと比較)
日本時間で2016年10月5日の朝1時頃にGoogle I/O 2016がありました
僕はDaydreamが目玉かと思ってたんですが、意外にもGoogleHomeやら別の製品の発表が多くてびっくり!
でも僕はやっぱりDaydreamが一番興味があるので僕なりにまとめていきます。今後の開発も見据えて
Daydreamとは
そもそもDaydreamってなんだろう?
意外と答えづらいですよね。多少語弊があるかもしれませんが簡単に説明します
DaydreamはGoogleが提供するVR向けのプラットフォームです
ここで言うプラットフォームとは → ヘッドセット、コントローラ、開発環境、VRホーム画面など(コンテンツは他の会社も作る)
つまり、「Daydreamを試したい!」って人は、
1. Daydreamが要求する水準を満たす高性能Android端末(現在はPixelのみ。あとはまだ未発売のPHAB2 ProとかGalaxy Note 7あたりも要求を満たすと思われる)
2. Daydream View(ヘッドセット)
3. Daydream用コントローラ
の3つを揃える必要があります
ハードウェア
まずはヘッドセットとコントローラ
こんな見た目らしい
使うときはスマートフォンを挟んで使う(画像ではPixel)
そしてコントローラ
このコントローラが割と優れもので、いろいろ値がとれるっぽい(多分ジャイロかな?さすがにヘッドセットからの相対座標は出せないかと)
それにちゃんとボタンとタッチパッドもついてるし、収納できるの割と便利
ヘッドセットの値段は79ドル(8,000円ちょっと)。11月発売らしい
ソフトウェア
これはまだ謎が多い。僕の想像によりますが、おそらく新しいAndroidOSにVRモード(アプリかもしれない)が追加されるて、それを使うとVR用のホーム画面がスマートフォーンに表示されるんじゃないかな
そしてアプリはGooglePlayでダウンロードして遊ぶ
多分こんな感じになると予想。GearVRと同じ感じかね
他VRと比較(新規開発者向け)
とりあえずVR系のアプリを作ってみたいけど、どれ向けに作れば良いか分からない!
という方多いんじゃないでしょうか?かくいう僕もその一人です
なんたって今は、GearVR、Daydream、Cardboard向け、PC向け(Oculus、Viveなど)と選択肢は様々です
なのでまずはこれらを比較するために、それぞれの特徴を簡単に表にまとめてみました!
(注)僕の予想がかなり入ってます
機種 | 体験しやすさ | VRの品質 | コントローラ | アプリ数 | 価格 | これからの普及 (予想) |
---|---|---|---|---|---|---|
GearVR | ◯ | ◯ | 無 | ◎ | 中 | ◯ |
Daydream (予想) |
◎ | ◯ー | 有 | ◎ | 中 | ◎ |
Cardboard向け | ◎ | △ | 無 | ◯ | 低 | △ |
PC向け | △ | ◎ | 有 | ◎ | 高 | ◎ |
ここでどれを選ぶか考えるためにいままでの技術を振り返ってみます
ガラケーの時代から日常生活では、多機能で仕事ができる端末+携帯できる端末、この2つが広く利用されています。VRが出てきたからといってこの形はしばらく変わらないと思います
もちろんタブレットやスマートウォッチなども最近見ますが、PC→タブレット、携帯端末→スマートウォッチと姿を変えようとしているだけで必要とされるのは本質的には上の2つです
これをVRに当てはめれば、多機能なPC向けVRと携帯しやすく普及が見込めるVR、この2つが今後のVR界で重要な役割を担っていくのではないかと思います
じゃあ、携帯しやすく普及が見込めるVRって何?
これはDaydreamかGearVRが今のところ濃厚です。ただ、GearVRはGalaxyにしか対応していないです。特化している分性能は高いのですが、普及という意味では×
それに対して、メーカーを選ばないDaydreamはより普及しやすいです
VR品質に関しても時間の問題で、スマートフォンのトラッキング技術の向上や、アプリの最適化が進められれば進められるほどGearVRとDaydreamの性能差は埋まっていくでしょう
また、Daydreamにはコントローラがあるという点も非常に大きいです。ゲームをする上でコントローラはかかせません
(僕は足用コントローラも欲しいですが、それはしばらく待ちましょう)
結論
なので、今からVR用アプリを作りたい方には、
1. Daydream向け
2. PC向け (OculusやVive)
このどちらかで開発することをおすすめします!!
今後の記事ではDaydream用アプリの作成方法を紹介していくつもりです
参考
Mellanox純正ドライバをリビルドしてinsmodする手順
CentOS 6.6の環境でテストしています
Redhat系かDebian, Ubuntu系かでちょっと変わるので注意してください
ドライバのダウンロード
ここから自分の環境にあったものをダウンロード
中身を解凍
ダウンロードしたところにmlnx-en*.tgzがあると思うのでそれを解凍します
$ tar -zxvf mlnx-en-*.tgz
すると同じディレクトリに同じ名前のフォルダができます
RPMSを解凍
$ cd mlnx-en* $ cd SRPMS $ rpm -ivh mlnx-en*.src.rpm
これでrpmファイルが解凍されます
解凍されたものはホームディレクトリの下のrpmbuildディレクトリ下にあります
どこに展開されるかは
$ rpm --showrc | grep _topdir
で確認できます
ドライバのリビルド
まずはじめに*.koファイルがどこにできるかを調べます(そこらへんで作業すれば良い)
$ cd BUILD $ find . * | grep .ko /mlnx-en-3.3/obj/default/drivers/net/ethernet/mellanox/mlx4/mlx4_en.ko
つまりmlx4のドライバをいじりたいなら
$ cd mlnx-en-3.3/obj/default/drivers/net/ethernet/mellanox/mlx4/
でいろいろした後に
$ cd ../../../../../ $ make
makeすれば良い
ドライバのinsmod
これは下のようなinstall.shを自分は作った
#!/bin/sh MODULE=mlx4_en DEVICE=mlx4 insmod mlx4_core.ko insmod -f ./${MODULE}.ko MAJOR=`cat /proc/devices | awk "\\$2==\"${DEVICE}\" {print \\$1}"` rm -f /dev/${DEVICE} mknod /dev/${DEVICE} c ${MAJOR} 0
uninstall.shももちろん用意しておくと便利
#!/bin/sh MODULE=mlx4_en DEVICE=mlx4 rmmod ${MODULE} rm -f /dev/${DEVICE} rmmod mlx4_core.ko
あとはこれらをまわせば良い
追記
install.shとuninstall.shがいけてなかったので、
$ sudo insmod mlx4_en.ko $ sudo rammed mlx4_en.ko
を使うことにした
Mellanox NICで"ethtool --set-priv-flags"ができないのはドライバに原因があった
Mellanox connectx-3 pro を使ってパケットのやりとりをしているんですが、なぜかCPU割り込みが特定のCPUに偏る問題に直面しました
こんな感じ
CPU8とCPU11あたりに偏っているのが分かりますよね
そこでRSSのハッシュ関数が悪いのかと思い、ここの3.7.1にあるのRSS Hash Tuningにあることをやろうと
# ethtool --set-priv-flags p3p1 mlx4_rss_xor_hash_function on
とコマンドを打ったら
No private flags defined
と怒られました。なんだこれ?
そこでいろいろ調査していたらどうも僕の使っているmellanoxのデバイスドライバが悪いということが分かりました
自分はlinuxカーネルのソースコードをダウンロードし、その中のmlx4のドライバを再構築してできた*.ko
ファイルをinsmodして使っていました
実はそれがあまり良くなく、mellanoxの公式サイトから純正ドライバを使うべきだったみたい
そこで、mellanoxの公式サイトからドライバをダウンロードしてそれを使ってみたら
ethtool --set-priv-flags <interface> mlx4_rss_xor_hash_function on
が機能しました
pingでSourceIPやらDestIPを変えたらちゃんと複数のCPUに割り込みが分散しました!この通り8つのCPUに分散されています
なんで16このCPUに分散されないのかと言うのは多分この論文のfigure3にあるようにあるように、NICにつながっているCPUが特定のCPUだけで1つのNICからじゃ届かないCPUがあるのが原因じゃないかな?たぶん
ここについては要調査が必要かも。けれど、とりあえずここまで分散されればオッケーなので今回はここまでにしておきます
結論:linuxカーネルのソースコードの中にあるドライバを過信するのはよくないですね。ちゃんと公式のものをダウンロードして使おう
その他学んだもの
大量にpingをうつオプション
# ping -f
これ地味に便利。こんなオプションがあったなんて知らなかった
ただ、rootでしか使えないのは注意
1つのNICに複数のIPアドレスを割り当てる方法
ip addコマンドを使います
意外と簡単だった
設定例
# ip addr add 192.168.20.2 dev eth0
確認方法
$ ip addr