3

通常の RigidBody を使用するのではなく、Unity の RigidBody2D を使用して次のコード行をエミュレートする方法があるかどうか疑問に思っています。

rigidbody.constraints = RigidbodyConstraints.FreezePositionX;

プレイヤーの x 位置が何かと衝突したときにフリーズするようにします。上記を使用することはできますが、3D コリジョンを使用するには、すべての 2D コリジョンを作り直す必要があります。避けたい痛み。

4

2 に答える 2

6

これは、Box2D エンジンを使用してシミュレーションを行うためです。剛体自体に直接制約を与えるわけではありません。ただし、ジョイントは提供します。

調べたいのはSlider Joint 2Dです。これにより、特定の方向への動きを制限できます。

デフォルトでは、X 位置をフリーズ/拘束します (つまり、上下に移動できます)。角度を変更することで、オブジェクトが移動できる線を変更できます。

では、垂直方向の動きを制限したいとしましょう。その場合、次のようなスライダー ジョイントを追加します。

これにより、特定の 2D リジッド ボディが上下にのみ移動できるようになります。ここで注意すべき点がいくつかあります。ジョイントは、通常は「接続された剛体」に追加する他の剛体と関連して機能します。そうしないと、暗黙的に原点 (0,0) に設定されます。これは、予期しない場合に、拘束されたボディをそこにスナップする効果があります。これは、「Connected Anchor」設定を適切に変更することで変更できます。

剛体を水平に拘束したい場合は、以前と同じように、角度を追加して行います。90度に設定するとうまくいきます。

これが特定のセットアップとコードにどのように適合するかは、試して把握する必要があります。しかし、あなたを助けるために、Githubで小さなデモシーンを作成しました。

大したことはありませんが、シーン ビューで 2 つの四角形を操作すると (軸に沿って移動してみてください)、何をしているのかがわかります。

于 2014-03-22T15:47:07.667 に答える
0

Unity2D でオブジェクトの軸をロックするために使用するスクリプト コンポーネントを次に示します。スクリプトを添付し、ドロップダウンから軸を選択するだけで準備完了です。もちろん、オブジェクトが適切に機能するには、rigidbody2d とコライダーが必要になることに注意してください。

Slider Joint 2D の仕組みに関する素晴らしい回答をくれた @Bart に感謝します。このスクリプトが意味をなさない場合は、彼の回答を参照してください。

using UnityEngine;
using System.Collections;

enum AxisDirection {
    x, y
}

[RequireComponent (typeof (SliderJoint2D))]
public class AxisLock : MonoBehaviour {
    [SerializeField] AxisDirection lockAxis;

    void Awake () {
        SliderJoint2D slider = GetComponent<SliderJoint2D>();

        slider.connectedAnchor = new Vector2(transform.position.x, transform.position.y);
        slider.collideConnected = true;

        if (lockAxis == AxisDirection.x) {
            slider.angle = 90;
        } else {
            slider.angle = 0;
        }
    }
}
于 2014-08-24T07:54:58.680 に答える