1

Input.acceleration を使用して床を回転させようとしています。プレイヤーが立っているポイントを中心に床を回転させ、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);
        }

    }
}

これは機能していますが、このアプローチは正確ではなく、これを行うより安価な方法があると思います. より良い方法はありますか?

4

1 に答える 1

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

それが役立つことを願っています!

于 2014-04-22T12:35:06.987 に答える