簡體   English   中英

RigidBody2D凍結X位置

[英]RigidBody2D freeze X position

我想知道是否有一種方法可以使用Unity的RigidBody2D模擬以下代碼行,而不是使用普通的RigidBody。

rigidbody.constraints = RigidbodyConstraints.FreezePositionX;

我希望我的球員x位置在碰到某些東西時凍結。 雖然我可以使用上述內容,但我需要將所有2D碰撞重新加工以處理3D碰撞。 我寧願避免的痛苦。

這是由於Box2D引擎用來做模擬。 它不直接對剛體本身提供約束。 然而它確實提供關節。

您想要了解的是Slider Joint 2D 這將允許您限制特定方向的移動。

默認情況下,它會凍結/約束X位置(即您可以向上或向下移動)。 通過修改角度,您可以更改允許對象移動的線。

所以,假設你想要垂直約束運動。 在這種情況下,您添加一個如下所示的滑塊關節:

這將允許特定的2D剛體僅向上或向下移動。 這里有幾點需要注意。 關節與其他剛體有關,通常會添加到“連接的剛體”中。 如果不這樣做,它將在原點(0,0)隱式設置一個。 當你可能沒想到它時,這會產生將你受約束的身體折斷的效果。 可以通過適當更改“連接錨點”設置來修改此設置。

如果你希望水平約束剛體,你可以像以前一樣,增加一個角度。 將它設置為90度就可以了。

這是如何適合您的特定設置和代碼,你必須嘗試找出。 但是為了幫助你,我在Github上創建了一個小型的演示場景。

它不會做太多,但通過與場景視圖中的兩個方塊進行交互(嘗試沿着軸進行平移),您可以了解它正在做什么。

這是我在Unity2D中使用的腳本組件,用於鎖定任何對象上的軸。 只需附上腳本,從下拉列表中選擇一個軸,你就應該好好去。 注意你的對象當然需要一個rigidbody2d和collider才能正常工作。

感謝@Bart對Slider Joint 2D如何工作的一個很好的答案。 如果這個腳本沒有意義,請看他的答案。

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;
        }
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM