团结以错误的角度反射球体

时间:2018-05-28 14:01:45

标签: c# unity3d

我一直在使用Unity中的动作,默认情况下似乎做了不自然的事情。我想创建一个围绕桌子以恒定速度移动的球体,并以自然角度反射物体反弹。我对理解几何形状有点挣扎,因为它们似乎反应异常,但是......

我在一面有四面墙和一些圆柱体的平面上创造了一个球体。在我的球体上,我添加了一个脚本:

void Start()
{
    rb = GetComponent<Rigidbody>();
    rb.velocity = (new Vector3(Random.Range(-1.0f, 1.0f), 0.0f, Random.Range(-1.0f, 1.0f)) * 2);
}

我想要做的事情的结果是:球体围绕一个有围墙的游戏区域移动,以自然角度反弹物体。球体应以随机方向开始,速度恒定(从不减速或加速)。

实际发生的是:如果我只使用上面的代码,它似乎以我想要的速度(速度变量设置为2)按需要随机方向启动球体虽然有时速度不是我的想要一些力推进地板或天空(这是一个锁定的轴,我的代码不随机化该轴);球体似乎反弹在它自己身上,似乎反映了大部分时间的预期。有时反射发生在与碰撞面平行的不自然角度。示例:如果球体撞到平坦的墙壁,那么即使碰撞完全垂直,反射的某些(并非总是)也会直接沿着墙壁的下方。当碰撞角度低(<30度)时,这发生得更多。

我试图通过添加一个碰撞事件并控制我自己的反射来解决这个问题,这似乎根本无法解决问题。

我尝试过oncollision活动来尝试和管理反射,但不幸的是我不完全理解这是如何工作的,因为我得到了与没有相同的结果。

void OnCollisionEnter(Collision col)
{
    Vector3 oldVelocity = rb.velocity;
    Vector3 normal = col.contacts[0].normal;

    rb.velocity = Vector3.Reflect(oldVelocity, normal);
}

我已经尝试过其他任何东西,当碰撞与默认情况大不相同时,似乎都没有给出自然的反射型动作。

我已经完成了我的搜索,似乎没有什么能解决这个问题。撞击一个墙壁,在5度,并在距离碰撞5度处反射。

我需要一个关于这个主题的正确教程,或者只是一个如何强制正确反映2个碰撞对象的简单例子......

1 个答案:

答案 0 :(得分:0)

以下是一些要检查的内容,我会发表评论,但我没有足够的声誉。

  1. 如第一条评论中所述,确保拖动和角度拖动设置为零
  2. 确保约束球体的旋转,旋转球的反弹方式与非旋转球不同
  3. 为它添加一个物理材质,这样你就可以将反弹设置为1,这样就不会在反弹时丢失能量
  4. 确保所有碰撞器都在场景中正确定位(您永远不知道)
  5. 如果这些不起作用,我们需要更多信息来了解出了什么问题