C# Unity3D Scale с использованием акселерометра с зажимом
Я пытаюсь перевести рулон (у) телефона в масштаб объекта, но с ограничениями по размеру.
У меня был успех масштабирования до бесконечности +- с помощью следующего кода:
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, и когда вы поворачиваете телефон вперед и назад, он будет колебаться между двумя размерами.
Я могу найти фрагменты кода для Перевести и повернуть, но ничего для масштабирования.. Пожалуйста, помогите.
2 ответа
void Update () {
float accelY = Input.acceleration.y;
transform.localScale = new Vector3(0, Mathf.Clamp(transform.localScale.y + accelY, 1f,
100f), 0)
}
Вы должны добавить Time.deltaTime, потому что обновление зависит от кадров / сек:
[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. Если это так, то это не лучше всего сделать с помощью функции зажима. Вы можете сделать это с помощью функции карты:
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
значение должно соответствовать максимальному значению акселерометра, которое вы предпочитаете. Это полностью зависит от вас, чтобы решить.
outValueMin
а также outValueMax
значения - это диапазон выходных данных. В вашем случае это 0
а также 100
,
Что-то вроде ниже должно начать вас:
//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;
}