Unity: Использование акселерометра смартфона

Урок на английском:

1. Добавим на сцену куб:
GameObject3D ObjectCube
2. Выделим его и изменим его размеры (Scale):
X = 10
Z = 10

3. Поместим на него сферу:
GameObject3D ObjectSphere
4. По дефолту радиус сферы равен 1, поэтому поднимем её немного, чтобы она была НА нашем кубе:
SphereTransformPositionY = 1
5. В качестве компонента добавим к сфере Rigidbody:
SphereAdd ComponentPhysicsRigidbody
6. Добавим к сфере скрипт Accelerometer.cs:
SphereAdd ComponentNew ScriptAccelerometer
7. Откроем его на редактирование в Visual Studio Community.

Для движения шарика (RigidBody rb) будем использовать «силу» акселерометра таким образом:

rb.AddForce(Input.acceleration);
Но, т.к. телефон будет расположен горизонтально, а не вертикально, оси координат будут развёрнуты не как на сцене.
В Unity ось Y смотрит вверх, а X и Z в в сторону и вперёд. Но на смартфоне, если его держать горизонтально, оси развернутся.

 

Чтобы это исправить, нужно их повернуть:

tilt = Input.acceleration;
tilt = Quaternion.Euler(90, 0, 0) * tilt;

Полный код для скрипта ниже (я немного его изменил, добавил возможность вернуть шарик на место при вертикальном положении смартфона, и перенес почти всё из Update в FixedUpdate, т.к. мы работаем с RigidBody):

Accelerometer.cs
using UnityEngine;

public class Accelerometer : MonoBehaviour
{
  private Vector3 initialPosition;
  private Quaternion initialRotation;

  private Rigidbody rb;
  private Vector3 tilt;

  // Start is called before the first frame update
  void Start()
  {
    rb = GetComponent<Rigidbody>();
    initialPosition = transform.position;
    initialRotation = transform.rotation;
  }

  // Update is called once per frame
  void Update()
  {
    Debug.DrawRay(transform.position + Vector3.up, tilt, Color.cyan);
  }

  private void FixedUpdate()
  {
    tilt = Input.acceleration;

    // Correct rotating value (Rotate 90 degree in X-axis)
    tilt = Quaternion.Euler(90, 0, 0) * tilt;
    if (Input.touchCount > 0) // Reset position (and rotation) by tap
    {
      transform.rotation = initialRotation;
      transform.position = initialPosition;
      rb.velocity = Vector3.zero; // reset rigidbody speed
    }

    // We will use it to move our RigidBody with rb force
    rb.AddForce(tilt);
  }
}


Подписаться
Уведомление о
guest
0 Комментарий
Inline Feedbacks
View all comments