在乒乓球比赛中击球后改变球的方向(如在dx球中)

时间:2016-03-05 16:01:11

标签: unity3d velocity quaternions unity5

我正在努力解决如何根据击球在桨上的位置来改变弹跳的方法。通常在乒乓球比赛中,角度会发生变化,具体取决于球弹跳中心的距离以及弹跳中心的方向。 我设法做了类似的事情:

//rb = rigidbody, velOnPaddleHit = predefined float
float dist = transform.position.x - paddle.position.x;
dist = transform.position.x > paddle.position.x ? dist : -dist;
dist /= paddle.localScale.x/2;
dist *= velOnPaddleHit;
rb.addForce(dist, 0,0);

但它不起作用/它很奇怪。 任何人都可以帮助我吗?

修改:以下是显示此类行为的视频。当球撞到桨的左侧时,它会向左移动,速度并不重要

https://www.youtube.com/watch?v=fHX_2DLDp1w

1 个答案:

答案 0 :(得分:0)

你不会根据它击中桨的位置来改变它。要改变球的方向,你所要做的就是翻转相反方向的数字。因此,将x和y轴的rigidBody值乘以-1并将其应用于球应该就是这样。

如果球与桨碰撞,将球的刚体在所有轴上的速度乘以-1,除了z轴或x轴(取决于你如何设置场景。它可以是 z x 轴,但 y轴 必须在其他方向上乘以-1才能转向另一个方向。

你可能有一个speedVariable,每当它击中球拍时都会提高球的速度。

void OnCollisionEnter(Collision collision)
{

    if (collision.gameObject.name == "ball")
    {
        Vector3 tempVect = new Vector3(collision.rigidbody.velocity.x * -1, collision.rigidbody.velocity.y * -1, collision.rigidbody.velocity.z);
        collision.rigidbody.velocity = tempVect;
    }
}

为了检测球击中的位置,我所知道的最简单方式是使用小型对撞机。

  1. 创建至少24个盒子对撞机。将它们从 detector1 命名为 detector24 detector1 detector2 detector3 detector4 detector5 ..... )

    标记 isTrigger 的24个对手 true ,以便它们不会与球发生碰撞。

  2. 创建名为“ detectorLayer ”的图层,并确保这24个框对撞机位于“detectorLayer”图层中。

  3. 创建另一个名为“ ballLayer ”的图层,并使确定表示球的图层 设置为“ballLayer”。

  4. 对手附加到您的名为的桨上将您的paddle的GameObject名称改为为“ Paddle ”。 创建一个名为“ PaddleLayer ”的新图层,并确保“ Paddle ”GameObject位于图层名为“ PaddleLayer ”。

  5. 位置那些24个对手从 顺序靠近球拍,但是确定它们 触摸桨或桨的对撞机。下面的图片可以帮助您了解我正在采取的措施。

  6. enter image description here

    编写代码应该是件小事。

    bool firstColision = false;
    
    1. 检查球碰撞划水OnCollisionEnter。  firstColision = true;

    2. 立即 检查球与OnTriggerEnter功能接触的24- 对手中的哪一个。 在OnTriggerEnter函数内部,确保{strong>检查之前firstColision 为真 <{1}}正在接触球< / strong>即可。

      名为“探测器1”的第一个箱式对撞机位于最左侧,而名为“探测器24”的最后一个箱式对撞机位于填充器的最右侧。您可以使用if if语句或switch语句来检测触发球碰撞的哪个框。 24/2 = 12所以名为“ detector24 ”的盒式对撞机应位于中间,应该被视为中间

    3. 行动)在检测到球从24 box colliders击中的箱号后,现在您可以随心所欲。例如,让球变为。你可能有常数指示 移动每个方框对手 检测到的 / strong>即可。随你(由你决定。你现在就从这里制定自己的规则。

    4. OnTriggerEnter设置为firstColision重置

      注意:它不一定是 24个盒子对撞机。它可以 15 ,但你拥有的越多越好。

    5. 如果一切按预期工作,您可以做最后一部分,即进入编辑 - &gt; 项目设置 - &gt; 物理并确保以下情况属实:

      一个。 detectorLayer 无法与 detectorLayer 发生冲突。

      B中。 PaddleLayer 无法与 detectorLayer 发生冲突。

      这将提高移动设备的性能。