尝试我的第一个 Unity 项目。这是关于一个自上而下的游泳者的故事。通过切换游泳者的碰撞器,他可以在船下游泳:
if (Input.GetKeyDown(KeyCode.A)) swimmerCircleCollider.enabled = !swimmerCircleCollider.enabled;
同时我不希望他能够在码头下面游泳,这就像一个无法跨越的障碍/边界/墙壁或只是可玩区域的尽头。我怎样才能做到这一点?
禁用碰撞器的想法一开始就是错误的吗?如果是这样,请提供一些指导以获得更好的解决方案。
您可以在刚体或玩家的碰撞体上使用排除层,我可以尝试并解释如何执行此操作,但我可能无法 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();
}
希望这能解决您的问题:)