強火で進め

このブログではプログラム関連の記事を中心に書いてます。

(現在プレビュー版の)Unity Physics を試してみる

Unity Physics は 100% DOTSで実装された新しい Unity の物理エンジンです。

f:id:nakamura001:20190418200344p:plain

GDCでの講演動画からの引用。

 

使い方

環境準備

対応しているのは Unity 2019.1 からなのでまだインストールしていない場合はインストールして下さい。

 

Unity エディタを起動し、メニューから Windows > Package Manager と選択。

 

Unity Physics はまだプレビュー版なので Advanced の所をクリック後、 Show preview package をクリックしてプレビュー版のパッケージも表示される様にします。

f:id:nakamura001:20190418201616p:plain

検索欄に Physics と入力して絞り込み、 install ボタンを押してインストールします。

f:id:nakamura001:20190418201839p:plain

 試してみる

床に球を落とす簡単なサンプルを作ってみます。

 

まずは床を作ります。 Cube を作成し、 Scale を (20, 1, 20) に設定して下さい。

Unity Physics に差し替える為に Box Collider コンポーネントを削除し、Physics Shape コンポーネント、 Convert To Entity コンポーネントを追加します。

 

次に球を作ります。 Shpere を作成し、床の上に移動させます。

Sphere Collider コンポーネントを削除し、Physics Shape コンポーネント、 Convert To Entity コンポーネントを追加します。

 

Physics Shape コンポーネントの Shape Type を Sphere に変更します。

f:id:nakamura001:20190418203016p:plain

球は床とは異なり、重力の影響を受けるので Rigidbody に当たるものを追加します。

Unity Physics では Physics Body がそれに当たりますので Physics Body コンポーネントを追加して下さい。

 

この状態で実行してみると実行した瞬間、床と球が描画上も Hierarchy からも消えてしまう事が確認できます。

 

これはDOTS(というか ECS)では(ざっくりと言うと)今までの Unity の世界とは別の世界で動いてるからです。

 

ECS 世界でのレンダリングを今までの世界に持ってくる場合には Hybrid Renderer というパッケージが必要です。 Package Manager を開き、 Hybrid Renderer をインストールして下さい。

 

インストール後にもう一度実行すると正しくレンダリングされたオブジェクトが物理法則に則って落下するのが確認できるかと思います。

 

もっと色々と試してみたい場合には GitHubこちらのリポジトリをクローンし、 UnityPhysicsExamples というフォルダのプロジェクトを実行してみて下さい。

Unityアプリの起動時の解像度選択のダイアログ表示がデフォルトで無効に

f:id:nakamura001:20190418171045p:plain

Unity 2019.1 から WindowsMac アプリの起動時に表示される解像度選択のダイアログ(↑こんなやつ)の表示がデフォルトで無効になりました。プロジェクトを新規作成した時には無効( Disabled )に成っています。

 

どうしても表示させたい場合には Player Settings のページで Player タブの中に有る

f:id:nakamura001:20190418170857p:plain

Display Resolution Dialog の項目を Enabled に変更して下さい。

f:id:nakamura001:20190418170900p:plain

※変更すると「非推奨になりました。将来のバージョンで削除されます」の注意書きが表示されますが現在のバージョンでは動作します。

f:id:nakamura001:20190418171019p:plain

 

Editor上で表示されている内容をリビルド無しで実機で確認できるツール「UnitySceneViewerKun」

f:id:nakamura001:20190417173727p:plain

 

Editor上で表示されている内容をリビルド無しで実機で確認できるデザイナーさんが助かりそうなツール「UnitySceneViewerKun」の紹介。

 

使い方

(1) ここからプロジェクトをDLします。(2) Build Settings で DevelopmentとAutoconnect Profiler にチェックを入れた状態でビルド。

f:id:nakamura001:20190417172933p:plain

(3) SubScene という名前のシーンを開いて適当に3Dオプジェクトやテキストなどを置いてみます。

※このシーンの内容が実機に転送されます。

f:id:nakamura001:20190417174524p:plain

(3) 実機でアプリが起動したら、Unityエディタのメニューから Window > UnitySceneViewerKun と選択し、専用のウィンドウを表示します。

(4) Editor と書かれている所をクリックすると接続先の環境が選択できます( Profiler  で選択するのものと同様のものです)。ここで対象の実機を選択します。 Platform についても該当のものを選択し、 Reload ボタンを押すと SubScene の内容が実機に反映されます。

f:id:nakamura001:20190417174035p:plain

 

Unity 2019.1 がリリースされました

Unity 2019.1 がリリースされました。

blogs.unity3d.com

ダウンロードリンクはこちら

リリースノートはこちら

 

メジャーどころの機能は他のサイトでも紹介されると思うので敢えてマニアック機能を紹介。

 

Android 向けに AndroidDevice.SetSustainedPerformanceMode という API が追加。

Android: Added AndroidDevice.SetSustainedPerformanceMode to the API to enable/disable sustained performance mode in runtime

こちらは Android 端末で発生する「温度上昇で CPU クロックが下げられたり、冷めてきたらまた元のパフォーマンスに戻ったりする」という動きを抑制し、一定のパフォーマンスを維持する機能のON/OFF設定をする この Android API そのままの API ですね。

 

また、 Android ビルドに必要な SDK と NDK のインストールが Unity エディタインストール時に一緒に行われる様になりました。

Android: Enabled redistributing Android NDK and SDK components with Android Build Support

これで何かと悩まされてた SDK 周りの問題が(おそらく)解消される事になるでしょう。

 

 Unity エディタインストール時に Unity Hub 上でこんな感じで選択できます。

f:id:nakamura001:20190416223226p:plain

 

『Tokyo XR Meetup #27 開発チームに聞く「エースコンバット7」VRモードに込めた想い』に行ってきました

f:id:nakamura001:20190213134646j:plain
募集ページ

Tokyo XR Meetup #27 開発チームに聞く「エースコンバット7」VRモードに込めた想い | Peatix http://txm27.peatix.com/ 

 Togetterまとめ

togetter.com

最初は玉置絢(たまおき じゅん)さんによる講演、その後に夛湖久治(たご ひさはる)さん、山本治由(やまもと はるよし) さんを加えてのパネルディスカッションの2部構成でした。

 

玉置絢さんの講演

講演は「どこから話しましょうか?」という言葉から始まり、画面にはどんどん過去の年が表示されて行き、遂には画面には「1990年」の表示と「GALAXIAN3」のロゴ。

f:id:nakamura001:20190213134704j:plain

f:id:nakamura001:20190213140053j:plain

当時の「GALAXIAN3」の動画が流されました。

※以降の講演内でも触れられるので先に観ておいた方が良いです。


UGSF ARCHIVE #003 Making of GALAXIAN3

 

■ゲーム体験の流れ

f:id:nakamura001:20190213140108j:plain

(直ぐにゲーム開始では無く、最初に)オペレーターが作戦説明

  ↓

暗号受信

  ↓ 

それではよろしくお願いします

 

f:id:nakamura001:20190213140235j:plain
「最初から最後まであなたがパイロットですよ」と訴えかける構成。体験を作る為にはいきなりゲームスタートでは無く、この演出が必要。

 

エースコンバット7の通常モードとVRモードの違い

f:id:nakamura001:20190213140320j:plain

エースコンバットVRモードでも通常モードに比べると「あなたはパイロットなんですよ」と訴える演出が追加されている。

 

f:id:nakamura001:20190213140451j:plain

f:id:nakamura001:20190213140457j:plain

f:id:nakamura001:20190213140549j:plain

エースコンバット4が出た2001年に O.R.B.S という戦場の絆に使われている物の原型になるものができていた。

 

f:id:nakamura001:20190213140727j:plain
これが後のエースコンバットVRに繋がる。

 

f:id:nakamura001:20190213140754j:plain

ソニーHMD。傾きは取れるデバイス。実はエースコンバット04はこのデバイスに対応していた。

 

f:id:nakamura001:20190213140914j:plain

O.R.B.S.はP.O.D.という名前に変わり、戦場の絆で使われる。

f:id:nakamura001:20190213141016j:plain

ベクション効果(※今でいう Motion Sickness。この効果によりVR酔いが発生する)への対抗策。ロックオンすると自動的に画面中央に捉える様に旋回。

 

f:id:nakamura001:20190213141312j:plain

エースコンバットではレーダやタイム、スコアなどが周囲に配置して有り、視線を動かす範囲が広い。

 

f:id:nakamura001:20190213141325j:plain

VRでは視線を中央に集中させるデザイン。

 

ロックオンで自動的に敵を中央に捉える。ゲーム中に中央に集中するだけでOK。

 

しかし、ゲームに上手くなると画面全体をぼんやり見るようになる。そうなった時に地平線が大きな割合になる。この状態は酔いやすい。

 

f:id:nakamura001:20190213141339j:plain

2012年 Oculus 発売。

f:id:nakamura001:20190213141351j:plain

実は2013年に P.O.D. 向けの「マッハストーム」というタイトルがリリース。中身はエースコンバット

 

f:id:nakamura001:20190213141405j:plain

f:id:nakamura001:20190213141427j:plain

f:id:nakamura001:20190213141439j:plain


マッハストーム

 

f:id:nakamura001:20190213141452j:plain

2013年「エースコンバット インフィニティ」の開発。

 

f:id:nakamura001:20190213141506j:plain

https://www.famitsu.com/news/201403/01049129.html

煮詰まっていてストレスで企画書を書きまくっていた。 

 

f:id:nakamura001:20190213141520j:plain

P.O.D. 活用についての社内コンペが開催された。それに「全視界映像でキャラクター体験」という企画で応募。採用される。

 

f:id:nakamura001:20190213141535j:plain

それが「サマーレッスン」となる。

 

f:id:nakamura001:20190213141548j:plain

P.O.D. ゲームを Oculus DK1 で検証( DK1 に移植して体験してみる)。するとゲームによって、酔いやすいものと酔いにくいものが有る事が分かった。

 

f:id:nakamura001:20190213141602j:plain

f:id:nakamura001:20190213141615j:plain

レールが有るのが重要。この「事前予告」を行う事により、ユーザが「身構える」事ができる。

 

f:id:nakamura001:20190213141719j:plain

VR ZONE 向けのコンテンツ「アーガイルシフト」では酔わない軌道にしている。

 

f:id:nakamura001:20190213141731j:plain■試作中に酔ってしまった部分

  • ビルとビルの間を飛び回る
  • スペースキーを押すと注視した場所へ回転
  • バック移動はダメ、横移動も気を付ける必要あり

 

f:id:nakamura001:20190213141743j:plain

「ドーム筐体の知見」と「VRの最新の知見」を集める為に2人の間を行ったり来たり。

 

f:id:nakamura001:20190213141758j:plain

 

f:id:nakamura001:20190213141814j:plain

f:id:nakamura001:20190213141828j:plain

UI も中央にまとめ、レーダーもコクピットに表示。

 

f:id:nakamura001:20190213141841j:plain

艦載機から離陸するときも僚機が先に射出。

 

f:id:nakamura001:20190213141854j:plain

f:id:nakamura001:20190213141907j:plain

曲がるとき:酔いは一瞬で済ました方がまだまし。予告して、予告して、曲がるときは一瞬。

 

f:id:nakamura001:20190213141920j:plain

意図的に気になる位置に雲を配置。ユーザをそこへ誘導。雲が無かったらユーザは地面が見えていた方が安心感が有るので地面に向かう。

酔いのコップ理論:ユーザ毎にそれぞれサイズの違うコップを持っていてそこに酔いのきっかけが蓄積され、溢れた瞬間に酔う。どんな人でも一瞬で注がれると溢れてしまう。しかし、一切注がれない状態で面白いゲームを作るのは難しい。

 

ちょっとづつ認識して貰って、今日はこれくらいにするかな?という判断をユーザにして貰う。

 

意図的にゲームの途中に、ただ飛ばされるだけのシーンが有る。ここでユーザにコップがあふれてないかな?と判断して貰う。

 

f:id:nakamura001:20190213141933j:plain

ちょっともどって、2014年の「サマーレッスン」。

 

f:id:nakamura001:20190213141946j:plain

近いものは現実感が有る。

 

開発の途中で「最近、ときめかなくなったなぁ」という時が有った。その時はバグでいままでよりキャラクターが数cm遠くに居た。それくらいの差でも体験に変更が起こる。

 

f:id:nakamura001:20190213141959j:plain

f:id:nakamura001:20190213142014j:plain

サマーレッスンではひかりちゃんがゴミを取ってくれるシーンが有る。このドキドキ体験のノウハウがエースコンバットで爆発時に破片が飛んでくるドキドキの演出に引き継がれている。

 

破片が顔近くに飛んでくる。キャノピーに当たって、コンという音がしないとダメ。

 

f:id:nakamura001:20190213142028j:plain

爆撃機が撃ち落され落ちてくる。進行方向は自分の離陸する方向と同じ。

 

f:id:nakamura001:20190213142040j:plain

同じ速度になるようにした。その為、相対速度は凄くゆっくり。

そうすると「ゆっくり近づいてくる」。これはひかりちゃんの手に当たる。

 

この演出により、ユーザは首を回しながらゆっくり観る。

 

「相対的」にゆっくり動くのが重要。

 

f:id:nakamura001:20190213142057j:plain

当事者感。言い方を変えるとバーチャル責任感。

 

意図的に(今までの)ゲームっぽく無い動作をユーザにさせた。

例:コントローラを電話を見立てて電話を取らせる。首を振ってYes/Noを表現。

 

f:id:nakamura001:20190213142112j:plain

通常のゲームで行わない、真上を観る、真後ろを観る事になる様なシーンを意図的に入れた。

 

 

f:id:nakamura001:20190213142128j:plain

クロスモーダル現象。視覚情報から体感をかってに錯覚する現象。熱く感じたり、匂いを感じたりする。

 

普通のゲームだとカメラが引いて爆発だが、VRでは「操作不能 → 煙が出る → 爆発」。

 

煙で埋もれた息苦しさを出したい。


しかし、それをやるとリプレイ性(リプレイを直ぐに実行してゲームを再開する)が損なわれる。


ギリギリの調整で8秒に。それでも普通のゲームにすると長い。

 

(この演出は)地上では発生しないので、空中で強い敵に撃たれて下さい。

 

f:id:nakamura001:20190213142140j:plain

エヴァVRLCLが満たされるシーン。提供するのは「物語」では無く「体験」。

 

f:id:nakamura001:20190213142153j:plain

f:id:nakamura001:20190213142208j:plain

f:id:nakamura001:20190213142222j:plain

f:id:nakamura001:20190213142235j:plain

f:id:nakamura001:20190213142248j:plain



パネルディスカッション

 

それぞれの「バーチャルリアルティ」との出会い

当時はバーチャルリアルティとは言わなかった。
中央型機では体感型と言われていた。

Oclus DK1から。

VRMLから。
サマーレッスンを作るためにVRに出会った。

 

エースコンバットVRに向いていた?

一番最後に入った。「VRお願いします」と。

 

VRにガン向き。知見を整理すればよいと思った。ユーザーがどう動けるかだけだった。元から向いていた

 

これはダメなんじゃないかな? 動くのは今の時期難しいのでは?
戦闘機は画面では数ドットだけの場合も多い。迫力が無いのでは?
近場での爆発など。体験するとトータルで良いものになっていた。

 

サマーレッスンでは地雷原をダッシュしていたがたまたま避けていた。

エースコンバットは向かないと思っていたがAmazonのレビューなどで星5を付けられてるのを見かけてVR作って良かったと思える。

 

「コックピット演出編」

夛湖さんがMFDがとにかく重要だ。

 

コクピットにスコアと残り時間は表示しない。現実にはそれらは存在しない。ポーズ画面に移動した。

 

ゲームと思わせるとその瞬間冷める。リアルに作成し、没入感を高める。

 

ダメージ赤ランプはポイントライトだったので負荷が大きいので外したかった。しかし、近い位置に有るものなので外すわけには行かなかった。

 

コクピットに落ちるフレームの影は削除しても良いのでは? → 結局は乗せる事に。

 

ロールしている時にコクピットに影が落ちるのは本当にリアリティを感じる。

 

「雲演出編」

雲自体はミドルウェアを使っていたので調整が大変だった。

 

雲は負荷が高いので要らないのでは?エースコンバット7になるんだし、雲も新しくなっていないとダメ。

 

VRで観た時にノイズやドットが目立つ事がある。中央だけ解像度を上げる処理を雲にだけ実装。

 

(ステージの)1面:VRだけどちゃんとエースコンバット。自分はちゃんと飛べる。シンプルなステージ。

 

最初の敵を倒した後の移動 → 雨雲の下を通る。

 

圧迫感が出る → リアリティが増す。

 

出撃シーンでは(上記の演出の為に配置した)雲で暗くなるのは避けたい。かっこよくなる配置にしたかった。


今回はVRの演出を優先。一つの雲を移動すると関連した雲の位置も調整も必要。(ゲーム)ペーシング。ボン、ボン、ボンとリズムよく雲を貫かせたい。

 

「UI編」

ミハイのヘッドマウントディスプレイに注目 → SF的な演出。

 

UIが追随するのはNG。
画面の大部分を占めるものが追随するのはNG。

 

キャラクターが被っているヘルメットに表示されている画面が暗くなる → 液晶が起動した事を表現。ユーザに液晶が起動したことを認識させる。

 

キャラクターの首から下が無い。下を向いても体が見えない。

サマーレッスンでは薄青色のキャラクターを出していた。

中腰のキャラを出す事を検討 → ユーザの姿勢と変わってしまう → 消す事に。

 

深度矛盾。

常時表示したい物は実際の距離とは関係無く描画を行う処理が入っている。速度と高度のメーターはコクピットを観てる時にはコックピットの前に描画するのでは無く、消す。

 

エースコンバットでは字幕が出る。字幕の距離の違和感を調整。コクピットと重なるタイミングでフワッと消している。

 

レベルデザイン編」

敵の数。 VR だと通常のモードに比べると出せる敵の数が圧倒的に少なくなってしまう。

 

やりたいのは敵の数では無く、体験。

 

数の暴力は演出につかえる。

 

VR では代わりに雲などを演出に使う。

 

通常:重なって(同じタイミングで)あちこちの方向から出てくる。選択の喜び。
VR:心構えや休憩を挟む演出。

 

この様にしないと体験ではなく、ただのゴーグルを付けて遊ぶゲームに。

 

2面冒頭。基地から飛び出て、爆撃機が落ちてくるとき。

 

一番冒頭が重要。冒頭に興奮を高めた状態でスタート。インパクトのあるシーンを最初に。ユーザに酔うんじゃないかと疑われたらダメ。

 

直接、 Unreal Engine 上で演出を作成。

 

台本は半分無視。中のパイロットの気持ち、地上兵器の気持ち。周りの仲間がどうしてもこいつを飛ばせという思い。

 

サウンド編」

空からcm単位で降ってくるシーン。距離だけじゃなくて音も凄く調整が行われた。


90フレームなかったイベントシーンだが徹底的に拘った。

 

キャノピーにあたる残骸の音にリアリティが無かった。

 

なかなか理想的な音にならなかった → 車に乗せて小石を投げようかとまで話た → そこまで話したら実際にはやらないでもサウンドの人が理解してくれた。

 

(この効果音は)実在、没入に大きな効果が有った。

 

爆撃機が落ちてくる左をみてもらわないといけない。しかし、戦場なので騒がしい為に音が目立たない。

 

掃除機の様な音にしてくれ、高音。あきらかにおかしい音。

 

サマーレッスンではあれ見てでOKだった → この手法はエースコンバットでは使えない。

 

戦場はうるさくて当たり前 → 常にうるさくしている → 空に移動すると音が聞こえなくなる → 戦場から外れたんだ。

 

映画のサウンドの人などは良い音を提供したい → 耳障りの良い音。

 

体調をくずさない範囲でぎりぎりの爆音。

 

「ボツ仕様をまとめて語る」

ベイルアウト(緊急脱出の為に操縦席から射出されるヤツ)は一度作った。アーケードだと専用レバーを準備して、それを引く事ができるが、PSのコントローラでは自然にできない。パラシュートのフワッと落ちていく方法は酔いやすい。

 

操作の簡単な「スタンダード操作」がVRモードには無い。左右移動時に機体がバイクみたいに横移動をする → 横滑りを予告なしにするのは酔う、ダメ。

 

動的アイリス演出。周囲の画像を絞る。浮遊感が無くなった。浮遊感と酔いの両立は難しい。

 

酸素マスク。酔い防止も有ると思い出してみた。実際にやってみると鬱陶しい。

 

ルーティングの矢印。UIで矢印を出す。酔いは低減できるが体験的には冷める。

 

業務用から家庭用VRに来てどうだったか?

大きくは違わなかった。

 

サマーレッスンでの知見が加わった。
視線を誘導する。
冷める。知見はあったが実例が無かった。

 

最初にストレスを与えるとコップが増す。

 

サマーレッスンから受け継がれた「プロジェクトスキル」の話

60fps至上主義。どのVRチームでも言われる。

 

VRレビュー。誰でも声をだせる。付箋紙にまとめる。2週間に一度やる。

事前に見ておいて下さいね → 打合せ。

ディレクターなどは体験が多い為に次第に慣れてしまう。(体験に慣れてない)最近入ってきた人の声こそ聴くべき。

画面を観ただけで意見を言うのはNG。VRで体験していないと発言権は無い。

 

「ACE7 VR」がモノになったと思った瞬間は?

MFDに影が落ちる、ライトの影響を受ける。

 

最初。コックピットがバシッと有った。ゲームは着地点が見えないとダメ。そこが見えたのでこれは行けると思った。

 

慣れは危険。その視点重要だね。

 

ささいな瞬間。サマーレッスンではひかりちゃんに化粧のテクスチャが入った瞬間に行けると思った。

 

煙につつまれた時にユーザはあんなに撃たなかったら良かったと後悔する。

おまけ

GALAXIAN3 のチラシにこんなメッセージが書かれてた様です。

関連情報

game.watch.impress.co.jp

 

ECS の環境準備中に 'Unity.PerformanceTesting' のエラー発生

Package Manager から ECS ( Entity Component System ) の環境をインストールすると以下のエラーが発生しました。

Assembly has reference to non-existent assembly 'Unity.PerformanceTesting' (Packages/com.unity.entities/Unity.Entities.PerformanceTests/Unity.Entities.PerformanceTests.asmdef)

 検索するとこちらがヒット。

0.0.12-preview.23: non-existent assembly 'Unity.PerformanceTesting' · Issue #95 · Unity-Technologies/EntityComponentSystemSamples https://github.com/Unity-Technologies/EntityComponentSystemSamples/issues/95 

 対応方法としてはプロジェクトフォルダ内の Packages フォルダに有る manifest.json  に "com.unity.test-framework.performance": "0.1.49-preview" を追記するというものです。

 

この様に追記します。

{
"dependencies": {
"com.unity.test-framework.performance": "0.1.49-preview",
"com.unity.ads": "2.3.1",
"com.unity.analytics": "3.2.2",
"com.unity.burst": "0.2.4-preview.41",
"com.unity.collab-proxy": "1.2.15",

(以下省略)