找到模拟杆中心和当前位置之间的距离

时间:2015-03-19 22:43:41

标签: c# unity3d

我想知道播放器推出Xbox控制器模拟的距离 棒。我不需要知道它被推动的角度,只需要多远。我希望它返回0到1的值。以下是一些示例!

  • 如果玩家完全向下推杆,它将返回1.
  • 如果棒位于中心,它将返回0.
  • 如果他们将棍子推到最大程度但是以45度角仍然会返回1.
  • 如果他们只是将棍子推到一半并且以135度角度将其返回0.5

到目前为止我已尝试过的代码

new Vector2(Input.GetAxisRaw("Horizontal"),Input.GetAxisRaw("Vertical")).magnitude

我尝试了这段代码,尽管没有真正理解它: - /

    float xAxis = (Input.GetAxis ("Player" + padNumber + "Horizontal"));
    float yAxis = (Input.GetAxis ("Player" + padNumber + "Vertical"));

    thumbStickDistance = Mathf.Sqrt(Mathf.Abs((xAxis*xAxis)+(yAxis*yAxis)));

但是 - 根据杆被按下的角度,这两个值都会返回不同的值。

1 个答案:

答案 0 :(得分:0)

你有答案,但你可能认为你不是因为你期望看到不同的价值观。规模是你想要的。

首先,您的thumbStickDistance公式正是Vector2的幅度属性所做的。其次,GetAxis和GetAxisRaw之间的区别在于GetAxis应用了一些平滑。如果使用箭头键,最好看到这种情况。 GetAxis将上升和下降,而GetAxisRaw将立即跳转到-1,0或1。你用于xbox控制器的东西并不重要。

现在,水平轴和垂直轴都在-1; 1范围内。如果xbox控制器操纵杆有一个方形移动区域,那么你可以让两个轴都为1,你可以测量的最大距离是sqrt(2)或大约1.414。如果控制器具有完美的圆形运动区域,则无论您将其推入哪个方向,您可以测量的最大距离都是1.事实证明,尽管xbox控制器更接近圆形而不是方形,但它不是。我能够测量的最大距离约为1.16,这意味着我到达了围绕中心的圆外的一个点。

所以我的建议是使用幅度,如果需要,可以使用Clamp01将值限制为不超过1.另一种方法是校准控制器,这可能很复杂,需要每次切换控制器时都要完成,因为即使两个相同的xbox控制器之间也存在差异。