【问题标题】:Unity Change Ball Direction after hitting paddle in a Pong game (like in dx-ball)Unity 在乒乓球比赛中击球后改变球的方向(如在 dx-ball 中)
【发布时间】:2016-03-06 01:54:17
【问题描述】:

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

//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

【问题讨论】:

  • AddForce() 以向量为参数,为什么 addForce() 是浮点型参数?
  • 哎呀,对不起,我在代码中有一个 vector3,它应该是 rb.addForce(dist, 0,0);

标签: unity3d velocity quaternions unity5


【解决方案1】:

你不会根据它击中桨的位置来改变它。要改变球的方向,你所要做的就是向相反的方向翻转数字。因此,将 x 和 y 轴的刚体值乘以 -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 命名为 detector24detector1detector2detector3detector4detector5..... )

    Mark isTrigger 的 24 个盒子碰撞器true,这样它们就不会与球碰撞。

  2. 创建一个名为“detectorLayer”的,并确保这 24 个盒子碰撞器位于“detectorLayer”层中。

  3. 创建另一个名为“ballLayer”的并确保确保球的 layer设置为“ballLayer”。

  4. 附加 对撞机 到您调用的桨。 更改您的桨的 GameObject 名称为“Paddle”。 创建一个名为“PaddleLayer”的新,并确保“Paddle”游戏对象在中层称为“PaddleLayer”。

  5. 定位这 24 个对撞机从 leftright顺序 靠近桨叶但使确保他们 触摸桨或桨的对撞机。下面的图片应该可以帮助您了解我的意思。

编写代码应该是小菜一碟。

bool firstColision = false;
  1. 检查球是否 碰撞PaddleOnCollisionEnter。 第一碰撞=真;

  2. 立即 检查使用OnTriggerEnter函数,球正在接触24个-对撞机中的哪一个。 在OnTriggerEnter 函数中,确保firstColisiontrue,然后检查 哪个24 box colliders 正在触摸

    第一个名为“detector1”的盒子碰撞器位于最左侧,而最后一个名为“detector24”的盒子碰撞器位于填充器的最右侧。您可以使用 if if 语句或 switch 语句来检测球触发了哪个盒子碰撞器。 24/2 = 12 所以名为“detector24”的box collider应该位于middle并且应该被认为是middle强>的桨。

  3. (ACTION) 在使用OnTriggerEnter 检测到球从哪个号码击中后,现在你可以做任何你想做的事情了。例如,让球向向左向右移动。您可能有常量值,规定对于每个碰撞器 检测到的盒子移动移动多远。这取决于你。你现在从这里制定自己的规则。

  4. 设置 firstColisionfalse重置它。

    注意:它不必是 24 盒碰撞器。它可以是 15,但你拥有的越多越好。

如果一切正常,您可以执行最后一部分,即转到 Edit->Project Settings->Physics 和确保以下内容为真:

A. detectorLayer 不能与 detectorLayer 发生冲突。

B. PaddleLayer 不能与 detectorLayer 发生碰撞。

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

【讨论】:

  • 不,这不是我问的。我知道如何反弹球,但我想根据球击中桨的位置来改变方向。在 Youtube 上输入 dx-ball 你会看到
  • 我刚刚看了视频,现在我明白了。以前没见过这种类型的游戏。我会更新我的答案,但这可能需要很长时间。
  • 好的,谢谢伙计。我喜欢那个游戏,因为简单的弹跳球游戏很无聊——你实际上无法控制球,只能控制桨。
  • 已编辑。它很长,但有任何问题请报告。
  • 恐怕这不是我现在所苦苦挣扎的。定位球位置的更好方法是像我一样计算从球棒中心到球的距离(float dist = transform.position.x - paddle.position.x;)。困难的部分实际上是在你帖子的第 3 点(使用 (ACTION)),因为很难计算速度变化,因为我只想改变方向而不是幅度球的速度。所以这是一个涉及勾股定理的计算......(这就是计算量级的方式)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-01-25
  • 1970-01-01
  • 2021-03-07
  • 2020-11-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多