Unity3D - 检测移动平台上的碰撞

Unity3D - Detecting Collisions on a Moving Platform

我正在尝试创建一个移动平台,它可以移动与其连接的物体,但也允许连接的物体检测高速碰撞。

我第一次尝试使用transform.Translate()来移动物体,但这不支持那些高速碰撞。

注意:我连接到红色立方体下的平台的所有脚本示例。

public Transform connectedTo; // The red cube in the gif
private Vector3 lastPosition;

void FixedUpdate() {
    // Calculate how much the vector has changed
    Vector3 amountChanged = transform.position - lastPosition;

    // Apply the amount changed to the connected object
    connectedTo.transform.position += amountChanged;

    // Update the last position
    lastPosition = transform.position;
}


然后我尝试使用 Rigidbody.MoveTowards(destination);,但结果相同:

public Transform connectedTo; // The red cube in the gif
private Vector3 lastPosition;

void FixedUpdate() {
    // Calculate how much the vector has changed
    Vector3 amountChanged = transform.position - lastPosition;

    // Get the point in which the object must move to
    Vector3 destination = connectedTo.transform.position + amountChanged;

    // Apply the amount changed to the connected object
    connectedTo.GetComponent<Rigidbody>().MoveTowards(destination);

    // Update the last position
    lastPosition = transform.position;
}

这是我在红色立方体上的刚体设置:

墙壁和平台都有一个标准的盒子碰撞器。

我读到要检测这些高速碰撞,连续碰撞检测必须处于活动状态并且必须使用力来完成移动。 Unity Documentation & High Speed Collision Video

力的问题是我不知道如何移动连接的对象,就像在以前的脚本中使用翻译所做的那样。

// This barely moves the object connected to the platform
connectedTo.GetComponent<Rigidbody>().AddForce(amountChanged, ForceMode.Impulse); 

使用固定关节将不允许连接的对象独立移动。


TL;DR:

如何创建一个移动平台,让上面的东西可以随之移动,同时还能独立移动并检测高速碰撞?

public class movement : MonoBehaviour
{
    private Rigidbody rb;
    
    void Start()
    {
        rb = gameObject.GetComponent<Rigidbody>();
    }
    
    void Update()
    {
        rb.velocity = new Vector3(-25,0,0);
    }
    
    private void OnTriggerStay(Collider other)
    {
        other.GetComponent<Rigidbody>().velocity = rb.velocity;
    } 
}

此代码在 Platform.Platform 上并且有额外的 Collider,它是一个 Trigger。 当玩家在触发区域内时,他的速度会被直接修改,并且他可以在仍然是动态刚体的情况下改变速度。 平台对旋转和垂直轴也有限制。

翻译允许像您观察的那样“传送”穿过墙壁。如果你的速度足够快,或者FPS足够低,它就会穿墙。

选项:

  1. 使用 Raycast 保护翻译。从旧位置到新位置。
  2. 使用 Spherecast or Boxcast
  3. 保护翻译
  4. 将平台速度 + 玩家输入(这样你仍然可以走路)应用到玩家。

同时检查碰撞检测设置:

但请注意,使用鼠标移动场景中的物体不会设置刚体的速度。所以要测试它是否没有穿过墙壁,你需要ping-pong你的平台使用物理学。