Photon Realtimeのネットワーク上でNetcode for GameObjectsで作ったアプリケーションを利用してみる

はじめに

エンジニアの松原です。最近はメタバース関連の話題をあらゆる媒体で見るようになりましたが、開発者目線ではメタバースでのインフラ部分で利用されているリアルタイムネットワークのクライアントやサーバーの設計が気になるところです。
プレイヤーの参加人数によってサーバーやクライアントアプリケーションに求められる機能や構成が変わってくるので、「これをやれば正解」というものが無いのがリアルタイムネットワークの面白さでもあります。

さて、これまで本ブログでは以前の記事(その1その2その3その4)のように、Netcode for GameObjectsで利用するコンポーネントやセットアップ方法などを紹介をしてきました。 今回はNetcode for GameObjectsのもう一つの目玉機能であるTransportsについて紹介したいと思います。
この機能はサードパーティー製のネットワーククライアントをプラグインとして取り込むことができ、これまでの記事で書かれたコード実装を変更せずに、そのサードパーティー製ネットワークの仕組みをそのまま利用できるようなる環境を用意してくれます。

docs-multiplayer.unity3d.com

具体例として、Photon Realtimeのネットワークを利用して、Netcode for GameObjectsを動かせるようにしていきます。今回はMultiplayer Community Contributionsと呼ばれている有志達によって実装されているパッケージを利用します。

github.com

今回の内容を反映したものを個人のGitHubリポジトリにアップロードしておりますので、もしよろしければ触ってみてください!

github.com

今回の機能を反映したサンプルシーン名は SampleScene_PhotonNetwork.unityになります。



Community Transportsをインストールする

まずはメニューの Window > PackageManager のウィンドウを表示します。表示できたらウィンドウの左上の【+(プラスマーク)】のプルダウンをクリックし、【Add package from git URL】をクリックします。



赤枠の欄内に下記に指定するURLを入力します。



このURLはInstalling Community Transportsの指定の通り、PackageManagerからインストール際のURL指定を指示通り書き換えたものを使用します。

Use the following URL in the package manager to add a transport via git URL. Change com.community.netcode.transport.enet to any of the packages in the Transport folder to choose which transport to add:
https://github.com/Unity-Technologies/multiplayer-community-contributions.git?path=/Transports/com.community.netcode.transport.enet

今回はPhoton RealtimeのCommunity Transportsを利用したいので、以下のURLを入力します。サンプルでは少し前のNetcode for GameObjectのバージョンを利用しているため、そのバージョンに対応したCommitIDのリビジョン番号を含めています。

https://github.com/Unity-Technologies/multiplayer-community-contributions.git?path=/Transports/com.community.netcode.transport.photon-realtime#8e87c82deafbac1f73e47c8e2a00d134c51031bd


URLを入力して、【Add】をクリックします。ダウンロードが終わるまでしばらく待ちます。



これでPhoton Realtimeを利用できるCommunity Transportsのインストールができました。簡単ですね!

Photon App Settingsの設定を行う

次はPhoton Realtimeのネットワークを実際に利用するための設定を行います。Photon Cloudが利用できることを前提に記事を書いていますので、下記のように事前に必要な手続きがあります。もし下記内容が事前に済んでいましたらスキップしてもらっても構いません。

事前にしておくこと

あらかじめPhotonのアカウントを作成し、サインインしてダッシュボードに入れるようにしておきます。

id.photonengine.com

以下の画面のようにダッシュボード上にアプリの登録が無い場合、【新しくアプリを作成する】を押します。



Photonの種別には【Realtime】を選択しておき、アプリケーション名の箇所に任意の名前を入れて【作成する】を押します。



作成後、ダッシュボード画面に戻ります。この時先ほど作成したアプリのカードが追加されていると思うので、【アプリケーションID】の横にGUIDの文字列の一部が表示されていますので、そこをクリックします。



クリックするとGUID全体が表示された状態になりますので、Ctrl+Cを押してコピーしておきます。これは後で必要になりますので、クリップボードコピーが心配なら、メモ帳などに一時的に残しておいても良いかもしれません。



これで事前準備完了です。

Photonの設定を変更する

PackageManagerでPhoton RealtimeのCommunity Transportsをインストールした後、Assets配下に Photon/Resources/PhotonSettings.assetというファイルが自動生成されます。このファイルはPhotonの設定を行うもので、今回はPhoton CloudのApp IDを指定します。



App Id Realtimeに取得したPhtonのアプリケーションIDの値を入力し、Fixed Regionにjpを入れておきます。



Transportを差し替える

使用するTransportをPhotonRealtimeを使用するものに変更します。まずはHierarchyからNetworkManagerを選択します。



前に設定したU Net Transportなどのコンポーネントが残ったままになっている場合、先にこのコンポーネントを削除します。コンポーネントを右クリックして、【Remove Component】でコンポーネントを削除します。



NetworkManagerコンポーネントのTransport設定が初期化されますので、【Select transport...】のプルダウンをクリックします。



PhotonRealtimeTransportを選択します。



Photon Realtime Transportのコンポーネントが自動追加されますので、設定します。
RoomNameを指定しておくことでサーバー側で作ったルームと接続先のルームを一致させることができるので、適当な名前を指定しておきます。
また、Batch Modeに【Reliable And Unreliable】に指定することで、MLAPIのイベント処理を効率的に送られるようになります。ネットワークが安定しない場合は【Send All Reliable】を指定しておくことで安定化しますが、遅延などが大きくなる可能性があります。



あとはビルドして試すだけです。立ち上げる際は最初のアプリは【Start as a host】か【Start as a server】を選択してネットワークに参加し、2つめ以降を【Start as a client】にすることでマルチプレイでの参加が可能になります。



最後に

今回はNetcode for GameObjectsのTransportを差し替えることによって、Photon Realtimeのネットワーク上で動作させる内容を扱いました。基本ネットワークエンジンは指定のSDKを使うことが前提となっているため、Netcode for GameObjectsのようにTransportを差し替えて使用できるライブラリは現状少ないかと思います。
開発が進んでくるとライブラリに強く依存するようになるのですが、開発の後半でTransportを差し替えてサードパーティー製のネットワークを切り替えて負荷を見ていくこともできるので、この仕組みはNetcode for GameObjectsを採用するアドバンテージの一つになりそうです。

エンジニアリングマネージャー目線で見るライブラリ技術選定の勘所

技術選定、してますか?

こんにちは!エンジニアリングマネージャーの佐藤(@unsoluble_sugar)です!

今回は開発関連のライブラリやアセットを導入する際に、個人的に見ている技術選定過程のポイントについて書き残してみることにしました。

エンジニアであれば様々な場面で技術選定の判断を求められるかと思います。フロントエンドやサーバサイド、ネットワーク・インフラ構築、CI/CDといった開発領域。OS、言語、フレームワーク、開発ツール、SaaS、プラットフォームetc...

挙げだすとキリがないですよね。

f:id:unsoluble_sugar:20200105164117j:plain

個人開発等でユーザーの母数が小さかったり、運用期間が短く影響範囲が軽微な場合はそれほど気にしなくて良いかもしれません。一方で、企業としてシステム・アプリ開発をする上では、開発して終わりではなく中長期での運用保守が前提となりますので、サービス継続のための様々な点に注意しなければなりません。

対象プラットフォームや開発規模に応じて見るべきポイントは変わるでしょうが、本記事ではライブラリやアセットといった粒度にフォーカスを絞ることにしました。事例を交えつつ、ある程度汎用的に使えそうな技術選定の勘所をまとめています。

「実務経験が浅く、正直どの技術を使えば良いかわからない」といった若手エンジニアさんや「なぜその技術を選んだのか?と問われた際にきちんと説明できるようにしておきたい」という方に、技術選定における指標のひとつとして参考にしていただければ幸いです。

技術選定で見るべき観点

技術選定で見るべき観点として、大枠以下のような要素が挙げられるかと思います。

  • 要件の整理
  • 評価基準の明確化
  • 候補のリストアップ
  • 技術選定
    • 機能面
      • 要求を満たしているか
      • 拡張性
      • 制限事項
    • 導入
      • 実績(導入事例)
        • ネット情報数≒利用者数
      • 継続性
      • イニシャルコスト(学習コスト)
        • サンプルプログラムの質
        • ドキュメントの充実性
        • 扱いやすさ
    • 運用・保守
      • 第三者評価
      • 問い合わせ窓口
      • GitHubリポジトリがあるなら
        • ライセンス形態
        • 開発者のバックグラウンド確認
        • コントリビューター数、スター数
        • 更新頻度
        • issue、プルリク対応の様子
      • セキュリティ
        • メンテナンス、アップデート体制
      • ランニングコスト
        • サブスクリプション型
          • 月額・年額費用の算出
        • 従量課金制の場合
          • APIなら時間帯位でのcall数やトラフィック量
          • SaaSならストレージ使用容量、セッション数、インスタンス起動時間など
      • スイッチングコスト
        • 依存関係
        • 類似ライブラリの候補も挙げておく
          • できれば定期的にウォッチ

これらの要素についてザッと見ていきましょう。

カテゴライズが曖昧だったり話の順序が前後したりしてますが…まぁ大目にみてやってください(予防線

要件の整理

大前提として「何を実現したいか」「何が達成できれば良いのか」を明確にしておく必要があります。システム開発における「要件定義書」にあたる情報がまとまっていると、技術選定も比較的進めやすいですね。

最近ですと、Design Docを採用している組織も多いでしょうか。

www.flywheel.jp

shimo5.me

atmarkit.itmedia.co.jp

キッチリと固まった段階でなくとも、技術選定と並行してこのようなドキュメントを整備していけば、判断基準も自然に定まっていくと思います。

評価基準の明確化

社内リソースで対応する場合であれば、担当メンバーの技術スタック(スキル・前提知識の有無・相談相手が居るか等)、キャッチアップ速度、学習コストをもとに技術選定を進めることが多いでしょうか。

開発期間や予算感によっては、外注できるか否かも判断基準のひとつになりますね。イニシャルコスト、ランニングコストに加えて、スイッチングコストも考慮する必要があります。

例えば利用しているライブラリのサポートが、OSのバージョンアップに追従できず途絶えてしまったり、機能改修が困難になりプラットフォームやサービスそのものがクローズしてしまうといった場合は、否応なく乗り換えが迫られます。

こういったリスクに対する余力はあるか?突発で対応依頼できるプールはあるか?開発速度と安定性のバランスはどう見るべきか?

開発チームに留まらず、経営層・ステークホルダー含めて中長期目線での判断基準を持っておくべきでしょう。

候補のリストアップ

要件を整理し、ある程度の判断基準を設けたら、ざっくり粒度で良いので関連領域においてどのようなライブラリが存在するか情報収集します。いくつかのキーワードの組み合わせでググって、検索上位に出てくる情報数多めなものをリストアップしておけば一旦大丈夫です。

続く技術選定の部分で詳細を辿っていくので、もしここで挙げた候補が見当外れであれば、改めて別のアプローチでリストアップし直せば良いだけですからね。

技術選定

前述の内容と重複する部分もありますが、候補がリストアップできたらライブラリのドキュメントを眺めたり実際に触ってみて、果たして本当に使えるものか見定める段階に入ります。

社内にノウハウや前提知識がない領域では「正直触ってみないとなんも分からん」状態で見積もりが出しづらいため、技術選定には一定の調査期間を設けて取り組むのが無難です。

規模感次第ではありますが、2,3日で終わるものもあれば1ヶ月~数ヶ月要することもあるでしょう。とはいえ仮の期間を設けて注力すれば、「わりとサクッと出来ちゃいそう」「もう少し時間必要かも」「他チームのあのメンバーにも協力して欲しい」とか何となく肌感が掴めます。100%技術調査に時間をかけられるなんてことは稀ですので、そのあたりも鑑みて今後の方針どうするかの議論を進めていくのが建設的ですね。

特にCTO、テックリード、エンジニアリングマネージャーといった役割を担う立場であれば「なぜその技術を選んだのか?」という説明責任を果たす必要があります。エンジニアメンバーからの提案に対しても、よくヒアリングし、気になる点があればディスカッションを重ねた上で慎重に検討していきましょう。

機能面

どの程度要件を満たしているか。パフォーマンスは十分か。拡張性はあるのか。要件の整理工程で洗い出した条件のマッチ具合を見ていきましょう。β版や新しくリリースされたばかりのライブラリは、機能も絶賛開発中で不具合に悩まされることもあります。

不足分は別のライブラリを使用すれば埋められるのか?自作でカバーできる範囲なのか?

一定の実務経験を積めば、過去の開発事例から注意を払わなければならないポイントも見えてきますが、比較的若いエンジニアメンバーで構成された組織ではこのあたり見落としがちです(自分もよく苦労しました)。

導入

流行りに乗って新しいライブラリを導入してみたが、サンプルプログラムの質が微妙だったりドキュメントが整備されていなかったりと「想像以上に学習コストが高かった…」なんてケースもありえます。

大体新しい技術を素早くキャッチアップしてアウトプットしている組織は、レベルの高いエンジニアが居るからこそ実現できているのです。成熟しきっていない技術は導入事例が少なく、参考情報も無く開発が難航することも多々あるでしょう。

一時は熱狂的な盛り上がりを見せていたライブラリが、1,2年後にひっそりと消えてたなんてことはザラにあります。仮に新しいライブラリを導入する際は、担当メンバーや組織にそれ相応の胆力があるかどうかも重要です。

また、忘れてはならないのがライセンスの話です。OSSに関してはここ数年で体系的に学べる書籍が出ているので、開発組織で購入したり社内勉強会等の場で知見共有すると、エンジニアメンバー間での認識も深まることでしょう。

運用保守

技術が好きなエンジニアであれば「最新技術を触ってみたい!」と思うのは至極当然の欲求です。しかしながら、ことビジネスの場においては、ある程度枯れた技術の方が最適な場合もあります。

新しい技術に興味を持って「やってみたい」という人は一定数居る反面、運用保守フェーズに入っているシステムでは即戦力が求められます。何か問題が起きた際の対応に関しては、前提知識がなければトラブルシューティングをこなすことが難しいケースも多いでしょう。

仮に「社内リソースで抱えきれないため外注に出す」という方針になっても、そもそもの母数がなければお願いする相手が居ないという状況が容易に発生します。メインの開発メンバーが離脱してしまうといった場合にも、その穴を埋めるための人員確保が必要です。

技術選定においては、その技術を扱える人材の流動性も考慮しなければなりません。最悪の場合、サービス運用面では至極健全にもかかわらず、開発人員が確保できないためクローズせざるを得ないといった事態に陥るでしょう。

そのような観点では、ライブラリの更新頻度やコントリビューター数、issue、プルリク対応の様子などをしっかり見定めることも大事です。例えばアセットやフレームワークに内包されたライブラリに脆弱性が見つかった際、すぐに対応が施されアップデートで事なきを得られれば「信頼性が高いライブラリ」と言えるでしょう。

逆にいつまで経っても対応の気配が見られず、対象部分がブラックボックス化されており自力での差し替えも難しいといった状況では、セキュリティリスクに晒され続けることになります。

最近はSlackやDiscord上でQ&Aのやり取りが交わされているケースもありますから、コミュニティに飛び込んで活発度を俯瞰するのもアリですね。

事例紹介

ここまでフワッとした持論を展開してきましたが、最後に事例紹介を挙げてお開きとさせていただきます。

先日社内のWebAR関連の技術調査の一環として、Unityで使えそうなARライブラリを調べていました。いくつか候補が挙げられていた中で、自分が調査担当となっていたARWTについての情報を転記しておきます。

github.com

デモ動画だけ見ると「めっちゃ良さげやん」ってなるやつです。

youtu.be

結果的には採用するに至らなかったライブラリとなりますが、技術選定の過程として具体的にどのような部分を見て判断を下したのか、少しでも参考になれば幸いです。

ARWT調査メモ

以下、調査しながら箇条書きで書き残したメモです。

こんな感じで情報収集し、今回は深入りしないことにしました。

蛇足

ちなみにARWT以外の候補として、他メンバーがPlayCanvas8th Wallも見てくれていました。特に8th Wallは、直近でNiantic に買収されたというニュースが飛び込んできて驚きましたね。

大手企業の後ろ盾があると、開発基盤やサポートまわりも確固たるものとなるでしょう。このような最新情報のキャッチアップも、技術選定をする上では欠かせませんね。

まとめ

少数精鋭のスタートアップやベンチャーですと、わりとこの手の判断が個人依存の暗黙知となっていることも多く、開発が佳境に迫った頃に「実は肝心な部分を見落としていた」なんてことも珍しい話ではないでしょう。

そんな悲しい事件を防ぐためにも、エンジニア組織内でこういったノウハウを可視化、テンプレ化しておくとメンバー入れ替えが起きても一定の担保が得られるのではないかと思います。できれば複数人のメンバー目線の意見を突き合わせて、納得感のある技術選定をしていきたいですね。

これ以上の粒度で事細かに書いていくとキリがなさそうだったので、今回は要点を絞って書き連ねてみました。

「こんなところも見た方が良いのでは?」というアドバイスや「この観点の抜け漏れで詰んだ…」等のエピソードがあれば、ぜひコメントやSNSシェア経由で教えていただけると嬉しいです。

最後に

本テックブログやnote記事のお知らせは、Synamon公式Twitterで発信しています。弊社の取り組みに興味を持っていただけましたらぜひフォローお願いします!

twitter.com

カジュアル面談も実施しているので「詳しく話を聞いてみたい!」という方は、こちらもチェックいただけると嬉しいです。

▼カジュアル面談はMeetyから   meety.net  

▼エントリーはこちら   herp.careers

HoloLens2をさわってみた [第4回_AzureSpatialAnchorsを使った空間同期]

はじめに

こんにちは、エンジニアの伊藤(@kazuyaplus)です。
前回はWindowsDevicePortal を使い2台目のホロレンズに、自作アプリをインストールする方法を紹介しました。

第4回ではAzureSpatialAnchorsを使い、2台のホロレンズで同じオブジェクトを同じ場所で共有する方法を紹介していきたいと思います。

第1回から同じプロジェクトを使用しているので、不明な点がある場合は第1回目から確認してみてください。

  • 第1回 : ひとりで使えるHololens2アプリをつくる ~Unity・VisualStudio・MRTKのインストールからビルドまで ~
  • 第2回 : 他の人と使えるHololens2アプリをつくる ~PUN2を使ってオブジェクトを共有~
  • 第3回 : Tips ~Wi-Fiを使ってアプリをインストール~
  • 第4回 : 他の人と同じ空間で使えるHololens2アプリをつくる ~AzureSpatialAnchorsを使った空間同期~

用語集

  • MRTK
    • [Mixed Reality Toolkit]の略で、AR、VRで使えるUIライブラリ
  • PUN2
    • [Photon Unity Networking2]の略で、Unityにオンライン機能を組み込むためのサービス
  • AzureSpatialAnchors
    • 複数のユーザーが同じ物理的な場所にデジタルコンテンツを配置できるようにするためのサービス

検証環境

  • Unity:2020.3.26f1
  • MRTK:2.7.3
  • VisualStudio:2019
  • Device:HoloLens2

手順

シーンの準備

[Hierarchy]で、SharedPlaygroundオブジェクトを展開し、さらにTableAnchorオブジェクトを展開します。

プロジェクトウィンドウで、Assets > MRTK.Tutorials.MultiUserCapabilities > Prefabsフォルダーに移動し、

ButtonsプレハブをTableAnchorにドラッグして、TableAnchorオブジェクトの子としてシーンに追加します。

シーンを操作するためのボタンの構成

次に、AzureSpatialAnchorsを使用するために、ボタンイベントを設定していきます。

[Hierarchy]で、Buttonオブジェクトを展開し、[StartAzureSession]を選択します。

[Inspector]で、Interactableコンポーネントを見つけ、OnClickイベントを次のように設定します。

  • None(Object)フィールドに、TableAnchorオブジェクトを割り当てます。
  • [NoFunction]から、 AnchorModuleScript > StartAzureSessionを選択します。

次に同じ階層内の、[CreateAzureAnchor]を選択します。

同じように、Interactableコンポーネントを見つけ、OnClickイベントを次のように設定します。

  • None(Object)フィールドに、TableAnchorオブジェクトを割り当てます。
  • [NoFunction]から、 AnchorModuleScript > CreateAzureAnchorを選択します。
  • 表示される新しいNone(Object)フィールドに、TableAnchorオブジェクトを割り当てます

次に同じ階層内の、[ShareAzureAnchor]を選択します。

同じように、Interactableコンポーネントを見つけ、OnClickイベントを次のように設定します。

  • None(Object)フィールドに、TableAnchorオブジェクトを割り当てます。
  • [NoFunction]から、 SharingModuleScript > ShareAzureAnchorを選択します。

次に同じ階層内の、[GetAzureAnchor]を選択します。

同じように、Interactableコンポーネントを見つけ、OnClickイベントを次のように設定します。

  • None(Object)フィールドに、TableAnchorオブジェクトを割り当てます。
  • [NoFunction]から、 SharingModuleScript > GetAzureAnchorを選択します。

Azureアカウントを作成する

AzureSpatialAnchorsを使うために、Azureのアカウントをこちらから作成しましょう。

アカウントを作成したら、画像の赤枠で囲った箇所の[Account ID] [Account Domain] [Primary key]をコピーしておきましょう。

シーンをAzureリソースに接続する

[Hierarchy]で、SharedPlaygroundオブジェクトを展開し、TableAnchorオブジェクトを選択します。

[Inspector]で、Spatial Anchor Manager(スクリプト)コンポーネントを見つけます。

事前に作成したAzureSpatialAnchorsアカウントの情報を使用して[Credentials]セクションを設定します。 

  • [Spatial Anchors Account ID]フィールドに、Azure SpatialAnchorsアカウントの[Account ID]を貼り付けます。
  • [Spatial Anchors Account Domain]フィールドに、Azure SpatialAnchorsアカウントの[Account Domain]を貼り付けます。
  • [Spatial Anchors Account Key]フィールドに、 Azure SpatialAnchorsアカウントから[Primary key]を貼り付けます。

[Hierarchy]でTableAnchorオブジェクトを選択し、[Inspector]で[Anchor Module Script]コンポーネントを見つけます。

[Public Sharing Pin]フィールドで、ピンがプロジェクトに固有になるように数桁を変更します。

TableAnchorオブジェクトを選択したまま、[Inspector]で、すべてのスクリプトコンポーネントが有効になっていることを確認します。

一部スクリプトを追加

既に修正されている可能性があるので要確認ですが、この後、紹介する最後の同期手順の7番でGet Azure Anchorボタンを押すと、

DebugWindow で "Local anchor position successfully set to Azure anchor position" と表示され、

デバイス1と同じ位置にオブジェクトが移動するようになっているはずですが、AnchorModuleScript.cs の、

下記の箇所がなぜか抜けているために、正常に動作しなかったので、私の場合は下記部分を追加しました。

AnchorModuleScript.cs

#if WINDOWS_UWP || UNITY_WSA
                // HoloLens: The position will be set based on the unityARUserAnchor that was located.

                // Create a local anchor at the location of the object in question
                gameObject.CreateNativeAnchor();

                // Notify AnchorFeedbackScript
                OnCreateLocalAnchor?.Invoke();

                // On HoloLens, if we do not have a cloudAnchor already, we will have already positioned the
                // object based on the passed in worldPos/worldRot and attached a new world anchor,
                // so we are ready to commit the anchor to the cloud if requested.
                // If we do have a cloudAnchor, we will use it's pointer to setup the world anchor,
                // which will position the object automatically.
                if (currentCloudAnchor != null)  
                {
                    Debug.Log("Local anchor position successfully set to Azure anchor position");

                    //gameObject.GetComponent<UnityEngine.XR.WSA.WorldAnchor>().SetNativeSpatialAnchorPtr(currentCloudAnchor.LocalAnchor);

                    Pose anchorPose = Pose.identity;
                    anchorPose = currentCloudAnchor.GetPose();

                    Debug.Log($"Setting object to anchor pose with position '{anchorPose.position}' and rotation '{anchorPose.rotation}'");
                    transform.position = anchorPose.position;
                    transform.rotation = anchorPose.rotation;

                    //removeAnchor = "Inactive";
                    //Create a native anchor at the location of the object in question
                    gameObject.CreateNativeAnchor();

                    //Notify AnchorFeedbackScript
                    OnCreateLocalAnchor?.Invoke();

                }

WindowsDevicePortal でメッシュをつくる

空間にアンカーを設定する必要があるので、WindowsDevicePortal を開いて設定していきましょう。

WindowsDevicePortalの開き方については、第3回を確認してください。

WindowsDevicePortalを開き、左のメニューから Views > 3D View を開くと下のような画面になっていると思います。

あたりを少し見まわした後、Spatial mapping > Update を押してみましょう、メッシュが生成されると思います。

メッシュが生成されたら、Spatial anchors > Update を押してみましょう、ロケーターが生成されると思います。

同期手順

ここまで出来たら、準備ができましたので、同期してみましょう。

2つのデバイス間でAzure Anchor IDを共有し空間を同じ配置するためには、次の手順のように進めます。

※AzureSpatialAnchorsはUnityでは実行できません。そのため、AzureSpatialAnchorsの機能をテストするには、2つのデバイスにプロジェクトをビルドする必要があります。

  1. デバイス1(ホスト)の場合:アプリを起動します(インスタンス化されたオブジェクトがテーブルに配置されます)
  2. デバイス2(ゲスト)の場合:アプリを起動します(オブジェクトとアバターが表示されますがホストと同じ場所に表示されません)
  3. デバイス1の場合: [Start Azure Session] ボタンを押します。
  4. デバイス1の場合: [Create Azure Anchor ] ボタンを押します。
  5. デバイス1の場合: [Share Azure Anchor] ボタンを押します。
  6. デバイス2の場合: [Start Azure Session] ボタンを押します。
  7. デバイス2の場合: [Get Azure Anchor] ボタンを押します(デバイス1でアンカーが作成された場所にオブジェクトが移動します)

おわりに

これで、2台のHololens2を使い、同じ空間でオブジェクトを共有することができるようになりました。

4週に渡り、Hololens2の基本的なアプリ作成について紹介しました。

基本的にMicrosoftが用意してある、チュートリアル通りではありますが、私自身がつまずいたりした点に関して補足してあります。

このブログが少しでもHololens2ユーザーの助けになればうれしいです。全4回、お疲れさまでした!

参考リンク

docs.microsoft.com

docs.microsoft.com

github.com

HoloLens2をさわってみた [第3回_Wi-Fiを使ってアプリをインストール]

f:id:kazuyaplus:20220214152337p:plain

はじめに

こんにちは、エンジニアの伊藤(@kazuyaplus)です。
前回はPUN2を使い、キューブなどをUnityとホロレンズで同期できるようにしました。

第3回ではWindowsDevicePortalを使い、自作のアプリをもう1台のホロレンズにインストールする方法を紹介していきたいと思います。

  • 第1回 : ひとりで使えるHololens2アプリをつくる ~Unity・VisualStudio・MRTKのインストールからビルドまで ~
  • 第2回 : 他の人と使えるHololens2アプリをつくる ~PUN2を使ってオブジェクトを共有~
  • 第3回 : Tips ~Wi-Fiを使ってアプリをインストール~
  • 第4回 : 他の人と同じ空間で使えるHololens2アプリをつくる ~AzureSpatialAnchorsを使った空間同期~

用語集

  • MRTK
    • [Mixed Reality Toolkit]の略で、AR、VRで使えるUIライブラリ
  • PUN2
    • [Photon Unity Networking2]の略で、Unityにオンライン機能を組み込むためのサービス
  • AzureSpatialAnchors
    • 複数のユーザーが同じ物理的な場所にデジタルコンテンツを配置できるようにするためのサービス

検証環境

  • Unity:2020.3.26f1
  • MRTK:2.7.3
  • VisualStudio:2019
  • Device:HoloLens2

手順

パッケージの作成

第2回のプロジェクトの続きから始めるので、不明な点がある場合は第2回目を確認してみてください。

ではさっそく、第2回でつくったプロジェクトをビルドしましょう、ビルド設定を下の画像のようにします。

f:id:kazuyaplus:20220205143610j:plain

Unityからビルドしたら、画像のような構成になっていると思います。

[MRTK Tutorials.sin]をVisual Studioで開きましょう。

f:id:kazuyaplus:20220219210939p:plain

プロジェクト > 公開 > アプリパッケージの作成を選択してください。

f:id:kazuyaplus:20220219211725p:plain

次に配布方法を選択します、サイドローディングの方にチェックをつけます。

f:id:kazuyaplus:20220219212202p:plain

次は署名方法の選択ですが、私の場合は証明書が必要だったので、使用するの方にチェックをいれます。

f:id:kazuyaplus:20220219212708p:plain

パッケージの選択と構成は今回はホロレンズでのみ使用する予定なので、ARM64だけにチェックをつけています。

f:id:kazuyaplus:20220219212735p:plain

f:id:kazuyaplus:20220219212800p:plain

パッケージが完了したら、出力先を開きましょう、ここで必要なのは下記の3つになります。

  • [MRTK Tutorials_1.0.0.0_ARM64.cer]

  • [MRTK Tutorials_1.0.0.0_ARM64.appx]

  • Dependencis > ARM64 > [Microsoft.VCLibs.ARM64.14.00.appx]

f:id:kazuyaplus:20220219214022p:plain

f:id:kazuyaplus:20220219214024p:plain

WindowsDevicePortal を使ってインストール

ホロレンズの電源を入れ、WindowsDevicePortalを開きましょう。

ホロレンズの設定 > ネットワークとインターネット > Wi-Fi > アダプターのプロパティから

IPアドレスを確認し、ブラウザにIPアドレス( https://〇〇〇 )を入力します。

f:id:kazuyaplus:20220219220027p:plain

WindowsDevicePortalを開いたら左のメニューから[Apps]を選択

Deploy apps > Install Certificate > [MRTK Tutorials_1.0.0.0_ARM64.cer]をいれましょう。

f:id:kazuyaplus:20220219215413p:plain

次にLocal Storageを開いて[MRTK Tutorials_1.0.0.0_ARM64.appx]を選択し、NEXTで次に進みます。

f:id:kazuyaplus:20220219215552p:plain

Dependencis > ARM64 > [Microsoft.VCLibs.ARM64.14.00.appx]を選択したらインストールしましょう。

f:id:kazuyaplus:20220219215644p:plain

おわりに

これで、2台のホロレンズに同じアプリをインストールができ、ホロレンズ間でオブジェクトを共有することができるようになりました。

次はAzureSpatialAnchorsを使って、空間を共有する方法を紹介します。

参考リンク

docs.microsoft.com

HoloLens2をさわってみた [第2回_他の人と使えるHololens2アプリをつくる]

f:id:kazuyaplus:20220214152337p:plain

はじめに

こんにちは、エンジニアの伊藤(@kazuyaplus)です。
前回はMRTKを使い、キューブを動かしたり回したりできるようにしました。

第2回ではPUN2を使い、UnityエディタとHololens2でキューブの動きを共有する方法を紹介していきたいと思います。

  • 第1回 : ひとりで使えるHololens2アプリをつくる ~Unity・VisualStudio・MRTKのインストールからビルドまで ~
  • 第2回 : 他の人と使えるHololens2アプリをつくる ~PUN2を使ってオブジェクトを共有~
  • 第3回 : Tips ~Wi-Fiを使ってアプリをインストール~
  • 第4回 : 他の人と同じ空間で使えるHololens2アプリをつくる ~AzureSpatialAnchorsを使った空間同期~

用語集

  • MRTK
    • [Mixed Reality Toolkit]の略で、AR、VRで使えるUIライブラリ
  • PUN2
    • [Photon Unity Networking2]の略で、Unityにオンライン機能を組み込むためのサービス
  • AzureSpatialAnchors
    • 複数のユーザーが同じ物理的な場所にデジタルコンテンツを配置できるようにするためのサービス

検証環境

  • Unity:2020.3.26f1
  • MRTK:2.7.3
  • VisualStudio:2019
  • Device:HoloLens2

手順

追加機能を有効にする

第1回のプロジェクトの続きから始めるので、不明な点がある場合は第1回目を確認してみてください。

さっそく始めていきましょう、Unityメニューで、Edit > Project Settings を選択して[Player]ウィンドウを開き、

Universal Windows Platform Settingsタブから [Publishing Settings]を見つけます。

[Capabilities]の設定で[InternetClient] [Microphone] [SpatialPerception] [GazeInput]が有効になっていることを確認します。

さらに追加で以下の機能を有効にします。

  • InternetClientServer機能
  • PrivateNetworkClientServer機能

f:id:kazuyaplus:20220215203329j:plain

空間認識システムを有効にする

[Hierarchy]でMixedRealityToolkitオブジェクトを選択して、[Inspector]を開きます。

[DefaultHololens2 Configuration Profile]をクローンして新しいプロファイルを作成します。

f:id:kazuyaplus:20220215203442j:plain

次に、[Spatial Awareness]セクション で [Enable Spatial Awareness System] を有効にします。

有効にしたら[DefaultMixedRealitySpatialAwarenessSystemProfile] をクローンします。

f:id:kazuyaplus:20220215203612j:plain

クローンができたら[XR SDK WindowsMixedRealitySpatialMesh Observer] を展開します。

展開したら、[DefaultMixedRealitySpatialAwarenessMeshObserverProfile] をクローンします。

f:id:kazuyaplus:20220219141902j:plain

クローンができたら DisplaySettings > DisplayOption をOcclusionにします。

f:id:kazuyaplus:20220215203829j:plain

オリジナルの空間データを使用するには

引き続き[Spatial Awareness]セクションで新たに [SpatialObjectMeshObserver] タイプのオブザーバーを追加します。

[DefaultObjectMeshObserverProfile] をクローンします。

f:id:kazuyaplus:20220401172617p:plain

チュートリアルアセットのインポート

次のUnityパッケージをこのリンクからダウンロードして、下記の順番にUnityにインポートしていきます。

  1. MRTK.HoloLens2.Unity.Tutorials.Assets.GettingStarted.2.7.2.unitypackage
  2. MRTK.HoloLens2.Unity.Tutorials.Assets.AzureSpatialAnchors.2.7.2.unitypackage
  3. MRTK.HoloLens2.Unity.Tutorials.Assets.MultiUserCapabilities.2.7.2.unitypackage

※MultiUserCapabilitiesアセットパッケージをインポートした後、コンソールウィンドウに、タイプまたは名前空間がないという大量のCS0246エラーが表示されます。これは、PUNアセットをインポートしたら解決されるので、次に進んでください。

PUNアプリケーションの作成

Photonアカウントの作成につきましては省略します。作成手順につきましては参考サイトを確認してください。

準備ができたら、下記のような画面になっていると思いますので[App ID] をコピーしておきます。

f:id:kazuyaplus:20220218171307j:plain

Unityに戻り、メニューの Window > Asset Store を選択して開き、[PUN2-FREE]を検索して選択し、アセットをインポートします。

インポートしたら、Window > Photon Unity Networking > PUN Wizardを選択してPunWizardウィンドウを開き、 [Setup Project]ボタンをクリックして[PUN Setup]メニューを開きます。

[App ID]フィールドに、前の手順でコピーしたPUNの[App ID]を貼り付けます。

次に、[Setup Project]ボタンをクリックして、アプリIDを適用します。

f:id:kazuyaplus:20220215204557j:plain

PUN Setupに[App ID]をいれると Assets > Photon > PhotonUnityNetworking > Resources に[PhotonServerSettings]ができます。

f:id:kazuyaplus:20220218171538j:plain

これで、PUNアプリと、Unityのプロジェクトを同期する準備ができました。

同期するシーンの準備

プロジェクトウィンドウで、 Assets > MRTK.Tutorials.MultiUserCapabilities > Prefabsフォルダーに移動し、次のプレハブをクリックして[Hierarchy]にドラッグし、シーンに追加します。

  • NetworkLobby
  • SharedPlayground

f:id:kazuyaplus:20220215205455j:plain

プロジェクトウィンドウで、 Assets > MRTK.Tutorials.AzureSpatialAnchors > Prefabsフォルダーに移動し、[ DebugWindow ]をクリックして[Hierarchy]にドラッグし、シーンに追加します。

f:id:kazuyaplus:20220215205623j:plain

プロジェクトウィンドウで、 Assets >  MRTK.Tutorials.MultiUserCapabilities > Resourcesフォルダーに移動します。

[Hierarchy]で、NetworkLobbyオブジェクトを展開し、 NetworkRoomを選択します。次に、Inspectorで、[Photon Room]コンポーネントを見つけて、次のように構成します。

[Photon User Prefab]フィールドに、ResourcesフォルダーからPhotonUserプレハブを割り当てます。

f:id:kazuyaplus:20220215205934j:plain

[Hierarchy] で、MixedRealityPlayspaceオブジェクトを展開し、[MainCamera] オブジェクトを選択します。

次に、[Inspector]から [AR Camera Manager]を追加します。

f:id:kazuyaplus:20220219144656p:plain

続いて、 Assets > MRTK.Tutorials.MultiUserCapabilities > Prefabsフォルダーに移動し、TableAnchorプレハブを[Hierarchy] のSharedPlaygroundオブジェクトにドラッグして、SharedPlaygroundの子としてシーンに追加します。

f:id:kazuyaplus:20220219145045p:plain

TableAnchorオブジェクトを選択し、[MainCamera] コンポーネントをTableAnchorの[AR Session Origin] のカメラフィールドにドラッグします。

f:id:kazuyaplus:20220219145234p:plain

キューブなどを同期する

ここまでは、だいたい参考サイトのチュートリアル通りになりますが、自分で用意したオブジェクトも同期させてみたいので、第1回目で作成したキューブの同期もできるように、色々追加していきたいと思います。

  1. [ cube ] をプレハブにして開きます。
  2. [ PhotonView ]スクリプトをつけます、そのまま展開して[Ownership] > [Ownership Transfer] > [Takeover]にします。
  3. [ Generic Net Sync ] スクリプトをつけます。
  4. [ OwnershipHandler ] スクリプトをつけます。
  5. [ Table Anchor As Parent ] スクリプトをつけます。

f:id:kazuyaplus:20220219161326p:plain

キューブを同期するために、[PhotonRoom.cs] に少しコードを追加しましょう。

PhotonRoom.cs

        public static PhotonRoom Room;

        [SerializeField] private GameObject photonUserPrefab = default;
        [SerializeField] private GameObject roverExplorerPrefab = default;
        [SerializeField] private GameObject TestExplorerPrefab = default;  //←追加
        [SerializeField] private Transform roverExplorerLocation = default;

PhotonRoom.cs

        private void Start()
        {
            if (PhotonNetwork.PrefabPool is DefaultPool pool)
            {
                if (photonUserPrefab != null) pool.ResourceCache.Add(photonUserPrefab.name, photonUserPrefab);

                if (roverExplorerPrefab != null) pool.ResourceCache.Add(roverExplorerPrefab.name, roverExplorerPrefab);

                if (TestExplorerPrefab != null) pool.ResourceCache.Add(TestExplorerPrefab.name, TestExplorerPrefab); //←追加
            }
        }

PhotonRoom.cs

        private void CreateInteractableObjects()
        {
            var position = roverExplorerLocation.position;
            var positionOnTopOfSurface = new Vector3(position.x, position.y + roverExplorerLocation.localScale.y / 2,
                position.z);

            var go = PhotonNetwork.Instantiate(roverExplorerPrefab.name, positionOnTopOfSurface,
                roverExplorerLocation.rotation);

            var goTest = PhotonNetwork.Instantiate(TestExplorerPrefab.name, positionOnTopOfSurface,
                roverExplorerLocation.rotation); //←追加

コードの追加ができたら、PhotonRoom.cs のフィールドにオブジェクトを追加していきましょう。

  1. プロジェクトウィンドウで、 Assets > MRTK.Tutorials.MultiUserCapabilities > Resourcesフォルダーに移動します。
  2. [Hierarchy]で、NetworkLobbyオブジェクトを展開し、 NetworkRoomオブジェクトを選択します。
  3. 次に、[Inspector]で、[Photon Room]コンポーネントを見つけて、Rover Explorer Prefabフィールドに、Resourcesフォルダーから[RoverExplorer_Complete_Variant]プレハブを割り当てます。
  4. 同様に、[Inspector]で、[Photon Room]のTest Explorer Prefabフィールドに、Resourcesフォルダーから[cube]プレハブを割り当てます。
  5. [Photon Room]コンポーネントのRover Explorer Locationフィールドに、 HierarchyウィンドウからTableAnchorの子の[Table]オブジェクトを割り当てます。

f:id:kazuyaplus:20220219172256p:plain

できたらホロレンズにビルドして確認してみましょう、Photonで同期したことにより、Unityやホロレンズで動かしたものが互いに共有されていることが確認できると思います。

f:id:kazuyaplus:20220219173744p:plain

おわりに

ここまで出来たら2台目のホロレンズにビルドを入れて遊んでみたい人が多いのではないのでしょうか?

ということで、次は、Wi-Fi経由でビルドをインストールする方法を紹介します。

参考リンク

docs.microsoft.com

yotiky.hatenablog.com

HoloLens2をさわってみた [第1回_ひとりで使えるHololens2アプリをつくる]

f:id:kazuyaplus:20220214152337p:plain

はじめに

こんにちは、エンジニアの伊藤(@kazuyaplus)です。
Hololens2すごい!Hololens2を使って一緒にいる人たちと同じARを共有して、物を動かしたりしたい!

そう思ってHololens2で基本的なアプリをビルドしてみました。

この記事ではHololens2で基本的なアプリを作る方法を全4回にわけてまとめていきたいと思います。

  • 第1回 : ひとりで使えるHololens2アプリをつくる ~Unity・VisualStudio・MRTKのインストールからビルドまで ~
  • 第2回 : 他の人と使えるHololens2アプリをつくる ~PUN2を使ってオブジェクトを共有~
  • 第3回 : Tips ~Wi-Fiを使ってアプリをインストール~
  • 第4回 : 他の人と同じ空間で使えるHololens2アプリをつくる ~AzureSpatialAnchorsを使った空間同期~

細かいことは後でいいので、Hololens2でとにかく何かを動かしたい人に向けて紹介していきます。

詳しいことは下のほうにすばらしい参考リンクをまとめていますので、そちらも確認してみてください。

用語集

  • MRTK
    • [Mixed Reality Toolkit]の略で、AR、VRで使えるUIライブラリ
  • PUN2
    • [Photon Unity Networking2]の略で、Unityにオンライン機能を組み込むためのサービス
  • AzureSpatialAnchors
    • 複数のユーザーが同じ物理的な場所にデジタルコンテンツを配置できるようにするためのサービス

検証環境

  • Unity:2020.3.26f1
  • MRTK:2.7.3
  • VisualStudio:2019
  • Device:HoloLens2

手順

Unityのインストール

インストールするモジュールを選択します。

  • Microsoft Visual Studio Community 2019
  • Universal Windows Platform Build Support

f:id:kazuyaplus:20220209183313j:plain

VisualStudioの追加インストール

Visual Studio Installerを起動し[変更]をクリックします。

f:id:kazuyaplus:20220209183537j:plain

[ユニバーサル Windows プラットフォーム開発]と下記の項目にチェックします。

  • USBデバイスの接続
  • C++(v142)ユニバーサルWindowsプラットフォーム
  • Windows 10 SDK (10.0.19041.0) 既に含まれている場合はそのまま

f:id:kazuyaplus:20220209183713j:plain

追加インストールが終わったら、Unityを起動しましょう。

f:id:kazuyaplus:20220209183844j:plain

スクリプトエディターの確認

  1. メニューの Edit > Preferences > Unity Preferences を開きます。
  2. [External Tools] の [External Script Editor] を [Visual Studio 2019] に設定します。

f:id:kazuyaplus:20220209184117j:plain

ビルド プラットフォームを切り替える

  1. Unity のメニューで、[File] > [Build Settings...] の順に設定して、[Build Settings] を開きます。
  2. [Build Settings] で、[Universal Windows Platform] を選択し、次の設定を完了します。

  3. [Target Device] を [HoloLens] に設定します。

  4. [Architecture] を [ARM 64] に設定します。
  5. [Build Type] を [D3D Project] に設定します。
  6. [Target SDK Version] を [Latest installed] に設定します。
  7. [Minimum Platform Version] を 10.0.10240.0 に設定します。
  8. [Visual Studio Version] を [Latest installed] に設定します。
  9. [Build and Run on] を [USB Device] に設定します。
  10. [Build configuration] を [Release] に設定します。

  11. [Switch Platform] を選択します。

f:id:kazuyaplus:20220209184846j:plain

MRTKのインポート

最新バージョンの Mixed Reality Feature Tool を Microsoft ダウンロード センターからダウンロードします。

www.microsoft.com

ダウンロードしたものを展開すると下記のようになっていると思うので、[MixedRealityFeatureTool.exe]を起動します。

f:id:kazuyaplus:20220209185626j:plain

[Start]を押して次へ

f:id:kazuyaplus:20220209185058j:plain

開いたらプロジェクトフォルダーを選択します。

f:id:kazuyaplus:20220213164027j:plain

Mixed Reality Toolkit に関連するパッケージを選択していきます。

  1. [Mixed Reality Toolkit Foundation] がオンになっていることを確認し、そのフィールドに [MRTK 2.7.3] を選択します。
  2. [Mixed Reality OpenXR Plugin] がオンになっていることを確認し、利用可能な最新バージョンを選択します。

※ Azure Spatial Anchorsを使う予定の場合は追加で [Azure Spatial Anchors SDK Core]と[Azure Spatial Anchors SDK for Windows(プラットフォーム固有のパッケージ)]を追加します。

f:id:kazuyaplus:20220213164129j:plain

Unityプロジェクトを構成する

Mixed Reality Feature Tool で機能の追加が終了したらUnityを起動します。

パッケージがインポートされたら、Unity エディターを再起動し、新しいプラグインのバックエンドを有効にします。 起動時に警告が出ますが[はい] を選択します。

f:id:kazuyaplus:20220213164454j:plain

起動時にMRTKが立ち上がります。

[Unity OpenXR Plugin] を押して次のページに進みます。

f:id:kazuyaplus:20220213164536j:plain

[Show XR Plug-in Management Settings] を押すとプロジェクト設定が立ち上がります。

f:id:kazuyaplus:20220213164613j:plain

[XR Plug-in Management] でユニバーサル Windows プラットフォーム設定 がアクティブになっていることを確認し、[Initialize XR on Startup]、[Open XR]、[Microsoft HoloLens feature set] がすべて有効になっていることを確認します。(チェックボックスがオンになっている)

※警告マークはクリックして [FixAll]

f:id:kazuyaplus:20220213164635j:plain

OpenXR 構成を検証するには、[XR Plug-in Management] で [OpenXR] を選択し、次の項目がオンになっていることを確認します。

  • Depth Submission Mode : Depth 16 Bit
  • Interaction Profiles : Microsoft Hand Interaction Profile

f:id:kazuyaplus:20220213164804j:plain

設定を有効にするには、Unity を再起動する必要があります。 メッセージが表示されたら、[Apply] を選択して Unity エディターを再起動します。

f:id:kazuyaplus:20220213164827j:plain

  1. 再起動が終わったら、Unity のメニューで、[Edit] > [Project Settings...] を選択して [Project Settings] ウィンドウを開きます。
  2. [Project Settings] で、[Player] > [Publishing Settings] の順に選択し、[Package name] フィールドに適切な名前を入力します、適当な名前を付けたら、保存しましょう。

f:id:kazuyaplus:20220213164903j:plain

シーンを作成してMRTKを作成する

Unity メニューで、 Mixed Reality > Toolkit > Add to Scene and Configure を選択して、MRTK を現在のシーンに追加します。

f:id:kazuyaplus:20220213165025j:plain

[Hierarchy] ウィンドウで MixedRealityToolkit オブジェクトを選択した状態で、[Inspector] ウィンドウで [MixedRealityToolkit] 構成プロファイルが DefaultMixedRealityToolkitConfigurationProfile に設定されていることを確認します。

f:id:kazuyaplus:20220213165059j:plain

f:id:kazuyaplus:20220213165112j:plain

次にヒエラルキーにキューブを作ります。

  • 位置: X = 0、Y = -0.1、Z = 0.5
  • 回転:X = 0、Y = 0、Z = 0
  • スケール: X = 0.1、Y = 0.1、Z = 0.1

追跡対象の手でオブジェクトを操作してつかむには、オブジェクトに次のコンポーネントが必要です。

  • Object Manipulator (Script) コンポーネント (ConstraintManagerは自動でセットされる)
  • NearInteractionGrabbable (Script) コンポーネント

f:id:kazuyaplus:20220213165235j:plain

プロジェクトをビルドする

Unity メニューで、 [File] > [Build Settings...] を選択し、[Build Settings] からプロジェクトをビルドします。 ビルドが完了したら下記のフォルダのようになります。

f:id:kazuyaplus:20220213165517j:plain

[MRTK Tutorials.sin] をVisual Studioで開きます。

ビルド設定を [Release] 、[ARM64] 、[デバイス] にします。

f:id:kazuyaplus:20220213165544j:plain

設定が終わったらホロレンズ本体とパソコンを接続しましょう。 初回のみVisual StudioとHoloLens 2のペアリングを求められます。

HoloLens2本体の設定内の[更新とセキュリティ] > [開発者向け]にある[ペアリング]ボタンを押すとPINが表示されます。

f:id:kazuyaplus:20220213165621j:plain

ビルドが終わったら、ホロレンズでアプリを起動します。 下記の画像はUnityで実行した画面になりますが、アプリを実行するとキューブを掴むことができるようになっているかと思います。

f:id:kazuyaplus:20220213212427j:plain

おわりに

これでキューブを動かしたり回したりすることができるようになりました。

次回は、このアプリケーションを他の人と一緒に使えるようにする方法を紹介します。

参考リンク

【イベントレポート】SIer・業務系エンジニアのXRスタートアップ転職を語る会

こんにちは、エンジニアのクロックスこと黒岩(@kro96_xr)です。
今回は先日行われたSIer・業務系エンジニアのXRスタートアップ転職を語る会のイベントレポートをお届けします。

▼アーカイブはこちら▼
www.youtube.com

イベント概要

本イベントはSynamon社内のSIer出身者が各自のXR転職を振り返りつつパネルディスカッションを行うという形式で行われました。

「業務でXR開発はやったことないけど、XR業界に転職したい」
「SIerの経験って何がどう活かせるの?」
「XR開発やりたいけど、Unity業務経験必須なら無理かな…」
「何はともあれ、XR転職を成功させた人のお話が聞きたい!」

XR転職を目指しながらも、実態がわからない&何をアピールすればいいのかわからないといった方々、中々多いのではないでしょうか。
今回はSynamon内の元SIerメンバーが自身のXR転職を振り返りつつ、皆さんのお悩みに答えていきたいと思います!
(イベントページより引用)

なお、当日は以下の流れで進行しました。
f:id:krocks96:20220206170043p:plain

自己紹介~「VRは体力ですよ」~

自己紹介の見どころはうぃすきーさんが三点倒立し始めたところですね。

うぃすきーさん曰く「VRは体力ですよ」とのことですので、みなさん体力付けていきましょう!

テーマ①「自分、こうやってXR転職しました」

このテーマでは各自がSynamonに入社するまでの経緯をお話ししました。
f:id:krocks96:20220206203456p:plain

クロックス

  • SIerで製造業向けパッケージソフトの運用保守・開発をやっていた
  • 2018年夏の6社合同採用イベントでSynamonを知る
  • 開発スキル不足を自覚していたので未経験待遇でWebエンジニアへ(年収は3桁万減)
  • 2021年にあらためて応募、1回お祈りされてからのスカウトにより入社

うぃすきーさん

  • SIerでインフラ担当をしていた
  • 開発経験を積むためにWeb系の会社に転職(年収は半減)
  • 自力で一から開発する経験を積んでSynamonに入社

じゅーいちさん。

  • Synamonはいつの間にか知っていた
  • おそらくTwitterで界隈の動きを追っているときに知った
  • リアルイベントが多かった時期で、参加している中で開発されている方や会社を知った…と思う
  • 1年間くらいは所属していたSES内で何かできないか探したりはしていた

テーマ②「実際働いてみてどう?働き方の違いは?」

このテーマではざっくばらんに働き方の違いについてお話ししました。
f:id:krocks96:20220206203552p:plain

  • 全部違う、共通点はオフィスがあることくらい
  • 忙しさは波があるので一概には言えない、SIerの方が開発スパンが長いかも
  • SIerだと人数規模が大きく業務の細分化が進んでいてやることが明確
  • Synamonだと「待っていると何も仕事が振られない」「やることは自分で取りにいく」
  • 最初の2週間くらい不安で辛かったが、自分で手をあげて動いていくことで自分の立ち位置を考えることができた
  • 立ち位置を考えた結果、自分の思いもしなかったところが強みになったりする

テーマ③「SIer経験しておいて良かった~!って思う瞬間」

このテーマではSIerで経験したことが活きている場面についてお話ししました。
f:id:krocks96:20220206210533p:plain

  • (SIerでのポジションにもよるが)要件定義や合意形成といったクライアントワーク
  • 見積を作るときの工数や金額の感覚を得ることが出来た(リスクヘッジで見積のバッファを積みすぎになっているかも)
  • SIerの方が大規模開発だったので、サービスがスケールした時に活きるかもしれない
  • SIerで客先で話す必要があったので傾聴力やコミュニケーション力がついた
  • 組織体制がしっかりしたところにいたので、組織作りをするにあたって経験が活きている

質問コーナー

f:id:krocks96:20220206211336p:plain

じゅーいちさんは東京への移住組と伺っていますが、リモートの仕事文化が定着した現在、東京を出るという選択肢はありますか?

  • 全然ありますね~笑
  • 会社の方針、仕組み次第なところはある
  • 会社に来ても来なくてもいいとなると出社もいいものだなと思うこともある
  • 田舎で働くの憧れません?笑

XR企業に転職してからSIer時代に勉強しておいてよかったと思うことはありますか?

  • 全く業務関係ないところでプログラミングの勉強したり資格試験の勉強したりしていたこと
  • サーバサイドは作ったモノが見えないので、見えるものとしてシェーダーを書いてVRChatにもっていったりしていた
  • UML(クラス図やシーケンス図など)の書き方を学んだこと

XR関連の業務経験がない状態でXR業界に転職するのはなかなかハードルが高いんじゃないかと思いますが、どうやって決断したんでしょうか?

  • 結論としては「やりたかったから覚悟を決めた」になる
  • 面接時点でSynamonの抱えている課題を聞いてやるべきことが見えたのでやれると思った
  • 趣味を仕事にするとつまらなくなるというのが心配だったが、チャンスは今しかないと思って覚悟を決めた
  • iPhoneが出た時に波に乗り損ねた経験があり、XRも同様に時代の変わり目になるのではと思って覚悟を決めた

さいごに

以上、イベントの内容を箇条書き形式でまとめてみました。

ここからは個人の感想です。
まずはじめに、イベントを企画してくださったふわりさん、そして視聴してくださった皆さんありがとうございました。他の方の経験、考えを聞けて非常に興味深かったですし、こうしてパブリックな場で話すことが出来て勉強になりました。次回はもう少し緊張せずに話せたらいいなと思います笑
また、イベント後にアンケートも取らせていただいたのですが「転職時に考えていたことが参考になった」という声や「スタートアップでの仕事の進め方を知ることができてためになった」という声をいただき、開催して良かったなと胸をなでおろしております。

そして全体を通して思ったのは、XR転職に必要なことは「勇気をもって一歩踏み出す」ことではないかということです。パネリストそれぞれで転職に至るまでの道筋は異なりますが、最後の質問への回答でもあったように覚悟を決めて現状を変えるために自らアクションをした結果が現在に繋がっているのかなと思いました。

大きく環境を変えることはリスクもあり難しいものですが、出来ることから少しずつ始めてみてはいかがでしょうか。

簡単に出来ることといえば、Synamonではカジュアル面談を実施しております。

カジュアル面談はMeetyから▼
meety.net

エントリーはこちら▼
herp.careers

また、本テックブログやnote記事のお知らせは、Synamon公式Twitterでも発信もしています。
弊社の取り組みに興味を持っていただけたら、ぜひフォローお願いいたします!
twitter.com