将值映射到方向

问题描述 投票:0回答:1

多年来一直试图解决这个问题。 试图找到一种方法,让我的操纵杆在向任何方向移动时都代表图像上在该方向上显示的数字。 我本质上希望我的玩家移动速度是棍子方向上的值。

What I am aiming for

我只是想要一些正确方向的指导。

c# unity-game-engine math mapping joystick
1个回答
0
投票

如果我正确理解你输入的是什么

  • “向前/向上”(Y) 方向的值 3(下面将其称为
    maxValue
  • “向后/向下”(-Y) 方向的值 1(下面将其称为
    minValue
  • XY 中的 2D 矢量用户输入

所以你可以使用的是输入和Vector2.Dot

(=完全Y方向)
之间的
Vector2.up
乘积

var input = new Vector2(userInputX, userInputY).normalized;
var dot = Vector2.Dot(input, Vector2.up);

这将是

  • 1 如果输入与向上向量完全对齐
  • -1 如果输入与向上向量完全相反 => 与向下完全对齐
  • 0 如果正好 90° 到与左或右对齐
  • 以及根据对齐程度介于两者之间的任何值

您可以进一步将这些信息用作

Mathf.Lerp
中的一个因子,它可以在给定因子的两个值之间进行插值

  • 0 完全取第一个值
  • 1 完全取第二个值
  • 第一个值和第二个值之间的任何线性插值

您只需将

-1
1
内的点的给定范围映射到
0
1
之间的插值因子范围,例如

// Remap the range -1 to 1 into the factor 0 to 1
var factor = (dot + 1f) / 2f;
var result = Mathf.Lerp(minValue, maxValue, factor);

如果左/右值也是给定值 - 假设这是因为图形中的值不匹配,因为 3 和 1.5 的左/右值实际上是 2.25 - 您基本上可以使用相同的

dot
从上面计算,然后检查一下

float result;
if(dot >= 0) // dot is directly a factor 0 to 1
{
    result = Mathf.Lerp(middleValue, maxValue, dot);
}
else // dot is directly a negative factor -1 to 0
{
    result = Mathf.Lerp(middleValue, minValue, -dot);
}
© www.soinside.com 2019 - 2024. All rights reserved.