【Unity】Multi-Scene Physicsで、物理演算の世界を分割する
Unity 2018.3の目玉機能(???)の一つである物理演算周りの更新、その一つであるMulti-Scene Physicsについてです。
Multi-Scene Physics
Unityの物理演算では、基本的に一つの空間にColliderやRigidbodyを配置し、それを運用していました。配置したRigidbodyははスリープしない限り動作していましたし、Raycastで特定のオブジェクトを無視するにはLayerによるフィルターが必要でした。
Multi-Scene Physicsの対応により、Unityは単一のゲーム空間内に複数の物理演算の空間を持てるようになりました。
何が出来るのかって? ソレを説明しましょう。
PhysicsScene単位で物理演算の速度を変化させる
まず最初に紹介したいのは、物理演算の再生をPhysicsScene単位で行えるということです。PhysicsScene.Simulate(deltatime)で時間を進められるので、特定のオブジェクトのみをスローにしたり、逆に高速再生して物理演算の結果を予測する等を行うことが出来ます。
multi scene physics, multi time scale #unity3d pic.twitter.com/r5zbkaFWam
— 椿 (@tsubaki_t1) 2018年11月16日
その他、屋内の物理演算の進行をドアを開けるまで止める、賑やかし用の物理演算の精度を雑にする等、色々と時間に関わるマジックを使用できそうな感じがあります。
なお、接触判定は同じPhysicsScene同士でしか行なえません。
例えばスロー再生するためにPhysicsSceneを移動した場合、スロー再生するためのPhysicsSceneにも通常のシーンと同じ当たり判定がないと、壁を貫通します。
さて、そうなると使い所がかなり限定されry
PhysicsScene単位でRaycast
もう一つはRaycastをPhysicsScene単位で行えます。
例えば判定用Colliderが重なっている時、特定のPhysicsSceneのColliderのチェックのみを行う等ができそうです。
こうった場合、普通はLayerを設定してマスクをかけるのですが、PhysicsScene単位で出来るので色々と便利そうに見えます。
なお使えるのはRaycastのみです。
使い方
このPhysicsSceneはScene単位で制御されています。
SceneManagerからSceneをロードする際、第二引数にnew LoadSceneParameters(LoadSceneMode.Additive, LocalPhysicsMode.Physics3D)をセットしておきます。意味は加算ロードかつ、3D用PhysicsSceneの追加…です。
もし通常の物理演算として登録したい場合は、LocalPhysicsMode.Noneです。
あとはscene.GetPhysicsScene()でSceneManagerを取得し、physicsScene.Simulate(deltaTime)やphysicsScene.Raycast等を実行する感じです。
なおLocalPhysicsMode.None以外で取得したSceneは、Auto Simulationが有効でも物理演算をシミュレーションしません。時間はphysicsScene.Simulate(deltaTime)を使用して進行させます。
基本的にInspectorでシーンを展開してると使えないので(ロードした時のみLocalPhysicsModeを指定出来るっぽい?)この機能を使う場合にはシーンは閉じておく必要があります。

加算ロードではなく任意のシーンを作って使用したい場合は、new CreateSceneParameters(LocalPhysicsMode.Physics3D)をつけてシーンを作成し、あとはSceneManager.MoveGameObjectToScene(moveGameObject, scene)等で作ったシーンにGameObjectを移動させます。
なお新しく作ったシーンにはColliderが無いでしょうから、ColliderのGameObjectを移植等をする必要がありそうです。
面白い機能だね!どんな時に使えるの?
ううーん…キャラクターのような物理演算とかけ離れた物を別ワールドに持ってっちゃうとか、もしくは軌道計算…? ううーん…?
<文章はここで途切れている…>