インタラクションは沼
STYLYのインタラクションを遊び始めたときの私の感想です。
STYLYでは多数のデモの記事が投稿されていますが、リファレンスという形では纏っていません。また、デバイス毎に動きが違うということがざらにあります。
というわけでインタラクションのリファレンスをまとめました。
#STYLY のインタラクションが沼だったので、1枚で完全に理解できるようにしました。
— noria (@noria901) 2019年5月3日
まだ描き途中ですがちょっと議論したいのでだしてしまいます。
落ち着いたところでQiitaで解説するます。 pic.twitter.com/RxNvzR9mdc
ここでは"完全に理解した”程度を目標に、インタラクションの基本とポリシー、リファレンス、STYLYのUpdate予定を紹介します。
ちなみに、STYLYなんぞという方はこちらから見て頂くと分かりやすいです。
インタラクションの基本
インタラクションの一般的な処理フローは、Userによるインプットに始まり、各Deviceのインプットを取り扱うInput Systemにより数値化され、Simulation System内でInputに対する動きをまとめたLogicにより各オブジェクトの状態が変わり、オブジェクトをレンダリングした結果がOutput Systemを通してUserに届きます。
ここで言うSimulation SystemとはSTYLYのことですが、STYLYでインタラクションを実現することを考えると、取り扱えるInputとLogicを理解するとよさそうです。
現状STYLYが取り扱うInputは2種類あると考えられます1
- From input system
Input System由来のものです。マウスやキーボードといったLegacy Inputもそうですし、HMDやコントローラの角度情報等も取れます。 - From other game objects
シーン上の他Objectの動作がInputになることがあります。例えば、Userが投げたボールが等速運動で転がり何かにぶつかる時に、ユーザに何か提示することを考えると分かりやすいでしょう。
これらのInputを取り扱うLogicもこれまた2種類あります2
- STYLY preset game objects
STYLYでは起動時に配置されるObjectがあります。具体的にはUserをモデル化した、Main CameraとControllerがそれにあたります。これらのObjectはデフォルトでキーアサインされており、視点変更や移動といったVRにおいて一般的なインタラクションを実現してくれます。 - User uploaded assets
STYLYデフォルトのインタラクションだけでは物足りない場合は、自身で実装することができます。基本的にはUnity上でprefabなどにPlayMakerでインタラクションを実装したものを、STYLY Unity Pluginを用いてUploadします。UploadするとAssetとして自由に配置することができ、配置した瞬間にPlayMakerのFSMが動き出します。
これらの詳細がどのようになっているかはリファレンスの章で説明するとして、残る疑問はSTYLYのインタラクションに対するポリシーでしょう。以降は私なりの解釈になりますので、興味がない方はリファレンスまですっ飛んでください。
STYLYのインタラクションに対するポリシー
STYLYのインタラクションに対するポリシーを一言で言うと、クリエイターの皆さんはコンテンツのクオリティコントロールをする責務を負っている、です。
このポリシーを読み解くには、STYLYの特徴を理解する必要があります。私が思うに、STYLYには2つの大きな特徴があります。
- マルチデバイス性
複数のデバイスで視聴できる環境が提供されることで、様々なユーザが触れられる機会を得られます。 - 簡単に作れて即時配信
Web Editorという強力なシーンエディタ上で作れるのはもとより、数クリックで作品を公開できてしまう戸門の広さはクリエイターに表現の自由を与えてくれます。
こう考えてみると、ユーザとクリエイターを直接繋ぎ加速することこそが、STYLYの正体なのかもしれません。この前提で、STYLYのインタラクションを振り返ると、インタラクションに関して、すべての領域でマルチデバイス性を保証できるわけではないという事実が横たわります。環境によって異なるデバイスのInput System差分を吸収し切れていません。クリエイターはこの状況を考慮したうえで作成するわけですが、すべてのデバイスに平等なインタラクションを提供するコストは膨大です。そもそもデバイス自体の特性により正しく表現できないことの方が多いでしょう。ともあれインタラクションを実現すると対応デバイスが絞られるので、クリエイターはどのようなエンドユーザに見てもらいたいか、そのエンドユーザの体験環境を想定して実現する必要があります。これが、クリエイターがクオリティコントロールをする責務を負うことの根拠となってます。
次章でリファレンスを紹介しますが、STYLYのマルチデバイス性を保証できる領域と、クリエイターがクオリティコントロールすべき領域に分かれているという前提を心に留め置いてご覧ください。3
リファレンス
PlayMakerで実装するのに必要な要素を1枚にまとめました。
これではあまりにあまりなので、それぞれについて読み方を紹介します。
Default key assign
デフォルトキーアサインされているインタラクションは以下の通り。
こうしてみると、対応関係にDesktop、PCVR、6Dof Stand alone、3DoF Stand aloneの違いがよく出てますね。
詳細は以下の通り
- Gaze : 視線の変更
- Walk,Up/Down : 歩行と上下の移動
- Transport : トランスポートはVRでの一般的な移動表現。
- Rotate : その場で回転
- Back to menu : STYLYのメニュー画面に戻る
- Screen plane move : 描画面を水平に移動する
- Zoom In/Out : Main Cameraの一時的なズーム
- Other Assign : その他特殊な機能等の備考
- PCVR : 右トラックパッドクリックでカメラ機能
- Oculus Go : TriggerでMouse Click4
Events
ここでいうEventとは、PlayMakerのEventのこと。
- Actions
PlayMakerのActionには、Inputの状態を取得したり、Eventを待ち受けるものがある。と言ってもLegacy Input分しか用意されてないので、Desktop Support向けに利用するといいだろう。 - Events
PlayMakerのEventの仕様にあるEventは一通り使える。
さらに追加でSTYLYがPCVRのコントローラ向けにCustom Eventを用意している。
これでトリガーボタンとグリップボタンをHandleできるようになる。
Custom Events | Left hand | Right hand |
---|---|---|
Trigger Down | Global_TriggerPressDown_L | Global_TriggerPressDown_R |
Trigger Up | Global_TriggerPressUp_L | Global_TriggerPressUp_R |
Grip Down | Global_GripPressDown_L | Global_GripPressDown_R |
Grip Up | Global_GripPressUp_L | Global_GripPressUp_R |
Game Objects
インタラクションする対象となるObjectが、自身が作成しているAssetsに収まってるなら内部で参照するだけ。では、Object間の連携をしたい場合はどうしましょう。一部を除き、基本的にはPlayMakerのActionであるFind Game Objectを使って探すことになりますが、そこで必要になるのがObject nameです。STYLYが提供しているものと、クリエイター自身が用意する2種類あります。
- Preset Game Objects
STYLYは起動するとデバイスに合わせていくつかのObjectを生成します。
そのObject名が公開されているので、これを使えば参照できるようになります。
例外として、MainCameraだけはActionであるGet Main Cameraを使えば、全ての環境で利用することができます。
Object Name | memo |
---|---|
Main Camera | Web Player、Desktop以外はサポート外。Get Main Cameraつかうよろし。 |
Controller (right) | PCVRコントローラの右手。PCVR以外はサポート外。 |
Controller (left) | PCVRコントローラの左手。PCVR以外はサポート外。 |
- User Uploaded Assets
自身でアップロードしたAssetsを参照したい場合で思いついたのはこの2つ。- Bundle assets into prefab
そもそもAsset分ける必要ないならひとまとまりにするのが案外幸せですよ、という忠告。
Prefabの子として存在するならFind Childで参照できて楽です。 - Refer uploaded assets
アップロード済みのアセットをシーンに配置したなら、Asset名で参照できる。ただし、prefab名ではない。
ここで具体的な方法が書かれてるが、UploadしたAssetのユニークIDで指定する必要がある。5
- Bundle assets into prefab
Game Objectの参照が取れたら、あとはSend Eventなりで連携するだけです。
Object nameわからないなら、最悪Bloadcastしてしまうという方法も。場合によってはその方が効率がいいこともありましょう。
デバイスとの対応関係
ここまで紹介してきたリファレンスですが、ざっくり各デバイスとの対応関係を示すと以下のようになります。
一部補足すると、
- 先述した通り、OculusGoのコントローラトリガーボタンはMouse系で取得できる
- PCVRのアプリは実は一部のLegacy Inputを受け付けることができる。
これはつまり、HMDを被った人、Desktop画面で操作する人の2P Playができるということだ!
実際にこれらのEventが発火する様子を見れるようにしたデモシーンを作りました。
Interaction Test
こちらをつつきながら図を見比べると分かりやすいかと思いますが諸注意など。
- Eventに関しては、対応するものが発火すると回ります。止まりません。
- Game Objectsに関しては、STYLYさんが用意しているものについてRotateをそのまま反映してあります。見つからなかったらNot foundと表示されます。
STYLYのUpdate予定
インタラクションに関して、私の知っている限り2つのUpdate予定があります。6
-
Labs
Labsについてはすでに公開されていますが、ある程度の定型アクションはLabsのAssetsとして公開されるようです。 -
FSM Templateの配布
PlayMakerのFSMはTemplateとして保存できるのですが、STYLYでよく使うものはTemplate化して配布するようです。
おわりに
ここまで読んだあなたはSTYLYのインタラクション完全に理解したと言っても過言ではないでしょう。
これでインタラクションを実装できるとはいえ、STYLYはまだ発展途上ですし、あなたの表現したいことが表現できないこともあると思います。
そんな時は、ぜひSTYLYさんに要望を出してください。あの人たちはツイ廃なので、気軽につぶやくといいですよ
- Twitter
- #STYLYでつぶやくと大体拾ってくれます
- STYLY公式アカウントもある
- Facebook
- 日本語:STYLY助け合い所
- 英語:STYLY user group