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足够低,它就会穿墙。
选项:
- 使用 Raycast 保护翻译。从旧位置到新位置。
- 使用 Spherecast or Boxcast
保护翻译
- 将平台速度 + 玩家输入(这样你仍然可以走路)应用到玩家。
同时检查碰撞检测设置:
但请注意,使用鼠标移动场景中的物体不会设置刚体的速度。所以要测试它是否没有穿过墙壁,你需要ping-pong你的平台使用物理学。
我正在尝试创建一个移动平台,它可以移动与其连接的物体,但也允许连接的物体检测高速碰撞。
我第一次尝试使用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足够低,它就会穿墙。
选项:
- 使用 Raycast 保护翻译。从旧位置到新位置。
- 使用 Spherecast or Boxcast 保护翻译
- 将平台速度 + 玩家输入(这样你仍然可以走路)应用到玩家。
同时检查碰撞检测设置:
但请注意,使用鼠标移动场景中的物体不会设置刚体的速度。所以要测试它是否没有穿过墙壁,你需要ping-pong你的平台使用物理学。