检查我是否可以将带有网格碰撞体的游戏对象移动到某个地方
本文关键字:移动 对象 游戏 碰撞 是否 网格 检查 | 更新日期: 2023-09-27 18:30:31
我使用最简单的方式移动对象,这是我在学习更好的之前要做的事情:在每次Update
,我都会使用Vector3.MoveTowards
transform.position
移动到Vector3 destination
。确切地说:
private GameObject actor; //Object to move
private void MakeMove()
{
//Move towards destination
actor.transform.position = Vector3.MoveTowards(actor.transform.position, destination, Time.deltaTime * moveSpeed);
//Update HUD info
actor.updatePosition();
//Terminate running status if the target was reached
if (actor.transform.position == destination && targetObj==null)
{
Stop();
}
}
有两件事很糟糕:
- 无论物体旋转如何,运动都会发生,而不是向前移动 对象
- 将穿过任何其他对象到达目标
第二个问题是我在这里想要的。假设我在移动之前记住了原来的位置:
Vector3 oldPos = actor.transform.position;
actor.transform.position = Vector3.MoveTowards( ... );
//Get true if there an object colliding with the one that was just moved
if(actor.gameObject.collider.something something) {
//revert back to old position
actor.transform.position = oldPos;
}
以上情况远非理想。我什至不知道如何实现如此简单的解决方案。你知道吗?
1.切勿尝试移动网格碰撞体并检查其他碰撞体,因为需要完成大量工作,并且会使您的 FPS 急剧变慢。请改用复杂模型的复合碰撞体。此外,将每个碰撞体添加到模型的每个部分,例如使用用于手臂的胶囊碰撞体并将其附加到您的手臂对象
2.为了检查对撞机,请使用OnCollisionEnter,以检查是否击中了物体,可以使用以下段
void OnCollisionEnter(Collision collision) {
//get back to your last position
}
3.与其四处走动寻找通道,不如使用像 A* 这样的路径查找算法,或者如果您想要为您的 AI 提供完整的解决方案,您可以使用 RAIN
4.如果您的游戏对象没有相互碰撞,请考虑以下要点
- 2 没有刚体的触发器,什么都不会发生。
- 2 个不涉及刚体的对撞机也是如此。
- 2 个连接了刚体的碰撞体将导致碰撞。
- 碰撞体+刚体和触发器将导致触发器。 扳机
- +刚体和对撞体也会导致扳机。 扳机
- +刚体,第二个扳机将再次产生扳机。
- 刚体是利用重力还是运动学并不重要,但在所有这些情况下,只有当对象具有刚体在移动