我在层次结构中创建了一个新的空游戏对象。 附有一个Box Collider:
并在Box Collider上更改了此设置:
我将它的中心属性设置为0,0,0 并将大小设置为x = 500 y = 600 z = 500 我还将IsTrigger设置为打开(选中复选框)。
这是Terrian的细节:
宽度500长度500高度600
当我看到场景窗口时,看起来盒子在地形边缘周围应该是:(可能在右侧,盒子和地形之间有一些空间?)
这是附加到空游戏对象(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的速度行走。 当它到达地形边缘时,事件不会触发。玩家继续在空中行走几秒钟,然后事件才会触发并在断点处停止,但玩家已经离开了地形区域。
我想要做的是,一旦玩家触摸墙壁触发事件并做一些事情,例如让玩家走在地方,这样墙就挡住了他。但是现在当玩家离开地形区域时会触发该事件。
答案 0 :(得分:1)
这看起来像是在对撞机内启动播放器并使用OnTriggerExit的结果。直到所有玩家的对手都在定义的框之外时才会调用该方法。
你可以让盒子变小,这样它的外面就会有一些“填充”的地形。这可能是最快的,但我建议选择2。
你可以制作4个箱子对撞机,每个墙壁一个。没有一个巨大的对撞机并等待玩家走出去,而是将它们想象为在你的地形的每一侧都放置一层的瘦墙。不要使它们成为触发器,而是使用OnCollisionEnter事件。如果您通过物理移动他,这将自动停止播放器,您也可以获得该活动。如果你愿意,你仍然可以使它们成为触发器并使用OnTriggerEnter,但为什么不使用物理系统呢?
我希望这会有所帮助,祝你的项目好运!
答案 1 :(得分:-1)
1)如果希望在播放器越过触发器之前检测到播放器,则可以调用OnTriggerEnter。
2)另一种方法是制作触发器碰撞器并且它们会自动阻止玩家越过地形边界