Unity: использование акселерометра для создания гоночной игры в Android

Я хочу разработать гоночную игру в 2D с использованием акселерометра с Unity. Датчик заставит автомобиль вращаться влево или вправо, как показано на рисунке.

Когда я переворачиваю смартфон вправо, машина поворачивает направо, а когда я переворачиваю налево, машина поворачивает налево. Я использую датчик акселерометра, чтобы повернуть машину при переворачивании смартфона.

Мой код:

    public class accel : MonoBehaviour 
    {
        public MoveController mc;
        void Update () 
            {
                transform.Translate(0,-Input.acceleration.x, 0);
                if (Input.acceleration.x > 0) {
                    mc.degree -= 10;
                    mc.derajat-=10;
                }
                else if (Input.acceleration.x < -0) {
                    mc.degree += 10;
                    mc.derajat+=10;
                }
                else {
                    mc.degree += 0;
                    mc.derajat+= 0;
                }
            }
}

Класс MoveController:

using UnityEngine;
using System.Collections;

public class MoveController : MonoBehaviour {

    public bool stop = false;
    public enum ButtonList {left,right,forward,stop};
    public float currspeed = 1.0f;
    public float acceleration = 5f;
    public float maxspeed = 12f;
    public float degree = 10f;
    public float derajat = 10f;
    public bool jalan;
    public Camera camera;
    public SpriteRenderer redcar;
    public float sudut;

    public void setActiveStop() {
        stop = true;
    }

    public void setUnactiveStop() {
        stop = false;
    }

    public bool getStop() {
        return stop;
    }

    public bool getNotStop() {
        return !stop;
    }

    void Start () {
        this.setUnactiveStop ();    
        jalan = false;

    }

    // Update is called once per frame
    void Update () {
        this.start_game (); 

    }

    public void start_game() {
        if (getNotStop()) {
            redcar.transform.rotation=Quaternion.Euler(0,0,degree);
            camera.transform.rotation=Quaternion.Euler(0,0,derajat);

            sudut=redcar.transform.rotation.z;
            redcar.transform.Translate((currspeed*Mathf.Cos(sudut*Mathf.PI/180))*1*Time.deltaTime,
                                       (currspeed*Mathf.Sin(sudut*Mathf.PI/180))*1*Time.deltaTime,
                                       0);
            camera.transform.Translate((currspeed*Mathf.Cos(sudut*Mathf.PI/180))*1*Time.deltaTime,
                                       (currspeed*Mathf.Sin(sudut*Mathf.PI/180))*1*Time.deltaTime,
                                       0);

        }
        jalan = true;

    }
}

Когда я строю и работаю в своем смартфоне, машина не останавливается, а вращается слишком быстро. Я хочу изменить Update Функция в первом коде, чтобы машина могла плавно вращаться / поворачивать вправо-влево.

Итак, как это исправить?

1 ответ

В настоящее время ваша проблема заключается в том, что если акселерометр не равен точно 0, вы будете поворачиваться на 10 градусов каждый кадр вправо или влево. Кроме того, сложение или вычитание 10 градусов в каждом кадре является причиной того, что вы поворачиваете слишком быстро.

Одним из подходов было бы иметь порог, куда вы не поворачиваетесь. Это может быть достигнуто путем изменения значения, которое вы сравниваете Input.acceleration.x против. Я также изменил угол, который вы поворачиваете на каждый кадр, чтобы использовать Time.deltaTime,

Время в секундах, которое потребовалось для завершения последнего кадра (только чтение). Используйте эту функцию, чтобы сделать вашу частоту кадров в игре независимой.

Это означает, что все автомобили должны вращаться с одинаковой скоростью на всех устройствах.

Ниже я сделал некоторые обновления для вашей функции обновления. Вам нужно будет поиграть с SPEED а также THRESHOLD переменные, чтобы повернуть чувствовать себя хорошо.

SPEED: как быстро машина поворачивает

THRESHOLD: как далеко устройство должно быть наклонено перед началом поворота

public class accel : MonoBehaviour 
{
    public MoveController mc;
    private float SPEED = 0.5;
    private float THRESHOLD = 0.3;
    void Update () 
    {
        transform.Translate(0,-Input.acceleration.x, 0);
        if (Input.acceleration.x > THRESHOLD) {
            mc.degree -= Time.deltaTime * SPEED;
            mc.derajat-= Time.deltaTime * SPEED;
        }
        else if (Input.acceleration.x < -THRESHOLD) {
            mc.degree += Time.deltaTime * SPEED;
            mc.derajat+= Time.deltaTime * SPEED;
        }
    }
}
Другие вопросы по тегам