【问题标题】:Unity - how to use Vector2.Reflect()Unity - 如何使用 Vector2.Reflect()
【发布时间】:2017-04-29 00:20:30
【问题描述】:

我到处查看,包括 Unity 文档,但似乎找不到任何关于如何使用 Unity 的 Vector2.Reflect() 函数的好例子。我试图用它来控制球撞墙时的方向(在 2D Breakout 游戏中)。它需要 2 个参数(inDirection,inNormal),但我似乎无法弄清楚如何使用它。任何帮助将不胜感激。

【问题讨论】:

  • 正如参数所说,一个是球的方向,一个是墙的法线。
  • 你为什么在二维问题中标记unity3d
  • Unity3D 是我用来创建 2D 游戏的应用程序的名称。
  • 如果对 Sami 的评论有任何混淆,墙壁的法线是垂直于墙壁表面的向量。
  • 谁能给我一个参数的例子吗?

标签: c# unity3d vector pong breakout


【解决方案1】:

Vector2 Reflect(Vector2 inDirection, Vector2 inNormal):

inDirection: 黑色箭头

inNormal:红色箭头

return output:绿色箭头

【讨论】:

  • 这不是更多的反弹(由法线定义的隐形墙)而不是反射(围绕规范向量)吗?真正的矢量反射就像在图像中一样,但黑色箭头反转了
  • @Spider 在图中,您希望从蓝色垂直线反射矢量,就好像蓝色线是一面镜子一样。图表是正确的。
  • @shieldgenerator7,当我将法线视为实际的镜子时,我看到总是有这种观点的思想转变
【解决方案2】:

inDirection 应该是球的速度,inNormal 应该是垂直于墙壁的单位矢量。

试着把它放在你的球对象中:

void OnCollisionEnter(Collision collision)
{
    Vector2D inDirection = GetComponent<RigidBody2D>().velocity;
    Vector2D inNormal = collision.contacts[0].normal;
    Vector2D newVelocity = Vector2D.Reflect(inDirection, inNormal);
}

注意:我目前无法测试该代码,因此可能需要根据事物名称进行调整。

【讨论】:

  • 看起来 inNormal 必须真的是一个单位向量,否则你的结果会被搞砸,因为 Unity 会应用原始公式而不对其性能进行标准化。
  • @hsandt 这也是我想知道的。到目前为止,我的测试表明 ContactPoint2D.normal 始终是单位向量
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多