如何让玩家只穿过某些物体,而不穿过其他物体?

问题描述 投票:0回答:1

尝试我的第一个 Unity 项目。这是关于一个自上而下的游泳者的故事。通过切换游泳者的碰撞器,他可以在船下游泳:

if (Input.GetKeyDown(KeyCode.A)) swimmerCircleCollider.enabled = !swimmerCircleCollider.enabled;

同时我不希望他能够在码头下面游泳,这就像一个无法跨越的障碍/边界/墙壁或只是可玩区域的尽头。我怎样才能做到这一点?

禁用碰撞器的想法一开始就是错误的吗?如果是这样,请提供一些指导以获得更好的解决方案。

c# unity-game-engine game-physics
1个回答
0
投票

您可以在刚体或玩家的碰撞体上使用排除层,我可以尝试并解释如何执行此操作,但我可能无法 100% 掌握所有内容。当然,如果您有任何问题,请告诉我,我可以尽力提供帮助。无论如何,

第1步:

选择船舶游戏对象或预制件(如果您生成它们)。并找到顶部的图层下拉菜单。

现在单击它并按添加图层,在其中一个用户图层中为该图层编写一个名称(例如“ship”),然后返回到船舶游戏对象并将其选择为图层。另请注意图层编号,当您选择它时,所有图层都会显示该编号。

第2步:

现在在脚本内部,我们需要引用该层,有两种方法可以执行此操作,对于更简洁的方法,您可以将层作为 int 引用,并将其设置为之前的层编号。作为示例,我将使用第 4 层,正如您在上面看到的,它是水。

private int waterLayer = 4;

或者,如果您想使用多个图层,您可以提供一个图层蒙版,您可以通过将其公开来在检查器中进行编辑。

public LayerMask shipLayer;

现在要在能否通过之间进行切换,我们可以修改 Rigidbody 或碰撞器的 exludeLayers 属性,因为您之前使用过圆形碰撞器,我将向您展示如何应用它:

// get a reference
private CircleCollider2D collider;
public LayerMask shipLayer;
// OR
private int shipLayerInt = 6;
// bool to control whether we can go through ships
private bool goThroughShips = false;

// assign the collider to the collider present on the object
void Start() {
    collider = GetComponent<CircleCollider2D>();
}

// toggle
void Update() {
    // toggle the value
    if (Input.GetKeyDown(KeyCode.A)) goThroughShips = !goThroughShips;
    if (goThroughShips) {
        // for information on what << means, see the docs
        // https://docs.unity3d.com/Manual/layermask-set.html
        collider.excludeLayers = 1 << shipLayerInt
        // OR
        collider.excludeLayers = shipLayer;
    }
    else {
        // creating a new layermask defaults it to none
        collider.excludeLayers = new LayerMask();
    }

希望这能解决您的问题:)

© www.soinside.com 2019 - 2024. All rights reserved.