つくるの大好き。

つくるのが大好きな人の記録。

UnityネイティブプラグインをVisual Studio でステップ実行デバッグする

Unityのネイティブプラグインを開発していると、Unityで実行中にプラグイン内部のコードや変数の状態をデバッグしたくなる時がよくありますよね。
これは簡単な手順で行うことができるので手順を書いておきます。

デバッグ実行できる条件

つまり自作プラグインオープンソースのものであればデバッグ可能です。
反対に .dllファイルだけ提供されているようなプラグインデバッグできないということです。

デバッグ実行するための手順

ネイティブプラグインをDebugビルドする

Debug構成でプラグインをビルドします。 f:id:peugeot-106-s16:20190730153551p:plain

ビルドが成功すると .dllファイルと .pdbファイルが出力されます。 f:id:peugeot-106-s16:20190730153721p:plain

Unityのプラグインフォルダに必要なファイルを配置する

.dllファイルと .pdbファイルをUnity内のPluginsフォルダに配置します。 f:id:peugeot-106-s16:20190730153944p:plain

Visual StidoからUnityにアタッチする

Unityプロジェクトを開いたのち、プラグインプロジェクトを開いているVisual Studio の [デバッグ]-[プロセスにアタッチ]メニューを選択します。
"プロセスにアタッチ"ダイアログが表示されるのでUnityのプロセスを選択して[アタッチ]します。
プロセスはたくさん列挙されますが"unity"で絞り込めば見つけやすいです。 f:id:peugeot-106-s16:20190730154349p:plain

ブレークポイントの設定を行う

ステップ実行したい部分にブレークポイントを設定しましょう。

UnityでPlayする

この状態でUnityでPlayすると、なんということでしょう。
プラグイン側のソースコード上のブレークポイントが効きましたね。
もちろん、普通にステップ実行ができますし、変数の内容もウォッチすることができます。 f:id:peugeot-106-s16:20190730155029p:plain

ブレークポイントが効かない時は

プラグインプロジェクト側とUnity側で .dllファイルと .pdbファイルのバージョンが一致していないことが原因として考えられます。
再ビルドとUnityへのファイル更新を再度行ったり、Unityの再起動を行ってみてください。

まとめ

これでプラグインを絡めてUnityアプリケーションを開発するスピードが爆上がりですね(笑)!

Microsoft MVP を再受賞しました!

今年も Microsot MVP Awardを再受賞することができました!
カテゴリーはWindows Development でMixed Reality分野が引き続き主な活動領域です。

f:id:peugeot-106-s16:20190704150300p:plain
MVP Logo

mvp.microsoft.com

mvp.microsoft.com

ぼくが活動の指針としているのは、 高度な技術をギークのためだけではなく、一般の方々や子どもたちでも親しめるかたちにして知ってもらう という点です。
2019年度も引き続きこの指針で活動してゆこうと思っています。

今年はAzure KinectやHoloLens 2も出てくるので楽しい1年になりそうです。
子どももやんちゃ盛りでなかなかまとまった活動時間は取れませんが、それはそれ。その中での気づきやソリューションにきっと出会えるはず。
できる範囲でまた楽しくがんばります。

HoloLensにサインをもらった時の保護塗装について

今年も 5/29, 30日に「de:code 2019」 に参加しました!

www.microsoft.com

2年前に続き、HoloLensの産みの親、Alex Kipmanがこの日本にやってきてくれました。
これは本当に貴重な事です! f:id:peugeot-106-s16:20190605165644j:plain そしてぼくたちHoloLensコミュニティのために特別に直接面会する機会を設けてくれ、なんとHoloLensにサインを頂いてしまいました! f:id:peugeot-106-s16:20190605165829j:plain

サインを頂いたら保護しましょう

この貴重なサイン、できるだけ綺麗な状態を保ちたいですよね。
手が良く触れる場所なのでぜひ保護塗装をしましょう。

1. 必要なもの

  • マスキングテープ
  • HoloLensを包み込めるサイズの袋
  • 艶消しクリアーのスプレー塗料

f:id:peugeot-106-s16:20190605170240j:plain f:id:peugeot-106-s16:20190605170300j:plain

2. 塗装面は綺麗に

塗装面が油等で汚れていると塗料の乗りが悪くなりますので、乾いた布やティッシュ等で綺麗にしましょう。

3. マスキング

マスキングテープを使ってキッチリとマスキングを行います。ふちが浮かないように気を付けましょう。 f:id:peugeot-106-s16:20190605170546j:plain f:id:peugeot-106-s16:20190605170606j:plain

また、塗料がグラス面やHoloLens内部に入り込まないように塗装面を除き、全体をカバーします。
今回はちょうどde:code2019の紙袋があったので使ってみました。
(これは上質な紙が使われている関係で硬かったので、あまりマスキング向きではありませんでした(笑))
f:id:peugeot-106-s16:20190605170855j:plain

4. 吹く

スプレーは思い切って一気にムラなく塗ることが大切です。弱気でもムラになりますし、強気すぎるとタレが発生するので気を付けましょう。
スプレー缶はよく振って、練習で試し吹きして感じを掴みましょう。


HoloLens塗装 大

さあでは気持ちを決めたら、慎重かつ大胆に吹いてしましましょう!
塗装面全体に均一に塗料が乗れば成功です! f:id:peugeot-106-s16:20190605171942j:plain

5. 乾燥!乾燥!乾燥!

乾燥はとても大切な工程です。塗装が済んだら触らずじっくりと乾燥させましょう。
この時空気が湿っていると時間がかかりますし気泡が発生しやすいので、そもそも塗装作業は好天が続く空気の乾燥した時に行うのがおすすめです。

では、しっかり乾燥させたらマスキングを取りましょう!
f:id:peugeot-106-s16:20190605172505j:plain はい!ちょっと乱暴にマスキングを取ってしまったので見事に左上の塗膜がはがれてしましましたー!!
乾燥時間を1日しかとらなかったのも敗因かもしれませんw

というわけでじっくり乾燥させる事と慎重なマスキングはがしは本当に大切です。皆さん気を付けましょう(笑)

なお、すこしふちがけば立っていますが、しばらくするとなじんだり削れたりして目立たなくなってゆきます。

まとめ

というわけで、きっと世界に2台とないAlex KipmanダブルサインのHoloLensの保全作業が完了です。


IMG 0875

リモートワークについてのありがたいお話 for 朝礼

はじめに

持ち回りで朝礼でありがたいお話をすることになっているので、明日の話をつくりました。
社内向けの構成ですがせっかくなので公開しておきます。
なお、明日は会社に行けそうにないのでリモートで話しますw

RemoteWork について

社会的に

https://ideasforgood.jp/2019/03/18/remote-work-eco/

  • CO2削減
    平均的な会社員の仕事関連の二酸化炭素排出量の90%以上は、通勤で占められている
  • 電力消費量削減
    従業員は、会社にいるときよりも自宅にいる時のほうが電力消費に敏感になる
  • ごみ削減
    自宅で働く人は会社で働く人に比べ、テイクアウトをせずに自分で朝食や昼食を作る傾向があり、包装ごみの削減に貢献する

  • 参考:東京都への通勤人口は300万人くらい http://www.metro.tokyo.jp/tosei/hodohappyo/press/2018/03/20/12.html
    この規模でエネルギーと時間が節約されたら、、しゅごい、、

会社的に

  • 東京オフィス狭いw
    全員の常設のデスクだけでいっぱいで広い場所が必要なxR系の開発には不向き
  • 海外との仕事が増えるとそもそも時間は合わないので同じ場所、時間に集まるということは減っていくであろう
    →シアトルにいるときはホテルで就寝前に翌日のデイタイムを生きている日本のチームと仕事して実感w

個人的に

  • 子どもが小さいうちはできるだけ一緒に時間を過ごしたい
  • お子様の急な発熱ははんぱないよ!
    →無用に家から離れるというリスクを減らしたい

導入の課題

  • 場所と時間の縛りが消えるので 成果縛り になる
  • というわけで向いてる人と向いてない人がいる
    →(リモートワークはうまくできる人がひとつのツールとして使うものだと思ってる)

ひとつの解決策: xR

  • xRの価値ってなに?
    場所と時間を超越できること
    (xRチームとしては世の中に先行して場所と時間を乗り越えるノウハウを持ち、ナレッジを提供していければと思ってる)

事例

GitリポジトリをまたいだUnityプロジェクト間のソース共有

今日Twitter上でちょっと話題が出たUnityプロジェクト間でのソース共有について今運用している方法を書きます。

Unityプロジェクト間でのソース共有でよくあるのが下記パターンかなと思います。

  1. ファイルコピー
  2. Unityパッケージをエクスポート/インポート

いずれも人力なので事故りやすくちょっと21世紀のやり方じゃないような気がしますね(笑)
そこでgit submodule を使ってみました。

プロジェクトの構成

共有する方のUnityプロジェクトSharedLibと共有される方のUnityプロジェクトAppがあるとします。
それぞれは別のGitリポジトリに保存されているとします。

f:id:peugeot-106-s16:20190130224322p:plain

Unityプロジェクトを git submodule した際の問題点

この場合App/Assets配下のフォルダに普通にgit submodule するとSharedLibのProjectSettings等もpullしてしまうのでおかしなことになります。

f:id:peugeot-106-s16:20190130224152p:plain

特定のフォルダ配下のみをpullする設定

git submoduleすると共に特定のフォルダ配下のみをpullする設定 "core.sparsecheckout" を有効にし、指定フォルダ名を設定ファイルに書き込んだあとpullします。 この一連の処理は開発メンバー1人1人がローカルで行う必要があるので、下記のようなバッチファイルを作って共有しました。

git submodule add --force https://github.com/HogeHoge/SharedLib.git Assets/SharedLib
git commit -m "add module"
cd Assets/SharedLib
git config core.sparsecheckout true
echo /Assets/SharedLib/ > ../../.git/modules/Assets/SharedLib/info/sparse-checkout
git read-tree -mu HEAD

こうすると必要なファイルだけpullすることができるようになります。

f:id:peugeot-106-s16:20190130225407p:plain

最新状態に同期する

git submoduleというのはリポジトリのあるcommitに対してリンクを貼るものなので、SharedLibリポジトリにその後入った変更が自動的にAppリポジトリに反映されることはありません。
最新版に同期したいときは下記のコマンドを利用します。
これも開発メンバーが個々にローカルで行う必要があるのでバッチファイルにして配布しています。

git submodule foreach git pull origin master

このバッチを走らせてね~!っていう通達は人力なので「勝手にやらない」「やるときはみんなやる」っていうのを気を付けないといけないといえばいけないですが、勝手にしても自分にビルドエラーが出るくらいの軽傷で済むのではないでしょうか。

ちなみにバッチファイルはAppリポジトリに含めることで配布し、README.mdに説明を書いておきました。


便利なバッチファイルを作りました。

  • AddModule.bat - submoduleを追加します。1度だけ使ってください。
  • UpdateModule.bat - 最新のFrameworkに更新します。何度でも使えます。

まとめ

GitリポジトリをまたいだUnityプロジェクト間のソース共有を git submodule で行う方法を書きました。
今のところ無事故でうまくいっているのでよかったら参考にしてください。

2018 仕事でやったこと改革したこと

2018年もいよいよ終わりが近づきました。
本年も大変お世話になりました!
今は来年引き続きのことで気は忙しいけど軽くまとめておこうと思います。

主に手がけたこと

  • Android向けSDK開発
    AndroidC++とUnityなもの。xR領域のものです。
    設計能力と実装能力とチームマネジメント能力が大いに鍛えられましたw
    今年の大半はこれをやっていました。

  • 日本テレビさんのxR関連
    真夏の音楽特番 「THE MUSIC DAY」のAR連動はテンションが上がりました。
    日本中のものすごくたくさんの家庭に番組の進行と同期してアーティストがお邪魔しました。
    また王子関係もありましたw

www.ntv.co.jp

www.yomiuriland.com

その他、会社のまとめページ https://www.systemfriend.co.jp/business/xr

働き方改革

今年は若干自分のチームが大きくなりました。
そうするとマネジメントっていうタスクがどうしても出てくるわけですが、自分の働き方の基本コンセプトとして下記を死守するために色々と効率を上げる工夫をしました。

  • 18:00には家に帰って子どもをお風呂に入れる
  • 興味のあることだけやりたいw
  • 仕事時間の50%以上は開発をする
    (営業・マネジメント系に費やす時間を限りなくゼロに近づけたい)

チームの目標設定

チームの一人一人に指示をするのは大変なので自分で考えて動けるようにチームの大きな目標を掲げました。
方向性に迷ったらそれを見て進むべき道を考えてねっていう感じなればマネジメント不要に近づけそう。
そしてそのドキュメントのURLをSlackのトピックに設定しいつでも参照できるようにしました。
f:id:peugeot-106-s16:20181226155945p:plain

ちなみにチームの目標はこれらです。

  • 楽しいことだけやって生きられるようにしよう
    (そうすればきっと他の人を楽しい気持ちにするものが作れるよ)
  • 最も価値があるのは”時間”なので自分の時間を作れるようにしよう
  • 難しい問題を解決しよう
    (プロとして同じことをやるにしても最も美しいコードで問題を解決しよう)
  • 新しい技術に関する知識を得よう

ワークフローと担当エリアの明確化

新しく入ってきた人に同じことを説明する時間を節約するためにぼくたちはどんな流れで仕事を継続的にしているかと、だれがどこをカバーしているかを可視化した資料をつくりました。
青字はメンバーのイニシャル。マッピングが多いほど望ましいw
そのうちマッピング数、各タスクでの活躍を評価なんかにもしてゆきたい感はあるけどまあおいおいですねw
要は時間ができたらこれを見て、次の動きを自分を拡張できる方向で考えて動いてねっていう意図で書きました。
これもSlackのトピックから常時アクセス可能になっています。

f:id:peugeot-106-s16:20181226160611p:plain

進捗確認の自動化

進捗どうですか?って聞いて回るだけでたくさんの時間を浪費してしまいますよね。
そこで平日の毎朝始業時間にチーム全員に今日やることを聞いてくれるbotをSlackに仕込みました。

f:id:peugeot-106-s16:20181226161248p:plain

大事なのは「今日やったこと」ではなく「今日これからやること」がイメージできているかという点だと思っているので未来のことを聞きます。
多分記入には1人1分もかかってないかなと思います。
ぼくの内容確認が1人1秒~5秒。
問題なければOKスタンプをつけるだけで終了です。 そしてもし方向性の調整や追加のお願いが必要だなと思ったらコメントで会話して手を付ける前に調整をお願いします。

ぼくは9:00には大抵会社にいないので電車の中でこれらが完了していることも大きなポイントかなと思っています。

日々だいたいのことが把握できているのでグループでのMTGは1週間に1回、10分以内で終わる感じです。

これらが功を奏しているのか、チームとしても社内でほとんど残業はしないけど最もパフォーマンスの高い存在になれているんじゃないかな。

まとめ

こんな感じで楽しく生きるための工夫を考えて試行してみるのは楽しいなと気づいた今年でもありましたw
来年も楽しくしたいな~。
来年もどうぞよろしくお願いします!

Unity2018.3でのHoloLensビルドのコード最適化設定 (MasterWithLTCGビルド)

Unity2018.3.0f2が正式版として落ちてきましたので早速HoloLensアプリのビルドを試してみました。

MasterWithLTCG ビルド設定

Unityからは普通にVisual StudioのIL2CPP のUWPプロジェクトを書き出すわけですが、VSでビルド設定をReleaseに変更しようとした際に見慣れぬ設定があることに気づきました。

この "MasterWithLTCG" という設定です。
f:id:peugeot-106-s16:20181217213747j:plain

Unityのリリースノートを調べると2018.3.0b9から導入されたもののようです。

unity3d.com

そしてLTCGというのは "Link Time Code Generation" 「リンク時コード生成」の略ということがわかりました。

そしてLTCGとはなんぞやということはこちらに書かれていました。意外と古くからある機能なのですね。

Under The Hood: Link-time Code Generation | Microsoft Docs

こちらはオフィシャルなリファレンス。

/LTCG (Link-time Code Generation) | Microsoft Docs

そして "MasterWithLTCG" ビルド設定とはこのLTCGが有効とされるビルドということになります。

LTCGする意味

ここから先は調べてみてきっとそういうことだなと理解したことなので正確ではないかもしれませんw

そもそもHoloLensプロジェクトはIL2CPPのプロジェクトとして出力されていますからコードはIL(Intermediate Language)からC++コードに変換されているわけですが、Masterビルドでのビルドプロセスは下記となります。

  1. コンパイラ:各cppファイルがobjファイルに変換される。この時コードオプティマイズも行われる
  2. リンカ:各objをマージしてexeファイルとする

これがMasterWithLTCGビルドでは下記になります。

  1. コンパイラ:各cppファイルがobjファイルに変換される。この時コードオプティマイズも行われる
  2. リンカ:各obj間の関数呼び出しをインライン化する等のオプティマイズを行う。
  3. リンカ:各objをマージしてexeファイルとする

なのでMasterWithLTCGビルドの方がリンク時間が長くなるはずです。
実際に計測してみました。

Master
1>Total compilation time: 88144 milliseconds.
1>Total link time: 16372 milliseconds.

MasterWithLTCG
1>Total compilation time: 49604 milliseconds.
1>Total link time: 158050 milliseconds.

コンパイル時間が短くなっているのは謎ですがリンク時間は10倍程度長くなっていますので色々頑張っている様子が伺えます。

生成されたDLLファイルのサイズは下記の通り。 単純には言えませんがインライン展開によってマシン語レベルでコードが増えた結果かもしれません。

Master
f:id:peugeot-106-s16:20181217215859p:plain

MasterWithLTCG f:id:peugeot-106-s16:20181217215928p:plain

まとめ

Unity2018.3でHoloLensプロジェクトを出力した際に現れる"MasterWithLTCG" ビルド設定の効能について書きました。
今回は比較的シンプルなアプリケーションでテストしたため実際に高速化の恩恵を体験することはできていないのですが、最終リリースをこの設定でビルドして少しでも高速化しておくことは意味がありそうだと思いました。

調査の経緯はこちらのツイートにもスレッド化されています。