C# Unity3D Scale 使用带夹具的加速度计

C# Unity3D Scale using Accelerometer with Clamp

我正在尝试将 phone 的 roll(y) 转换为对象的比例,但有大小限制。

我已经成功缩放到无穷大 +- 使用以下代码:

void Update () {
   float accelY = Input.acceleration.y;
   transform.localScale += new Vector3(0, accelY, 0);
}

我遇到的问题是秤的最大和最小限制。

我尝试按以下方式使用 Clamp,但最终只限制了缩放方向,其中 -y(向自己滚动)等于 0,因此不会发生收缩,而 +y(向外滚动)无限放大假设最大速率为 0.045f。

transform.localScale += new Vector3(0, Mathf.Clamp(accelY, 0f, 0.045f), 0);

在理想情况下,我希望最小比例为 y = 1,最大比例为 y = 100,当您来回滚动 phone 时,它会在两种尺寸之间进行补间。

我可以找到用于平移和旋转的代码片段,但找不到用于缩放的代码片段。请帮忙。

void Update () {
   float accelY = Input.acceleration.y;
   transform.localScale = new Vector3(0, Mathf.Clamp(transform.localScale.y + accelY, 1f, 
   100f), 0)
}

您应该添加 Time.deltaTime,因为更新是 frames/sec 相关的:

[SerializeField]
float speed = 10f;
[SerializeField]
float minSize = 1f;
[SerializeField]
float maxSize = 100f;

void Update () {
   float accelY = Input.acceleration.y * Time.deltaTime * speed;
   transform.localScale = new Vector3(0, Mathf.Clamp(transform.localScale.y + accelY, minSize , 
   maxSize ), 0)
}

我相信您想将值从一个范围(加速度计)缩放到另一个 0 - 100。如果是这种情况,那么最好不要使用 clamp 函数来完成。您可以使用 map 函数来完成:

float mapValue(float mainValue, float inValueMin, float inValueMax, float outValueMin, float outValueMax)
{
    return (mainValue - inValueMin) * (outValueMax - outValueMin) / (inValueMax - inValueMin) + outValueMin;
}

传递加速度计值(Input.acceleration.y)作为主要值。 inValueMin 值应该是您喜欢的最小加速度计值。 inValueMax 值应该是您喜欢的最大加速度计值。这完全由您决定。

outValueMinoutValueMax 值是输出的范围。在你的例子中,那是 0100.

像下面这样的东西应该让你开始:

//Scale Min and max
public float scaleMin = 0;
public float scaleMax = 100f;

//Accelerometer min/max. Find this with Debug.Log(Input.acceleration.y);
public float accelYMin = -10;
public float accelYMax = 10;

void Update()
{
    float accelY = Input.acceleration.y;
    float scaledVal = mapValue(accelY, accelYMin, accelYMax, scaleMin, scaleMax);
    transform.localScale = new Vector3(0, scaledVal, 0);
}

float mapValue(float mainValue, float inValueMin, float inValueMax, float outValueMin, float outValueMax)
{
    return (mainValue - inValueMin) * (outValueMax - outValueMin) / (inValueMax - inValueMin) + outValueMin;
}