如何正确使用隐形墙?只有在玩家走出地形边缘后才会触发

How do i use invisible walls properly ? Only after the player is walking out the terrain edge for some it's triggering

我在层次结构中创建了一个新的空游戏对象。 附加一个盒子对撞机:

并在 Box Collider 上更改了此设置:

我将它的中心 属性 设置为 0,0,0 并将大小设置为 x = 500 y = 600 z = 500 我还将 IsTrigger 设置为打开(复选框已选中)。

这是 Terrian 的详细信息:

宽 500 长 500 高 600

当我查看场景时 window 似乎盒子在地形边缘周围,因为它应该是:(也许在右侧,盒子和盒子之间有一些 space地形?)

Scene Screenshot

这是附加到空游戏对象 (InvisibleWalls) 的脚本。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class BoxCollider : MonoBehaviour {

    // Use this for initialization
    void Start () {

    }

    // Update is called once per frame
    void Update () {

    }

    void OnTriggerExit(Collider c)
    {
        Destroy(c.gameObject);
    }
}

这只是为了测试。 我在行中添加了一个断点:

Destroy(c.gameObject);

只是为了检查事件触发的时间。 玩家 (ThirdPersonController) 以 10 的速度行走。 当它到达地形边缘时,事件不会触发。玩家继续在空中行走几秒钟,直到事件被触发并停在断点处,但玩家已经离开了地形区域。

Event Triggered

我想做的是一旦玩家接触到墙壁就会触发事件并做一些事情,例如让玩家在原地行走,这样墙壁就会挡住他。但现在当玩家离开地形区域时会触发该事件。

好吧,这看起来像是在对撞机内启动播放器并使用 OnTriggerExit 的结果。直到所有玩家的碰撞器都在定义的框外时才会调用该方法。

  1. 你可以把盒子变小,这样在它的外面就会有一些"padding"地形。这可能是最快的,但我会推荐选项 2。

  2. 您可以制作 4 个盒子碰撞器,每面墙一个。与其拥有一个巨大的对撞机并等待玩家走出去,不如将它们想象成在地形的每一侧放置一个的薄墙。不要让它们触发,而是使用 OnCollisionEnter 事件。如果您通过物理移动他,这将自动停止播放器,并且您也会收到事件。如果需要,您仍然可以使它们成为触发器并使用 OnTriggerEnter,但为什么不使用物理系统呢!

希望对您有所帮助,祝您项目顺利!

编辑:Found a video that explains method 2

1) 如果您希望玩家在通过触发器之前被检测到,您可以调用 OnTriggerEnter。

2) 另一种方法是制作触发器 Colliders,它们会自动阻止玩家穿越地形边界