Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
PhotonでOculusAvatarを動かす方法
Search
Keizo Nagamine
July 17, 2019
Technology
570
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
PhotonでOculusAvatarを動かす方法
Keizo Nagamine
July 17, 2019
More Decks by Keizo Nagamine
See All by Keizo Nagamine
福岡XR部でのHubs活用事例報告っ!
kzonag
0
210
ついに届いたNreal! -サンプルランチャーを作ってみた-
kzonag
0
270
福岡XR部の紹介と最近のオンライン活動
kzonag
0
2.3k
ZoomとHubsの繋げ方
kzonag
0
700
VTuberになるために必要な要素技術
kzonag
0
140
リアルと重ねるVR
kzonag
0
2.7k
UnityでOculuQuest入門
kzonag
0
1.2k
XRのおさらいと最近ホットな話題
kzonag
0
130
UnityマンがA-Frameさわってみて感じた共通点とか
kzonag
0
740
Other Decks in Technology
See All in Technology
ローカルLLMとLINE Botの組み合わせ その3 / LINE DC Generative AI Meetup #8
you
PRO
0
130
AICoEでAIネイティブ組織への進化
yukiogawa
0
170
Claude Code 珍プレー好プレー
shinyasaita
0
330
関数型の考えを TypeScript に持ち込んで、テストしやすい純粋関数を増やす / Pure at the Core, Effects at the Edge: Bringing Functional Thinking into TypeScript
kaminashi
1
110
AI Agent SaaS を支える自社仮想化基盤への挑戦と実運用 / ai-agent-saas-virtualization
flatt_security
2
3.9k
シンガポールで登壇してきます
yama3133
0
130
プロダクトだけじゃない、社内プロセスにおける自動化・省力化ノススメ
kakehashi
PRO
1
3.7k
アカウントが増えてからでは遅い? ~ マルチアカウント統制の勘所 ~
kenichinakamura
0
230
事業価値を⽣み出すSREへ SREが担うべき意思決定の5層
kenta_hi
2
3.6k
ゴールデンパスは敷いただけでは道にならない ─ 企画部門のエンジニアが技術標準を事業価値に変えるまで
mhrtech
1
150
実装だけじゃない! CCA-F取得エンジニアが教えるClaude Code開発プロセス活用術
diggymo
2
710
インフラと開発の垣根を超えていき!〜元AWSインフラエンジニアがAWS開発で奮闘している話〜
hatahata021
3
180
Featured
See All Featured
Tell your own story through comics
letsgokoyo
1
990
HTML-Aware ERB: The Path to Reactive Rendering @ RubyCon 2026, Rimini, Italy
marcoroth
2
330
30 Presentation Tips
portentint
PRO
1
350
Helping Users Find Their Own Way: Creating Modern Search Experiences
danielanewman
31
3.2k
Six Lessons from altMBA
skipperchong
29
4.3k
Hiding What from Whom? A Critical Review of the History of Programming languages for Music
tomoyanonymous
3
930
JAMstack: Web Apps at Ludicrous Speed - All Things Open 2022
reverentgeek
1
490
The Power of CSS Pseudo Elements
geoffreycrofte
82
6.4k
DBのスキルで生き残る技術 - AI時代におけるテーブル設計の勘所
soudai
PRO
67
56k
世界の人気アプリ100個を分析して見えたペイウォール設計の心得
akihiro_kokubo
PRO
72
40k
The State of eCommerce SEO: How to Win in Today's Products SERPs - #SEOweek
aleyda
2
11k
GraphQLとの向き合い方2022年版
quramy
50
15k
Transcript
Photonで OculusAvatarを 動かす方法 @KzoNag XRミーティング 福岡 2019年7月17日 #XRMTG #福岡XR部
自己紹介 ながみね @KzoNag Jollystics Inc. / 福岡XR部 Unityを触っていることが多い XR/インタラクティブ/モバイル 5
発端 6 前にGoで試した OculusAvatarをマルチ プレイできるサンプルを Questでも試したかった
Questでは動かせないことが発覚! 中で利用してるP2P通信などの機能はアプリIDを発行しないと使えない しかしデベロッパーサイトでのアプリ作成でPlatformをQuestにできない Questアプリの企画審査に通過する必要がある!? だがしかし 7
そこで 8 https://developer.oculus.com/documentation/avatarsdk/latest/concepts/avatars-sdk-intro/ https://www.photonengine.com/ja-JP/PUN
ドキュメントがあります https://doc.photonengine.com/ja-jp/pun/current/demos-and-tutorials/oculusavatarsdk 9
今日の話の目的 ドキュメントはOculus AvatarとPhotonを知ってることが前提 コピペしたら動いたけど中身の理解のハードルはやや高そう いろいろ触ってチョット分かってきたので共有します 10
Oculus Avatar Oculusが提供するアバターの仕組み Rift(S)/Go/Quest + SteamVRなどでも動かせる AvatarSDKで自作アプリに導入できる 11 https://developer.oculus.com/documentation/avatarsdk/latest/concepts/avatars-sdk-intro/
Oculus Avatar SDK Asset StoreでOculus Integrationを入れたらAvatarSDKも入る (以前は各種SDKの個別版も配布してたけど今は全部入りだけっぽい?) 12
LocalAvatar (シンプルなサンプル) 一人称視点と三人称視点の2つのアバターオブジェクト LocalAvatarはプレハブになっているのですぐに使える 13 Little_LocalAvatar LocalAvatar
LocalAvatarとRemoteAvatar 16 LocalAvatar HMDとコントローラーの情報 をもとにアバターを制御 RemoteAvatar シリアライズされたアバター データをもとにアバターを制御
LocalAvatarとRemoteAvatar 17 LocalAvatar RemoteAvatar アバター データ HMDとコントローラーの情報 をもとにアバターを制御 シリアライズされたアバター データをもとにアバターを制御
RemoteLoopback (シンプルなサンプル②) LocalAvatarから取得したアバターデータを RemoteAvatarに流し込むサンプル 18 RemoteAvatar LocalAvatar
LocalAvatar → アバターデータ 19 void Start() { LocalAvatar.RecordPackets = true;
LocalAvatar.PacketRecorded += OnLocalAvatarPacketRecorded; } void OnLocalAvatarPacketRecorded(object sender, OvrAvatar.PacketEventArgs args) { using (MemoryStream outputStream = new MemoryStream()) { BinaryWriter writer = new BinaryWriter(outputStream); ... byte[] avatarData = outputStream.ToArray(); SendPacketData(avatarData); } }
アバターデータ → RemoteAvatar 20 void ReceivePacketData(byte[] data) { using (MemoryStream
inputStream = new MemoryStream(data)) { BinaryReader reader = new BinaryReader(inputStream); int sequence = reader.ReadInt32(); OvrAvatarPacket avatarPacket; ... LoopbackAvatar.GetComponent<OvrAvatarRemoteDriver>().QueuePacket(sequence, avatarPacket); } }
マルチプレイの構成 21 アバター データ アバター データ アバター データ アバター データ
PlayerA PlayerB LocalAvatar LocalAvatar RemoteAvatar RemoteAvatar ネットワーク経由のデータの 送受信をどうするか
PlatformSDKのP2P通信を利用してアバターデータを送受信 ルーム制御やボイスチャットなどOculusRooms的な機能が実現されてる SocialStarter(しっかりしたサンプル) 22 XR部のメンバーに手伝ってもらって アバターが動くことを確認した
Photon マルチプレイゲームに必要なネットワーク機能を提供するサービス 無料プランあり Unity向けパッケージ : Photon Unity Networking (PUN) 25
https://www.photonengine.com/ja-JP/PUN
ネットワークオブジェクト 26 PhotonView 同期するコンポーネントを監視する役割 同じViewIDを持つ相手と同期する オブジェクトの所有権などの情報も持つ Photon***View 同期するコンポーネント TransformやRigidbodyなどは用意されている 自作することも可能
ネットワークオブジェクトの生成 27 Client1 Client2 Instantiateを実行して オブジェクト生成 Client1に合わせて オブジェクト生成 ViewID=1 ViewID=1
PhotonNetwork.Instantiate(prefabName, position, rotation); Cube Cube
ネットワークオブジェクトの同期 28 Client1 Client2 プレイヤー操作で 移動 Client1に 同期して移動 ViewID=1 ViewID=1
IPunObserbable 29 PhotonViewの監視対象となるインターフェイス public class PhotonAvatarView : MonoBehaviour, IPunObservable {
public void OnPhotonSerializeView(PhotonStream stream, PhotonMessageInfo info) { if(stream.IsWriting) { byte[] data = null; stream.SendNext(data); } if(stream.IsReading) { byte[] data = (byte[])stream.ReceiveNext(); } } } ここでLocalAvatarのアバターデータを送信 受信したアバターデータを RemoteAvatarに流し 込む
異なるプレハブ間の同期 30 ViewID=1 ViewID=1 LocalAvatar RemoteAvatar PhotonAvatarView PhotonAvatarView Client1 Client2
こういう状態にしたい
異なるプレハブ間の同期(手順) 31 ViewID=0 LocalAvatar PhotonAvatarView Client1 Client2 ①通常のInstantiateでオブジェクト生成
異なるプレハブ間の同期(手順) 32 ViewID=1 LocalAvatar PhotonAvatarView Client1 ②手動でViewIDを割り当て
異なるプレハブ間の同期(手順) 33 LocalAvatar PhotonAvatarView Client1 Client2 ③ViewIDを指定して生成イベント発行 ViewID=1 ViewID=1で 生成して
異なるプレハブ間の同期(手順) 34 ViewID=1 LocalAvatar RemoteAvatar PhotonAvatarView PhotonAvatarView Client1 Client2 ④指定されたViewIDでオブジェクト生成
ViewID=1
そんなこんなでできたもの 36 https://twitter.com/KzoNag/status/1149360901205610497?s=20
Have a nice avatar life!
CREDITS Special thanks to all the people who made and
released these awesome resources for free: ▪ Presentation template by SlidesCarnival ▪ Photographs by Unsplash 38