检查我是否可以在某处移动带有MeshCollider的GameObject

时间:2014-11-14 06:18:43

标签: c# unity3d

我正在使用最简单的方式移动对象,这是我在学习之前要做的事情:在每个Update上,我使用transform.position移动到Vector3 destination Vector3.MoveTowards。确切地说:

    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 个答案:

答案 0 :(得分:1)

1 。不要试图移动 meshcollider 并检查其他对手,因为需要完成大量的工作,这会使你的FPS急剧变慢。对复杂模型使用复合对撞机。此外,将每个对撞机添加到模型的每个部件中,例如使用胶囊对撞机将其安装到手臂对象上
2 。对于使用 OnCollisionEnter 检查对撞机,检查是否可以使用段后面的对象

void OnCollisionEnter(Collision collision) {
              //get back to your last position
        }

3 。请使用路径搜索算法,例如 A * ,或者如果您需要,请使用路径搜索算法。完整的人工智能解决方案,您可以使用 RAIN

4 。如果你的游戏对象没有互相碰撞,应该考虑这些重点

  • 2没有刚体的触发器,什么都不会发生。
  • 同样适用于没有涉及刚体的2名碰撞者。
  • 2个人附有刚体的碰撞器会导致碰撞 碰撞。
  • Collider + Rigidbody和Trigger将导致触发。
  • Trigger + Rigidbody和Collider也会导致触发。
  • 触发器+刚体,第二个触发器将再次触发。
  • 刚体是否使用重力或运动是无关紧要的 在所有这些情况下,只有当对象具有时,效果才会存在 刚体正在移动