Unity:使用Accelerometer在Android中构建赛车游戏

时间:2015-08-02 15:11:58

标签: unity3d 2d accelerometer racing

我想用Unity加速度计开发二维赛车游戏。传感器将使汽车像这个图一样向左或向右旋转。 enter image description here

当我将智能手机向右翻转时,汽车将向右转,当我向左转动时,汽车将向左转。当翻盖智能手机时,我使用加速计传感器来转动汽车。

我的代码:

    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;
                }
            }
}

Class 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 :(得分:2)

目前您的问题是,除非加速度计正好为0,否则您将每帧向右或向左转10度。每帧加上或减去10度也是你转得太快的原因。

一种方法是设置一个不转动的阈值。这可以通过更改您比较Input.acceleration.x的值来实现。我还改变了每帧旋转的角度以使用Time.deltaTime

  

完成最后一帧所花费的时间(以只读为单位)。使用此功能可以使您的游戏帧速率独立。

这意味着所有车辆都应在所有设备上以相同的速度转动。

下面我对您的更新功能进行了一些更新。您需要使用SPEEDTHRESHOLD变量来改变感觉。

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;
        }
    }
}