Unity使用Input.acceleration旋转Foor

时间:2014-04-18 12:21:15

标签: android rotation unity3d tilt-sensor

我正在尝试使用Input.acceleration旋转地板。我想围绕玩家站立的点旋转地板,并且如果Input.acceleration接近零,则在某些角度限制我的旋转也停在0。考虑到我是游戏编程的新手,我已经提出了这个代码:

using UnityEngine;
using System.Collections;

public class Tilt : MonoBehaviour {

    public float maxRotationAngle = 350;                    // max rotation right
    public float minRotationAngle = 10;                     // max rotation left 
    public float rotationSpeed = 20;                        //rotation speed
    public Transform rotateAround;                          //rotation point
    private bool stopRotation = false;                      //if this is true rotation stops
    private int stopDir;                                    //direction where rotation stops -1 equals left 0 center 1 right

    void Update () {

        int tiltDir = 0;                                    //input tilt direction
        float accel = Input.acceleration.x;                 //input tilt value
        float currentRotation = transform.eulerAngles.z;    //current rotation

        //set rotation direction
        if (accel > 0) {
            tiltDir = 1;
        }else if (accel < 0){
            tiltDir = -1;
        }

        //stop rotation left
        if (!stopRotation && (currentRotation < maxRotationAngle && currentRotation > 270)) {
            stopRotation = true;
            stopDir = -1;
        }
        //stop rotation right
        if (!stopRotation && (currentRotation > minRotationAngle && currentRotation < 270)) {
            stopRotation = true;
            stopDir = 1;
        }
        //allow rotation right
        if (stopRotation && stopDir < 0 && Input.acceleration.x > 0) {
            stopRotation = false;

        }
        //allow rotation left
        if (stopRotation && stopDir > 0 && Input.acceleration.x < 0) {
            stopRotation = false;
        }
        //stop rotation center
        if(!stopRotation  && currentRotation < 0.2 || (currentRotation > 359.8 && currentRotation < 360)){
            if(accel > -0.1 && accel < 0.1){
                stopRotation = true;
                stopDir = 0;
            }
        }
        //allow rotation from center
        if(stopRotation && stopDir == 0 && (accel < -0.1 || accel > 0.1)){
            stopRotation = false;
        }
        //apply rotation
        if(!stopRotation){
            transform.RotateAround(rotateAround.position, new Vector3(0, 0, tiltDir), rotationSpeed * Mathf.Abs(accel) * Time.deltaTime);
        }

    }
}

这是有效的,但这种做法并不准确,我认为有更便宜的方法可以做到这一点。那么有更好的方法吗?

1 个答案:

答案 0 :(得分:0)

我想出了这个,我认为可以实现你想要的,尽管我可能误读了你的代码。我删除了您的幻数,将角度更改为-180和180之间的映射,并将您的变量重命名为全名,以便更好地维护。

public float maxRotationAngle = 170;
public float minRotationAngle = -170;
public float minimumAcceleration = 0.1f;
public float rotationSpeed = 20;
public Transform rotateAroundTransform;

void Update () 
{
    float deltaAcceleration = Mathf.Abs(Input.acceleration.x);
    float currentRotation = transform.eulerAngles.z;

    //stop rotation outside of angle range and motion range
    if (currentRotation > minRotationAngle && 
        currentRotation < maxRotationAngle && 
        deltaAcceleration < minimumAcceleration) 
    {
        //set rotation direction
        int tiltDirection = Input.acceleration.x > 0 ? 1 : -1;
        transform.RotateAround(rotateAroundTransform.position, new Vector3(0, 0, tiltDirection), rotationSpeed * deltaAcceleration * Time.deltaTime);
    }
}

希望有所帮助!