【问题标题】:Avoid falling off edge避免掉出边缘
【发布时间】:2018-09-05 05:10:03
【问题描述】:

我正在尝试在 Unity3d 中制作一个简单的 FPS 游戏,其中角色不能从平台上掉下来,除非他们从平台上跳下来,走掉应该是不可能的。 我为移动平台上的对象制作了一个脚本:

public GameObject Player;

private void OnTriggerEnter(Collider other)
{
    if (other.gameObject == Player)
    {
        Player.transform.parent = transform;
    }
}

private void OnTriggerExit(Collider other)
{
    if (other.gameObject == Player)
    {
        Player.transform.parent = null;
    }
}

我想出解决这个问题的唯一方法是创建一个短的、不可见的盒子碰撞器作为阈值,但将它添加到每个步行空间的每个边缘将是一场噩梦。我也不能使用导航网格。

【问题讨论】:

标签: c# unity3d


【解决方案1】:

在指向下方的玩家面前进行光线投射并查看它是否达到关卡将是一种选择,但是大量运行此操作非常昂贵。

如果您的关卡是方形的(其他形状也可以,但需要一些数学运算),您可以记下左上角和右下角作为边界点,并检查您的玩家位置 + 每帧的步行速度是否超出这个边界正方形。如果是,则拒绝该举动。

例如

if((transform.position + transform.forward * walkingSpeed * time.deltatime).x > maxX || < minX || .y > maxY || .y << minY)
    //Deny the move

【讨论】:

    【解决方案2】:

    与使用碰撞器检测地面以允许/禁止跳跃的方式相同,您也可以使用碰撞器检测平台边缘。

    在玩家对象底部每条边的每个角或中点添加一个小型对撞机。只有当玩家 A 侧的碰撞体与地面接触时,玩家才能向 A 方向移动。这意味着当您接近壁架时,最靠近壁架的一侧将失去与地面的接触,因此阻止了该方向的任何移动。

    如果玩家正在跳跃,那么无论碰撞体是否接触,都允许向各个方向移动。

    您将不得不考虑这些碰撞器的位置以及允许移动的方向,但这对我来说似乎是一种简单而有效的方法。

    【讨论】:

      【解决方案3】:

      为边缘创建一个预制件,在任何有边缘的地方放置预制件,这样预制件就是真正的边缘。这将确保有效的代码始终存在于边缘。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-12-07
        • 1970-01-01
        • 2015-04-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多