SlideShare a Scribd company logo
1 of 42
dotNET600 2018
Recording and Replay
on HoloLens
using “Message Pack for C Sharp”
@keshin_sky
2018.11.24
1
#1 こんにちは
2
誰?
• 林です。
• xR系の開発が中心
• ゲームよりも、医療系・製造業・展示向け
の開発が多い
• HoloLens を国内発売前から触ってました。
• ブログで日本語訳とか
• Twitter: @keshin_sky
• Github: https://github.com/the6th/
今日の内容
• 各種データを高速にシリアライズ・デシリ
アライズできる
超便利なC#ライブラリ[Message Pack for
C#]を紹介します。
• VR/AR アプリで動作内容の記録・再現を行
う必要がある時に見つけました。
• Unityでの利用事例を紹介しますが、Unity
以外でも動きます。
こういう感じ
5
Message
Pack for
Csharpとは
• Githubにあります。MITライセンスです
(日本人開発者)
https://github.com/neuecc/MessagePack
-CSharp/
• MessagePackのC#版です。
• MsgPackのライブラリはすでにあるが、
(MsgPack-Cli)
パフォーマンスにかなり差があります。
はやっ!
7
速い!
互換性も
高い
• .net Frameworkにはバイナリシリアライザ
として、 BinaryFormatter が標準で組み込
まれているのですが
• HoloLens(UWP/Universal Windows
Platform)では
動かない。
• これは動きます(動かしました)
Unityに強い!
/作者ブログより
(一部省略)
• Unity向けには、更にVector3[](など)の
シリアライズがJsonUtilityの20倍高速化さ
れる拡張機能なども設けてます。
• これは超強力で、Meshなどの巨大データや
大量の位置データのやり取りなどに役立つ
はずです。
• C#マジおせーからC++で書こうぜ、に最後
の最後はなるにしても、それまでの遊び幅
は大幅に拡張されるでしょう。
#2 実際のUnityでの使い方
Unity2018.2.14f
10
1. Unity Package 配布されています。
• Unity版はサイトのReleasesページから、.NETはNuGet経由で
入れてもらうのがいいでしょふ。
11
2.新規プロジェクト作成する
12
3. いらないPackage削除
• HoloLensで
エラーがでるから
MessagePackに
関係なく毎回やります。
13
4.ダウンロードしたパッケージをimport
• これで環境は整いました。
14
#3Quick Startやる
https://github.com/neuecc/MessagePack-CSharp
15
16
17
18
#4 Unity に強い!の話
https://github.com/neuecc/MessagePack-CSharp
19
Unity向け
• MessagePack.UnityShims package
provides shim of Unity's standard struct
Vector2/Vector3/Vector4/Quaternion,
Color, Bounds, Rect,
AnimationCurve, Keyframe,
Matrix4x4, Gradient, Color32, RectOffset,
LayerMask, Vector2Int, Vector3Int,
RangeInt, RectInt, BoundsInt) and there
formatter.
It can enable to communicate between
server and Unity client.
MessagePack.UnityClient >
UnitTest
githubにサンプルがある
が、動かすには、秘伝
のタレがいる
UnitTestRunner.csのインスペクタ拡大
設計
• GameObjectの変化を
• 時系列で格納できるclass
を
• 作成し、それを配列で
• 管理する
24
25
#5 HoloLens + MRTK
26
HoloLens!
• MRTK import
• TargetをUWP
• IL2CPP/(.NET でも)
27
エラーでた1
• Assets/Scripts/MessagePack/Internal/AutomataDictionary.cs(471,16): error CS0246:
The type or namespace name `DynamicAssembly' could not be found. Are you
missing an assembly reference?
• 解決法
#if !UNITY_WSA
#endif
で
AutomataDictionary.cs
を全部囲む
Generic List使えなくなるけど、 28
エラー出た2
Assets/Scripts/MessagePack/Internal/ThreadsafeTypeKeyHashTable.cs(187,30): error CS0234: The type or namespace name `Volatile' does not exist in the namespace
`System.Threading'. Are you missing an assembly reference?
Assets/Scripts/MessagePack/Resolvers/CompositeResolver.cs(84,66): error CS1061: Type `System.Type' does not contain a definition for `GetTypeInfo' and no extension
method `GetTypeInfo' of type `System.Type' could be found. Are you missing `HoloToolkit' using directive?
29
解決法
Scripting Backend
を.
NET 4.xに変更
エラー出た3
解決法
StandalonePCで無い(UWP/Android/iOS等)
時は、Resolverを別途準備しないといけない
mpc.exeというツールを使うと、
MessagePackGenerated.csというファイルを
生成しくれるので、それを使う
FormatterNotRegisteredException: MyClass is not registered in this resolver.
resolver:StandardResolverMessagePack.FormatterResolverExtensions.GetFormatterWithVe
rify[T] (MessagePack.IFormatterResolver resolver) (at
Assets/Scripts/MessagePack/IFormatterResolver.cs:35)
mpc.exe –i {Unityプロジェクトの}.csproj -o {書き出し先}/MessagePackGenerated.cs"
30
If you want to avoid generate cost or run
on Xamarin or Unity, you need pre-code
generation. mpc.exe(MessagePackComp
iler) is code generator of MessagePack
for C#. mpc can download
from releases page, mpc.zip. mpc is
using Roslyn so analyze source code.
https://github.com/neuecc/MessagePa
ck-CSharp#pre-code-
generationunityxamarin-supports
エラー出る4
Assets/Scripts/MessagePackGererated/MessagePackGenerated.cs(799,25): error CS0101: The
namespace `MessagePack.Formatters.HoloToolkit.Unity.InputModule' already contains a definition
for `RecognizerStartBehaviorFormatter'
31
解決法
mpc.exeは、Resolverコードを生成する際に、対象プロジェクトの全てのソースコードを
解析するっぽい。
既存ライブラリにserializer/Formatterなどの名前があると、エラーになったりする。
除外する方法知っている方教えてください。
困難な場合は、別プロジェクトでResolverのみ生成した方が良いかも。
今回はMRTKのコードを書き換え
解決方法
MRTKの
• RecognizerStartBehavior
を
• SpeechRecognizerStartBehavior
に書き換えていったん回避
32
大体これで動
くけど、
UWPならでは
の話
• Unityのライブラリで作成してもUWP向け
ビルドの際は、ビルド時にエラーが出るこ
とがある。
• ファイルの読み書き、ネットワーク通信周
り、AssetBuundleはUWP向けに書き換え
ないといけない。
• その為に、
プラットフォーム依存コンパイルを活用
UWPのプラットフォーム依存コンパイル
#if WINDOWS_UWP #if UNITY_WSA ENABLE_DOTNET ENABLE_IL2CPP
Unity Editor ✖無効 〇有効 〇有効 ✖無効
※ScriptingBackendがIL2
CPPだとVS上では有効だが
Editor上での実行では無視さ
れる
UWP
(.net)
〇有効 〇有効 〇有効 ✖無効
UWP
(IL2CPP)
? ? ✖無効 〇有効
34
Work03
Cubeを複数にする。
3
5
Work04
HoloLensで
動かす
• 床を透明に
• 位置をローカル座標系で管理
• 空間UIに
• 位置調整可能
• 箱の動きも録画する
Work05
• 実際に、HoloLensのセンサーデータを元に
アニメーションを作成する。
• 頭部の動き(Camera.main.transform)
• 両手の動き/ジェスチャー
• IKを利用してキャラクターに反映させる。
#6 おまけ+まとめ
38
Unity Recorderとの連携
UnityRecorderは
• エディター上で動く録画ツール
• パノラマVR動画の生成も可能
• GameObjectの動きから、Animation
Clipの作成も可能
• つまり、組み合わせると、
MessagePackで録画して、
Recoderで編集、
AnimationClipの生成ができます。
39https://assetstore.unity.com/packages/essentials/unity-recorder-94079
40
まとめ
• わりと簡単に、使える。リプレイできる
• Jsonへの相互変換も簡単なので、取り扱い
やする
• VRコントローラーへの活用も可能
• マルチプラットフォームで、メッセージの
やり取りができる
Github に
あります
github.com/the6th/
HoloLensRecorder
42

More Related Content

What's hot

Pyconjp2014_implementations
Pyconjp2014_implementationsPyconjp2014_implementations
Pyconjp2014_implementationsmasahitojp
 
Tokyor14 - R言語でユニットテスト
Tokyor14 - R言語でユニットテストTokyor14 - R言語でユニットテスト
Tokyor14 - R言語でユニットテストYohei Sato
 
debexpo(mentors.d.n)をハックするには
debexpo(mentors.d.n)をハックするにはdebexpo(mentors.d.n)をハックするには
debexpo(mentors.d.n)をハックするにはkenhys
 
Pythonでの開発を効率的に進めるためのツール設定
Pythonでの開発を効率的に進めるためのツール設定Pythonでの開発を効率的に進めるためのツール設定
Pythonでの開発を効率的に進めるためのツール設定Atsushi Odagiri
 
ExcelとPythonによる社会インフラシステムの設定ファイルの自動生成
ExcelとPythonによる社会インフラシステムの設定ファイルの自動生成ExcelとPythonによる社会インフラシステムの設定ファイルの自動生成
ExcelとPythonによる社会インフラシステムの設定ファイルの自動生成Fuminobu TAKEYAMA
 
オープンCAEとPython
オープンCAEとPythonオープンCAEとPython
オープンCAEとPythonTatsuyaKatayama
 
XML-RPC : Pythonが「電池付属」と呼ばれる理由
XML-RPC : Pythonが「電池付属」と呼ばれる理由XML-RPC : Pythonが「電池付属」と呼ばれる理由
XML-RPC : Pythonが「電池付属」と呼ばれる理由Ransui Iso
 
東京R非公式おじさんが教える本当に気持ちいいパッケージ作成法
東京R非公式おじさんが教える本当に気持ちいいパッケージ作成法東京R非公式おじさんが教える本当に気持ちいいパッケージ作成法
東京R非公式おじさんが教える本当に気持ちいいパッケージ作成法Nagi Teramo
 
Python3 プログラミング勉強会
Python3 プログラミング勉強会Python3 プログラミング勉強会
Python3 プログラミング勉強会Tetsuya Morimoto
 
「Python言語」はじめの一歩 / First step of Python
「Python言語」はじめの一歩 / First step of Python「Python言語」はじめの一歩 / First step of Python
「Python言語」はじめの一歩 / First step of PythonTakanori Suzuki
 
Pelicanによる www.python.jpの構築
Pelicanによる www.python.jpの構築Pelicanによる www.python.jpの構築
Pelicanによる www.python.jpの構築Atsuo Ishimoto
 
「Python言語」はじめの一歩 / First step of Python / 2016 Jan 12
「Python言語」はじめの一歩 / First step of Python / 2016 Jan 12「Python言語」はじめの一歩 / First step of Python / 2016 Jan 12
「Python言語」はじめの一歩 / First step of Python / 2016 Jan 12Takanori Suzuki
 
PECL operator で演算子オーバーロード
PECL operator で演算子オーバーロードPECL operator で演算子オーバーロード
PECL operator で演算子オーバーロードy-uti
 
python-twitterを用いたTwitterデータ収集
python-twitterを用いたTwitterデータ収集python-twitterを用いたTwitterデータ収集
python-twitterを用いたTwitterデータ収集Hikaru Takemura
 
FINAL FANTASY Record Keeperを支えたGolang
FINAL FANTASY Record Keeperを支えたGolangFINAL FANTASY Record Keeperを支えたGolang
FINAL FANTASY Record Keeperを支えたGolangYoshiki Shibukawa
 
10分で分かるRパッケージの作り方
10分で分かるRパッケージの作り方10分で分かるRパッケージの作り方
10分で分かるRパッケージの作り方Yohei Sato
 
PyCon JP 2014 plone terada
PyCon JP 2014 plone teradaPyCon JP 2014 plone terada
PyCon JP 2014 plone teradaManabu Terada
 
PHP 8 で Web 以外の世界の扉を叩く
PHP 8 で Web 以外の世界の扉を叩くPHP 8 で Web 以外の世界の扉を叩く
PHP 8 で Web 以外の世界の扉を叩くshinjiigarashi
 

What's hot (20)

Pyconjp2014_implementations
Pyconjp2014_implementationsPyconjp2014_implementations
Pyconjp2014_implementations
 
Tokyor14 - R言語でユニットテスト
Tokyor14 - R言語でユニットテストTokyor14 - R言語でユニットテスト
Tokyor14 - R言語でユニットテスト
 
debexpo(mentors.d.n)をハックするには
debexpo(mentors.d.n)をハックするにはdebexpo(mentors.d.n)をハックするには
debexpo(mentors.d.n)をハックするには
 
Pythonでの開発を効率的に進めるためのツール設定
Pythonでの開発を効率的に進めるためのツール設定Pythonでの開発を効率的に進めるためのツール設定
Pythonでの開発を効率的に進めるためのツール設定
 
ExcelとPythonによる社会インフラシステムの設定ファイルの自動生成
ExcelとPythonによる社会インフラシステムの設定ファイルの自動生成ExcelとPythonによる社会インフラシステムの設定ファイルの自動生成
ExcelとPythonによる社会インフラシステムの設定ファイルの自動生成
 
第1回python勉強会
第1回python勉強会第1回python勉強会
第1回python勉強会
 
オープンCAEとPython
オープンCAEとPythonオープンCAEとPython
オープンCAEとPython
 
XML-RPC : Pythonが「電池付属」と呼ばれる理由
XML-RPC : Pythonが「電池付属」と呼ばれる理由XML-RPC : Pythonが「電池付属」と呼ばれる理由
XML-RPC : Pythonが「電池付属」と呼ばれる理由
 
東京R非公式おじさんが教える本当に気持ちいいパッケージ作成法
東京R非公式おじさんが教える本当に気持ちいいパッケージ作成法東京R非公式おじさんが教える本当に気持ちいいパッケージ作成法
東京R非公式おじさんが教える本当に気持ちいいパッケージ作成法
 
Python3 プログラミング勉強会
Python3 プログラミング勉強会Python3 プログラミング勉強会
Python3 プログラミング勉強会
 
「Python言語」はじめの一歩 / First step of Python
「Python言語」はじめの一歩 / First step of Python「Python言語」はじめの一歩 / First step of Python
「Python言語」はじめの一歩 / First step of Python
 
Pelicanによる www.python.jpの構築
Pelicanによる www.python.jpの構築Pelicanによる www.python.jpの構築
Pelicanによる www.python.jpの構築
 
「Python言語」はじめの一歩 / First step of Python / 2016 Jan 12
「Python言語」はじめの一歩 / First step of Python / 2016 Jan 12「Python言語」はじめの一歩 / First step of Python / 2016 Jan 12
「Python言語」はじめの一歩 / First step of Python / 2016 Jan 12
 
PECL operator で演算子オーバーロード
PECL operator で演算子オーバーロードPECL operator で演算子オーバーロード
PECL operator で演算子オーバーロード
 
python-twitterを用いたTwitterデータ収集
python-twitterを用いたTwitterデータ収集python-twitterを用いたTwitterデータ収集
python-twitterを用いたTwitterデータ収集
 
FINAL FANTASY Record Keeperを支えたGolang
FINAL FANTASY Record Keeperを支えたGolangFINAL FANTASY Record Keeperを支えたGolang
FINAL FANTASY Record Keeperを支えたGolang
 
10分で分かるRパッケージの作り方
10分で分かるRパッケージの作り方10分で分かるRパッケージの作り方
10分で分かるRパッケージの作り方
 
PyCon JP 2014 plone terada
PyCon JP 2014 plone teradaPyCon JP 2014 plone terada
PyCon JP 2014 plone terada
 
PHP 8 で Web 以外の世界の扉を叩く
PHP 8 で Web 以外の世界の扉を叩くPHP 8 で Web 以外の世界の扉を叩く
PHP 8 で Web 以外の世界の扉を叩く
 
Introduction of Python
Introduction of PythonIntroduction of Python
Introduction of Python
 

Similar to Recording and Replay on HoloLens [dotNET 600]

CodeIgniter東京勉強会 2011.05.14
CodeIgniter東京勉強会 2011.05.14CodeIgniter東京勉強会 2011.05.14
CodeIgniter東京勉強会 2011.05.14Takako Miyagawa
 
KinectとC#を用いた 実践的VRアプリ開発 第2回 2015/10/13 Github CLI編
KinectとC#を用いた実践的VRアプリ開発 第2回 2015/10/13 Github CLI編KinectとC#を用いた実践的VRアプリ開発 第2回 2015/10/13 Github CLI編
KinectとC#を用いた 実践的VRアプリ開発 第2回 2015/10/13 Github CLI編Akihiko Shirai
 
Windows で拡張モジュールをビルドしてみた
Windows で拡張モジュールをビルドしてみたWindows で拡張モジュールをビルドしてみた
Windows で拡張モジュールをビルドしてみたy-uti
 
Code igniterでテスト駆動開発 資料作成中
Code igniterでテスト駆動開発 資料作成中Code igniterでテスト駆動開発 資料作成中
Code igniterでテスト駆動開発 資料作成中Takako Miyagawa
 
はじめてのCodeIgniter
はじめてのCodeIgniterはじめてのCodeIgniter
はじめてのCodeIgniterYuya Matsushima
 
Ruby向け帳票ソリューション「ThinReports」の開発で知るOSSの威力
Ruby向け帳票ソリューション「ThinReports」の開発で知るOSSの威力Ruby向け帳票ソリューション「ThinReports」の開発で知るOSSの威力
Ruby向け帳票ソリューション「ThinReports」の開発で知るOSSの威力ThinReports
 
使い捨て python コードの書き方
使い捨て python コードの書き方使い捨て python コードの書き方
使い捨て python コードの書き方Sho Shimauchi
 
【Unite Tokyo 2019】運用中超大規模タイトルにおけるUnityアップデート課題の解決手法と事例
【Unite Tokyo 2019】運用中超大規模タイトルにおけるUnityアップデート課題の解決手法と事例【Unite Tokyo 2019】運用中超大規模タイトルにおけるUnityアップデート課題の解決手法と事例
【Unite Tokyo 2019】運用中超大規模タイトルにおけるUnityアップデート課題の解決手法と事例UnityTechnologiesJapan002
 
130329 02
130329 02130329 02
130329 02openrtm
 
継続的インテグレーション3分クッキング
継続的インテグレーション3分クッキング継続的インテグレーション3分クッキング
継続的インテグレーション3分クッキングTakayuki Kondou
 
Twitterのデータを取得する準備
Twitterのデータを取得する準備Twitterのデータを取得する準備
Twitterのデータを取得する準備Takeshi Arabiki
 
Tizen 2.0 alpha でサポートされなかった native api
Tizen 2.0 alpha でサポートされなかった native apiTizen 2.0 alpha でサポートされなかった native api
Tizen 2.0 alpha でサポートされなかった native apiNaruto TAKAHASHI
 
ソフトウェアエンジニアのための「機械学習理論」入門・ハンズオン演習ガイド
 ソフトウェアエンジニアのための「機械学習理論」入門・ハンズオン演習ガイド ソフトウェアエンジニアのための「機械学習理論」入門・ハンズオン演習ガイド
ソフトウェアエンジニアのための「機械学習理論」入門・ハンズオン演習ガイドEtsuji Nakai
 
C++プログラマの為のセキュリティ入門
C++プログラマの為のセキュリティ入門C++プログラマの為のセキュリティ入門
C++プログラマの為のセキュリティ入門道化師 堂華
 
GMO プライベート DMP 開発で 取り組んできた DevOps と今後の展望
GMO プライベート DMP 開発で 取り組んできた DevOps と今後の展望GMO プライベート DMP 開発で 取り組んできた DevOps と今後の展望
GMO プライベート DMP 開発で 取り組んできた DevOps と今後の展望Tetsuo Yamabe
 
pi-1. プログラミング入門
pi-1. プログラミング入門pi-1. プログラミング入門
pi-1. プログラミング入門kunihikokaneko1
 
Tech Fielders 2009/9/18 LT
Tech Fielders 2009/9/18 LTTech Fielders 2009/9/18 LT
Tech Fielders 2009/9/18 LTterurou
 
12 総合演習Word Pressの利用
12 総合演習Word Pressの利用12 総合演習Word Pressの利用
12 総合演習Word Pressの利用文樹 高橋
 

Similar to Recording and Replay on HoloLens [dotNET 600] (20)

CodeIgniter東京勉強会 2011.05.14
CodeIgniter東京勉強会 2011.05.14CodeIgniter東京勉強会 2011.05.14
CodeIgniter東京勉強会 2011.05.14
 
KinectとC#を用いた 実践的VRアプリ開発 第2回 2015/10/13 Github CLI編
KinectとC#を用いた実践的VRアプリ開発 第2回 2015/10/13 Github CLI編KinectとC#を用いた実践的VRアプリ開発 第2回 2015/10/13 Github CLI編
KinectとC#を用いた 実践的VRアプリ開発 第2回 2015/10/13 Github CLI編
 
Windows で拡張モジュールをビルドしてみた
Windows で拡張モジュールをビルドしてみたWindows で拡張モジュールをビルドしてみた
Windows で拡張モジュールをビルドしてみた
 
Code igniterでテスト駆動開発 資料作成中
Code igniterでテスト駆動開発 資料作成中Code igniterでテスト駆動開発 資料作成中
Code igniterでテスト駆動開発 資料作成中
 
はじめてのCodeIgniter
はじめてのCodeIgniterはじめてのCodeIgniter
はじめてのCodeIgniter
 
Ruby向け帳票ソリューション「ThinReports」の開発で知るOSSの威力
Ruby向け帳票ソリューション「ThinReports」の開発で知るOSSの威力Ruby向け帳票ソリューション「ThinReports」の開発で知るOSSの威力
Ruby向け帳票ソリューション「ThinReports」の開発で知るOSSの威力
 
使い捨て python コードの書き方
使い捨て python コードの書き方使い捨て python コードの書き方
使い捨て python コードの書き方
 
【Unite Tokyo 2019】運用中超大規模タイトルにおけるUnityアップデート課題の解決手法と事例
【Unite Tokyo 2019】運用中超大規模タイトルにおけるUnityアップデート課題の解決手法と事例【Unite Tokyo 2019】運用中超大規模タイトルにおけるUnityアップデート課題の解決手法と事例
【Unite Tokyo 2019】運用中超大規模タイトルにおけるUnityアップデート課題の解決手法と事例
 
130329 02
130329 02130329 02
130329 02
 
継続的インテグレーション3分クッキング
継続的インテグレーション3分クッキング継続的インテグレーション3分クッキング
継続的インテグレーション3分クッキング
 
Twitterのデータを取得する準備
Twitterのデータを取得する準備Twitterのデータを取得する準備
Twitterのデータを取得する準備
 
Tizen 2.0 alpha でサポートされなかった native api
Tizen 2.0 alpha でサポートされなかった native apiTizen 2.0 alpha でサポートされなかった native api
Tizen 2.0 alpha でサポートされなかった native api
 
ソフトウェアエンジニアのための「機械学習理論」入門・ハンズオン演習ガイド
 ソフトウェアエンジニアのための「機械学習理論」入門・ハンズオン演習ガイド ソフトウェアエンジニアのための「機械学習理論」入門・ハンズオン演習ガイド
ソフトウェアエンジニアのための「機械学習理論」入門・ハンズオン演習ガイド
 
C++プログラマの為のセキュリティ入門
C++プログラマの為のセキュリティ入門C++プログラマの為のセキュリティ入門
C++プログラマの為のセキュリティ入門
 
私とOSSの25年
私とOSSの25年私とOSSの25年
私とOSSの25年
 
GMO プライベート DMP 開発で 取り組んできた DevOps と今後の展望
GMO プライベート DMP 開発で 取り組んできた DevOps と今後の展望GMO プライベート DMP 開発で 取り組んできた DevOps と今後の展望
GMO プライベート DMP 開発で 取り組んできた DevOps と今後の展望
 
Code ignitertalk 01
Code ignitertalk 01Code ignitertalk 01
Code ignitertalk 01
 
pi-1. プログラミング入門
pi-1. プログラミング入門pi-1. プログラミング入門
pi-1. プログラミング入門
 
Tech Fielders 2009/9/18 LT
Tech Fielders 2009/9/18 LTTech Fielders 2009/9/18 LT
Tech Fielders 2009/9/18 LT
 
12 総合演習Word Pressの利用
12 総合演習Word Pressの利用12 総合演習Word Pressの利用
12 総合演習Word Pressの利用
 

Recording and Replay on HoloLens [dotNET 600]