テラシュールブログ

旧テラシュールウェアブログUnity記事。主にUnityのTipsやAR・VR、ニコニコ動画についてのメモを残します。

【Unity】GameObjectでもUnity Physicsを使う

f:id:tsubaki_t1:20190422011739j:plain

試しにRoll a BallをUnity Physicsで作ってみた所、このテクニック無しだと少し面倒な所があったので紹介。

GameObjectでUnity Physicsを使う

Unity PhysicsはECSのための機能です。とは言えECSはまだ機能が全くと行っていいほど足りてない玩具であり、これだけでゲームを作るのは正直辛いとです。なので基本的にGameObjectを使いつつUnity Physicsを使う方法を考えてみます。

具体的にはSkinnedMeshRendererで動くキャラクターをUnity Physicsのゲーム空間に含めることを目標とします。

キャラクターが消えるのを解決する

とりあえずConvert To EntitySubScene を設定したところ、ゲーム実行時にキャラクターが消滅しました。これは Convert To EntityやSubSceneが Convert And Destroyの設定になっているためです。この設定だとGameObjectは自動的に破棄されます。

f:id:tsubaki_t1:20190422012357g:plain

なのでConvert To Entity の設定を Convert And Inject GameObjectに変更します。この時、今までのMeshColliderやRigidbodyを設定しているとRigidbodyとPhysicsBodyの両方が設定されてしまうので、Rigidbodyは消してPhysicsBodyやPhysicsShapeのみの設定にします。

f:id:tsubaki_t1:20190422012038j:plain

表示はされますが、動きません

キャラクターが動かない問題を解決する

次にPhysicsBodyを設定しているのに動かない問題です。

これは実際には動いていますが、Transformに反映されないために起こります。これを確認するにはPhysics Debug Displayを使用するのが手っ取り早いです。

これで実際のColliderの位置を確認出来ます。試しに見てみた所、Colliderは動いていますがTransformに反映されていませんでした。

f:id:tsubaki_t1:20190422013026j:plain

f:id:tsubaki_t1:20190422012903g:plain

これの解決にはCopyTransformToProxyを設定するのが良いですが、ConvertToEntityと機能が被るので、IConvertGameObjectToEntity系の機能を自作します。

using Unity.Entities;
using UnityEngine;
using Unity.Transforms;

[DisallowMultipleComponent]
[RequiresEntityConversion]
public class CopyTransformToComponentConvert : MonoBehaviour, IConvertGameObjectToEntity
{
    public void Convert(Entity entity, EntityManager dstManager, GameObjectConversionSystem conversionSystem)
    {
        dstManager.AddComponentData(entity, new CopyTransformToGameObject());
    }
}

あとはUnity Physicsで動かすキャラクターに上のコードCopyTransformToComponentConvertを設定してやれば、Unity PhysicsでGameObjectが動きます。

f:id:tsubaki_t1:20190422013621g:plain