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 в первом коде, чтобы машина могла плавно вращаться/поворачиваться вправо-влево.

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


person ariyandi    schedule 02.08.2015    source источник


Ответы (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;
        }
    }
}
person Mike G    schedule 02.08.2015