猿か
成功体験に味を占めたのか毎日のように扇動的なハッシュタグがTwitterのトレンド入りしてくることにウンザリしている皆さんこんにちは。よっぽど「~に抗議ます」って言葉が好きなんでしょうね。無駄に吠える猿。
さて、まるで数学の問題のようなタイトルですが、これは最近購入したUnityアセットの名前です。Google先生に日本語訳をお願いするとこんな感じの名前になる。
"Fluid Portals System & Non-euclidian Tunnels"
"Portal"とついていることから察しの言い方は気づくかもしれませんが、これはPortalシステムを簡単に導入できるアセットで、今回はこのアセットについて紹介したいと思います。
Portal的システム
特に説明する必要もないぐらい「Portal」というギミックは同名のゲームの存在で有名かと思いますが、その仕様を一言で説明すると「どこでもドア」的なもの、と言えます。
「Portal」は二つの空間を繋ぐゲートとなり、Portal越しに互いの世界を覗き見ることができるし、Portalをくぐり抜けることで両空間を行き来することができるシステムです。
この「Portal」をUnityで実現する手法については色々なブログで取り上げられていますが、大抵は同じ手法で説明されています。
曰く、Portal的システムを構築するには以下の3つの処理が必要らしい。
- 相手側の世界を表示する
- こちら側の視点と相手側の視点を連動させて動かす
- 相手側の世界へ移動させる
例えばAとBの二つの空間があったとして、AのエリアにPlayerがいるとします。そして、Player側の映像はMainCameraで撮影されているとします。
一方、BのエリアにもCameraを設置します。しかし、こちらの映像はゲーム画面に直接映すのではなくA側のPortalに設定されているRenderTextureに表示させます。
二つのCameraは連動しておりPlayerに合わせてMainCamraが動くと、BエリアのCameraも同じように動きます。
MainCameraが上を向くとBエリアのCameraも上を向き、Playerが前後左右に移動するとそれに合わせてどちらのCameraも動きます。
そして、PlayerがPortalに接触(Collider内に侵入)するとPlayerをMainCamraと共にBエリアのPortal位置へ移動させます。
この時、B側のCameraは無効化され、逆にA側にMainCameraと連動したCameraが設置されます。
手法だけ聞くと簡単そうに思えますが、いざ実装しようとすると意外と面倒くさいです。
というのも、カメラの動きを連動させるにも互いのPortalの向き(方向)を考慮しないといけないし、Playerを相手世界へ移動させるにも違和感のないスムーズな移動をさせるにはPortalに対する進入角度と退出角度を合わせる必要がでてきます。
そこで今回紹介するアセット「Fluid Portals System & Non-euclidian Tunnels」の登場です。
Fluid Portals System & Non-euclidian Tunnels
前置きを長々と説明しましたが、それもこのアセットではセットアップ等の作業が殆どいらずに済む為、特に書くことがないからです。
Fluid Portals Systemを使ってPortalシステムを実現する手順は以下の3つ
1.Prefabs配下にある「portals_back_and_forth」をシーン内に配置
2.子オブジェクトのportal_one, portal_twoを双方向で移動させたい位置に置く
3.Prefabs配下の「Player(dg_simpleFirstPersonController)」をシーンに配置
以上になります。各Prefabをシーンに配置するだけ。もし、導入するシーンにCameraが既に設置されている場合は3.の工程は不要です。その代わり
- Cameraに"MainCamera"のtagを設定する
- Portalで移動させるPlayerのオブジェクトに"Player"のtagを設定する
上記二つの設定を行う必要があります。
また、CameraはPlayerオブジェクトの子オブジェクトであることが望ましいみたいです。(そうでないとPortal移動時に変な回転が起きる)
前置きの中で説明したMainCameraと連動させるCamera等はゲームPlay時に自動的に生成される為、こちら側での設定は不要です。
ただ、Portalを同じシーン内に複数個設置する場合はPortalSetupコンポーネントのGroupID欄にIDを設定する必要があります。
試しにA,Bの部屋を作ってそれぞれにPortalを設定しました。
オレンジの部屋(Room-A)にある青いポールはPlayerです。
この状態で動かしてみるとこんな感じ、奇麗にPortalシステムが実現されていることが分かります。
実はこのアセットの導入から上の動画を撮るまで一時間もかかっていません。
ドキュメントが全て英語で簡単な説明しかない、かつ設定手順はYoutubeを見ないけない、と不親切な点もありますが、先程も紹介したように殆ど設定不要で導入できるし、何よりPortal間の移動、表示がスムーズで違和感のないPortalシステムを作ることができます。
製作中のゲームでPortalシステムを使う事を考えている方はこのアセットの導入を検討されてはどうでしょうか。