Unity Realistic элементы управления акселерометром - PullRequest
2 голосов
/ 20 августа 2011
Vector3 acc = Vector3.Zero;
void update(){
    acc = Vector3.Lerp(acc, Input.acceleration, Time.deltaTime);
    transform.position = new Vector3(transform.position.x, (acc * -aVerticalRotation).x, transform.position.z);
}

У меня есть вышеуказанный код для перемещения моего GameObject по вертикали (вдоль оси Y). Это прекрасно работает, за исключением того, что я хочу, чтобы объект двигался относительно моего движения, т.е.

Если я наклоню телефон на некоторое количество X очень быстро, он переместится на расстояние Z, тогда как если я наклоню телефон на величину X, но медленнее, расстояние будет A, где Z> A.

Я пытался получить текущее значение, вычитая его из предыдущего значения и умножая его на остальное, но, кроме того, что он вызывал эффект дрожания, он работал не совсем так, как я хотел.

Может ли кто-нибудь помочь мне достичь этого? Я совершенно новичок в Unity.

Спасибо

Ответы [ 3 ]

1 голос
/ 19 февраля 2013

Ваш код lerp неверен.

Lerp возвращает вектор3, основываясь на начальном и конечном векторах3 с течением времени.Input.acceleration - это тип данных Vector3, да, но это не мировая позиция.Это текущие значения акселерометра.

Вам необходимо использовать значения Input.acceleration, чтобы создать конечную мировую позицию из вашего текущего transform.position (при условии, что этот компонент присоединен к объекту, которым вы хотите управлять всцена).Затем, как только у вас будет эта конечная точка, установите transform.position равным результату Lerp.

На основе оси вашей игры, ориентации устройства и т. Д. ... значения ускорения могут не отображаться с X на X, Y на Y,От Z до Z. Вам нужно немного поиграть с ним, чтобы правильно рассчитать конечную точку.

Например, я использую физику твердого тела, но мой акселерометр Y контролирует мой перевод X:

rigidbody.AddRelativeForce(
                Input.acceleration.y * StrafingSpeed,
                0.0f,
                0.0f,
                ForceMode.VelocityChange
            );
0 голосов
/ 28 мая 2015

Используя код ниже, чтобы сделать это.Прекрасно имитируют акселерометры.

rotFix = new Quaternion(Input.gyro.attitude.x, Input.gyro.attitude.y, -Input.gyro.attitude.z, -Input.gyro.attitude.w);
transform.localRotation = rotFix;
0 голосов
/ 07 августа 2013

Я бы посоветовал вам взглянуть здесь , это поможет вам выяснить, как заставить акселерометр выдавать числовой вход, который можно использовать для управления скоростью.Надеюсь, это поможет.

...