インフラエンジニアが
Unityをやるべき
たった1つの理理由
株式会社あくしゅ
⼭山崎泰宏
【質問】
このネットワークエンジニア達は
⼀一体何を喜んでいるでしょうか?
答え
やったー!
pingが通ったー!
脳内のイメージ
実際
$ ping -c 3 192.168.1.1
PING 192.168.1.1 (192.168.1.1): 56 data bytes
64 bytes from 192.168.1.1: icmp_seq=0 ttl=64 time=4.306 ms
64 bytes from 192.168.1.1: icmp_seq=1 ttl=64 time=1.542 ms
64 bytes from 192.168.1.1: icmp_seq=2 ttl=64 time=1.475 ms
--- 192.168.1.1 ping statistics ---
3 packets transmitted, 3 packets received, 0.0% packet loss
round-trip min/avg/max/stddev = 1.475/2.441/4.306/1.319 ms
$
この喜びをデモしたい
映画だって⾶飛び出したらみんな喜ぶんだ!
そうか!3Dにすればいいんだ!
           …って何だ?
•  ゲームエンジン&オーサリングツール
– 主に2Dや3Dのゲームが作れる
– JavaScriptかC#でコードを書く
– Windows/Mac/Linuxや、ブラウザ上のプラグ
イン形式へクロスコンパイルしてバイナリを
⽣生成できる
•  商⽤用はライセンスが必須
•  追加ライセンスで、iPhoneやAndroidへも出⼒力力可能
弊社のお仕事
データセンターの仮想化を
真⾯面⽬目に⽬目指している会社
クラウド基盤ソフトウェア
Wakame-vdc
仮想ネットワーク技術
OpenFlow 1.3を駆使し
物理理ネットワークの上で
仮想ネットワークを
⾃自由⾃自在にオーバレイするもの
OpenVNetの
デモ⾒見見せてよ!
$ ping -c 3 192.168.1.1
PING 192.168.1.1 (192.168.1.1): 56 data bytes
64 bytes from 192.168.1.1: icmp_seq=0 ttl=64 time=4.306 ms
64 bytes from 192.168.1.1: icmp_seq=1 ttl=64 time=1.542 ms
64 bytes from 192.168.1.1: icmp_seq=2 ttl=64 time=1.475 ms
--- 192.168.1.1 ping statistics ---
3 packets transmitted, 3 packets received, 0.0% packet loss
round-trip min/avg/max/stddev = 1.475/2.441/4.306/1.319 ms
$
・・・
くやしいから作ったよ!
Unityで作った
ビジュアライズ画⾯面
L2 Switch
Web Web LB
Packet
Capture
イベント配布⽤用
TCP Server
豪華なpingのアーキテクチャ
デモしたい実際の環境
ビジュアライズの部分だけ
御覧ください
(Demonstration)
Packet Capture (Ruby)
抜粋
sock = TCPSocket.open(config['server'], config['port'])
packet_dump = Pcaplet.new("-i #{options[:tap]}")
filter = Pcap::Filter.new("dst #{options[:ip]}", packet_dump.capture)
packet_dump.add_filter(filter)
packet_dump.each_packet do |pkt|
if pkt.ip? && pkt.ip_dst.to_s == options[:ip]
sock.puts("#{options[:instance_name]}")
end
end
packet_dump.close
イベント配布⽤用TCP Serverへの接続
TAPデバイスのキャプチャ
必要なパケットのフィルタリング
イベント配布⽤用TCP Serverへ送信
イベント配布TCP Server (Ruby)
抜粋
server = TCPServer.open(config.port)
unity_socket = nil
while true
s = server.accept
if not config.accept_addr_list.include?(s.remote_address.ip_address)
unity_socket = s
p "unity connected."
else
Thread.start(s, unity_socket) do |socket, unity_socket|
while buffer = socket.gets
unity_socket.puts(buffer)
end
socket.close
end
end
end
各Packet Captureクライアントから
送られてきたメッセージを
Unityのソケットへ届けるスレッド
残るビジュアライズ部分は
どうやって作るのか
•  ⼿手順
1.  3D空間をデザインする (モデリング)
2.  Unityに配置してスクリプトを記述する
•  TCP Serverへのネットワークプログラミング
3.  各OSプラットフォームへバイナリを出⼒力力する
•  必要な知識識
–  ゲームエンジンの仕組みに対する理理解
–  ⾏行行列列計算や三⾓角関数などの簡単な数学
–  JavaScriptかC#
•  とりあえずUnityのライブラリが分かれば良良い
まずはモデリング
オブジェクトを作る⼯工程のこと。今回はBlenderを使って作成したものをUnityにImport。
Unityの「ゲームエンジン」って
そもそも何?
•  イベントドリブンの仕組みを備えた
シーングラフ
– カメラや空間に存在するオブジェクトを、
ツリー構造で表現したもの
– 世界で起こることを統括し、イベントとして
オブジェクトに伝達する機構を持つ
•  オブジェクト同⼠士の衝突など
オーサリングツールの画⾯面
シーングラフ
クラスとなるスクリプトを書く
例例えばキー⼊入⼒力力を判定する
コードを書いて…
ESCが押されたら
アプリケーションを終了了する!
カメラオブジェクトにくっつける
オブジェクトを選択して…
作成したスクリプトを…
オブジェクトの中に組み込む
カメラオブジェクトが有効な間は
ESCを押すとアプリが終了了する
ゲームエンジンの基本構造
ゲーム
エンジン
シーンを構成する
オブジェクト達
シーンを構成する
オブジェクト達
シーンを構成する
オブジェクト達
イベントに応じた
スクリプト
イベント
イベントに応じた
スクリプト
イベントに応じた
スクリプト
オブジェクトに対するイベント例例
•  オブジェクトの初期化や破棄の時
•  他のオブジェクトと衝突した時
•  描画される時
などなど
このような様々なタイミングで、
ゲームエンジンがオブジェクトに備わっている関数を呼び出してくれる。
そこに便便乗して、⾃自分の任意のコードを実⾏行行する。
TCP Serverへの接続⽅方法
この中⾝身に連動するように
関数をコールするだけ
Startはオブジェクト初期化の際に呼ばれる
キーボードを叩いたのと同様に
光らせる
アニメーションの
トリガを引く⾃自作関数
キー⼊入⼒力力の場合
Updateはフレーム描画毎に呼ばれる
各オブジェクトのパラメータを変更更し、
光らせるエフェクトなどを発動させる
バイナリを
出⼒力力する
•  クロス
プラットフォーム
–  Web Player
–  Windows, Mac &
Linux
–  iOS, Android
–  etc...
Monoが使われている様⼦子
Unityで作った
ビジュアライズ画⾯面
L2 Switch
Web Web LB
Packet
Capture
イベント配布⽤用
TCP Server
豪華なpingできたー!
デモしたい環境
⼀一番⼤大切切な実際の反応
「おおおおおおお…」
まとめ
•  インフラエンジニアは動いて当たり前の
ものを扱う悲しい⽣生命体
– 「当たり前」をデモしなければならない
– pingを打つたびに⼈人が眠る
•  デモは派⼿手に!楽しく!
– Unityを使えば、パケットの動きに連動した
豪華な3Dアニメーションも作れる!
– エンジニア同⼠士が「おおー!」と⾔言ったあの
瞬間を、そうじゃない⼈人とも共有しよう!

インフラエンジニアがUnityをやるべきたった一つの理由