Unity Rotate Foor, используя Input.acceleration

Я пытаюсь повернуть пол, используя Input.acceleration. Я хочу вращать пол вокруг точки, где стоит игрок, и ограничивать мои вращения под определенными углами, а также останавливаться на 0, если Input.acceleration близко к нулю. учитывая, что я новичок в программировании игр, я придумал этот код:

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

    }
}

Это работает, но этот подход не точен, и я думаю, что есть более дешевые способы сделать это. Так есть ли лучший способ?


person user3548661    schedule 18.04.2014    source источник
comment
Вам действительно нужно вращать пол, не было бы проще вращать сам игрок?   -  person kreys    schedule 18.04.2014
comment
Нет, потому что я хочу, чтобы физические объекты взаимодействовали с полом в зависимости от его вращения.   -  person user3548661    schedule 18.04.2014
comment
Почему minRotationAngle больше 0? Не лучше ли было бы, чтобы значения minRotationAngle и maxRotationAngle находились в диапазоне от -180 до 180 градусов? Так в данном случае -170 и 170 соответственно?   -  person Nick Udell    schedule 22.04.2014


Ответы (1)


Я придумал это, и я думаю, что оно выполняет то, что вы хотели, хотя, возможно, я неправильно понял ваш код. Я удалил ваше магическое число, изменил углы для отображения между -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);
    }
}

Надеюсь, это поможет!

person Nick Udell    schedule 22.04.2014
comment
Да, это помогло. Благодарю вас. - person user3548661; 14.05.2014
comment
Я рад, что это помогло! Пожалуйста, отметьте этот ответ как правильный, поставив галочку под кнопками голосования. Спасибо. - person Nick Udell; 14.05.2014
comment
Я не могу. Извините, у меня недостаточно репутации. - person user3548661; 14.05.2014
comment
Привет, на самом деле вам вообще не нужна репутация, чтобы отметить ответ! Дополнительную информацию смотрите здесь: stackoverflow.com/help/someone-answers Рад, что помог :) - person Nick Udell; 15.05.2014