为什么我的角色穿过对象,即使我已经为它们配置了盒子碰撞器和刚体?

时间:2016-11-29 08:44:30

标签: unity3d

检查检查:Blocking wall

检查检查:character

它仍然穿过阻挡墙。

在剧本中:

if (Input.GetKey(KeyCode.UpArrow))
{
    transform.Translate(Vector3.forward * 15 * Time.deltaTime);
}
if (Input.GetKey(KeyCode.DownArrow))
{
    transform.Translate(-Vector3.forward * 15 * Time.deltaTime);
}

4 个答案:

答案 0 :(得分:1)

使用rigidbody.AddForce函数移动播放器/对象。 翻译变换更像是传送而不是移动。所以你的物体通过transform.Translate传送到墙的另一边。 检查此链接是否为rigidbody.AddForce移动方法:Unity - Moving the player

更新1
您还应该将碰撞检测设置为连续而不是离散。

答案 1 :(得分:1)

您的组件设置正确:角色中的一个刚体和角色和墙壁中的碰撞器。

正如格雷格所说:如果你想以更逼真的方式移动你的角色(基于统一物理学),你可能想要改变你的代码而不是使用AddForce。但是,它不是强制性的。如果你正在做类似太空入侵者游戏的事情,那么按照你正在做的方式移动角色就可以了。

应该考虑的另一件事是墙碰撞器太薄的可能性。如果是这种情况,团结就无法正确检测到碰撞。

答案 2 :(得分:1)

如果您的对象快速移动,您可能需要在检查器中更改Collision Detection: Descrete to a Continuous。此外,您可能希望修改刚体移动速度。

另外。确保您没有使用3d对象和2d对象。他们不匹配。 2D对象不会与3D对象发生碰撞。

RigidBody rb;

void Start() {
    rb = GetComponent<RigidBody>();
}


void Update() {
    if (Input.GetKey(KeyCode.UpArrow))
    {
         rb.velocity = Vector3.forward * 15 * Time.deltaTime;
    }
    if (Input.GetKey(KeyCode.DownArrow))
    {
        rb.velocity = -Vector3.forward * 15 * Time.deltaTime;
    }
}

免责声明:可能需要稍微调整一下数值!

答案 3 :(得分:0)

首先。你的墙上确实需要刚体部件。碰撞器本身会引起碰撞。

要使Unity物理系统正常工作,您不应直接修改变换位置,而应使用力来移动角色。

试试这个:

void FixedUpdate() {

Rigidbody rb = this.GetComponent<Rigidbody>();

    if (Input.GetKey(KeyCode.UpArrow))
    {
       rb.AddForce(Vector3.forward * 15f);
    }
    if (Input.GetKey(KeyCode.DownArrow))
    {
       rb.AddForce(-Vector3.forward * 15f);
    }

}