使用带夹子的加速度计进行C#Unity3D缩放

时间:2017-07-09 00:58:20

标签: c# unity3d scale accelerometer clamp

我试图将手机的掷骰(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,当你来回滚动手机时,它会在两种尺寸之间进行补间。

我可以找到Translate和旋转的代码片段,但没有任何缩放功能..请帮助。

2 个答案:

答案 0 :(得分:0)

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

您应该添加Time.deltaTime,因为Update依赖于帧/秒:

[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)
}

答案 1 :(得分:0)

我相信你想要将值从一个范围(加速度计)缩放到另一个范围(0到100)。如果是这种情况,那么使用钳位功能最好不要这样做。您可以使用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;
}