检查我是否可以将带有网格碰撞体的游戏对象移动到某个地方

本文关键字:移动 对象 游戏 碰撞 是否 网格 检查 | 更新日期: 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();
        }
    }

有两件事很糟糕:

  1. 无论物体旋转如何,运动都会发生,而不是向前移动
  2. 对象
  3. 将穿过任何其他对象到达目标

第二个问题是我在这里想要的。假设我在移动之前记住了原来的位置:

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 个连接了刚体的碰撞体将导致碰撞。
  • 碰撞体+刚体和触发器将导致触发器。
  • 扳机
  • +刚体和对撞体也会导致扳机。
  • 扳机
  • +刚体,第二个扳机将再次产生扳机。
  • 刚体是利用重力还是运动学并不重要,但在所有这些情况下,只有当对象具有刚体在移动