こんにちは上津原です。 今回はUnityネタです。
現在Unity3Dを触っているのですがやっと面白くなってきました! そしてそこで、調べてなかなか出てこなかった「一人称視点でモノを浮き上がらせて移動させる方法」について書いてみようと思います。
具体的に説明すると こんな風に下に落ちているオブジェクトを
こんな風に中心点で維持して持ち上げる方法ということになります。
調べてみると、方法は2種類ありました。
- MainCameraをParentにする方法
- FiexdJointを活用する方法
それぞれ紹介していきます。
MainCameraをParentにする方法
対象となるオブジェクトを、カメラのParentに指定して、グルーピングしてしまう方法です。 コードは以下のようになります。
※動かす対象に「Target」タグをつけています。
Unityでモノを持ち上げ、離す。左クリックで物体をとらえ、 左クリックで落とす、右クリックで投 ...
上記ソースは、ついでに持ち上げた時に右クリックすると前方に投げるファンクションも含まれています。
この方法の特徴
モノを持ち上げて移動しているとき、その場から動かない設定をしているオブジェクト、またはリジットボディを設定していないモノにぶつかった場合、コリジョンを無視する結果となります。 動かすことにできるものにぶつかった場合は、Massを無視してあたったシテを移動させます。 持ち上げている物体がすり抜けてしまう、というわけです。
なので、その方が都合がいいぞ、という場合はこちらを利用するといいかもしれません。
FiexdJointを活用する方法
対象となるオブジェクトとカメラをPhysicsの機能である「Fixed Joint」でつないでしまう方法です。 こちらの方法は、上記方法と違い、モノをすり抜けずにあたり判定をきちんと保って移動させることができます。 実装はは以下のようになります。
まず、MainCameraにPhysicsの中にある、FixedJointを追加します。
FixedJointを追加すると、勝手にRigitBodyが追加されます。 「Mass」を適当な値にし、 「Is Kinetic」にチェックを入れます。 これを入れないとカメラが落ちて行ってしまうので気を付けてください。
そしてコードは以下のようになります。
こちらのソースは、前方に投げるアクションはついていません。
この方法の特徴
前述しましたが、持ち上げたもののあたり判定を保ち続けることができます。 Massのことも考慮され、重いものを動かすことはできないし、軽いものは動かすことができます。 そして通り抜けられないモノにあたるとブルブルしてちょっと怖い結果にはなります。
まとめ
物理の法則を考慮する必要がないならParentに! 考慮する必要がないのならFixed Jointがいい! という考えに落ち着きました。
どっちを使うにせよ、こんなにお手軽に実装できてしまうのがすごい。Unity恐るべし。
株式会社ネクストでは、一緒に世の中をもっと便利に楽しくしたい仲間を募集中です。 主体的に楽しみながら仕事できる方からのエントリーお待ちしています! http://recruit.next-group.jp/