我想用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;
}
}
}
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
功能,以便汽车可以顺畅地旋转/左右转动。
那么,如何修复呢?
答案 0 :(得分:2)
目前您的问题是,除非加速度计正好为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;
}
}
}