我正在使用最简单的方式移动对象,这是我在学习之前要做的事情:在每个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();
}
}
有两件事情很糟糕:
第二个问题就是我想要的。说我在移动之前会记住原来的位置:
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;
}
以上情况远非理想。我甚至不知道如何实现这样一个简单的解决方案。你知道吗?
答案 0 :(得分:1)
1 。不要试图移动 meshcollider 并检查其他对手,因为需要完成大量的工作,这会使你的FPS急剧变慢。对复杂模型使用复合对撞机。此外,将每个对撞机添加到模型的每个部件中,例如使用胶囊对撞机将其安装到手臂对象上
2 。对于使用 OnCollisionEnter 检查对撞机,检查是否可以使用段后面的对象
void OnCollisionEnter(Collision collision) {
//get back to your last position
}
3 。请使用路径搜索算法,例如 A * ,或者如果您需要,请使用路径搜索算法。完整的人工智能解决方案,您可以使用 RAIN
4 。如果你的游戏对象没有互相碰撞,应该考虑这些重点