【Unity】GameObjectでもUnity Physicsを使う
試しにRoll a BallをUnity Physicsで作ってみた所、このテクニック無しだと少し面倒な所があったので紹介。
GameObjectでUnity Physicsを使う
Unity PhysicsはECSのための機能です。とは言えECSはまだ機能が全くと行っていいほど足りてない玩具であり、これだけでゲームを作るのは正直辛いとです。なので基本的にGameObjectを使いつつUnity Physicsを使う方法を考えてみます。
具体的にはSkinnedMeshRendererで動くキャラクターをUnity Physicsのゲーム空間に含めることを目標とします。
キャラクターが消えるのを解決する
とりあえずConvert To Entity
や SubScene
を設定したところ、ゲーム実行時にキャラクターが消滅しました。これは Convert To EntityやSubSceneが Convert And Destroy
の設定になっているためです。この設定だとGameObjectは自動的に破棄されます。
なのでConvert To Entity
の設定を Convert And Inject GameObject
に変更します。この時、今までのMeshColliderやRigidbodyを設定しているとRigidbodyとPhysicsBodyの両方が設定されてしまうので、Rigidbodyは消してPhysicsBodyやPhysicsShapeのみの設定にします。
表示はされますが、動きません
キャラクターが動かない問題を解決する
次にPhysicsBodyを設定しているのに動かない問題です。
これは実際には動いていますが、Transformに反映されないために起こります。これを確認するにはPhysics Debug Displayを使用するのが手っ取り早いです。
これで実際のColliderの位置を確認出来ます。試しに見てみた所、Colliderは動いていますがTransformに反映されていませんでした。
これの解決には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が動きます。