如何在Unity3D中平滑基于加速度计的角色运动?

时间:2014-07-31 17:57:18

标签: c# mobile unity3d accelerometer

我正在为移动平台构建一个无限的垂直平台,我正在使用加速计左右移动播放器。设备越倾斜,玩家在屏幕上移动的速度越快。目前我的播放器有点过于震动,我想在整个屏幕上创建一个更流畅的动作。这是我移动角色的代码:

  /********************************* Variables  **************************************/

        // Variables
        float jumpForce = 700f;
        float maxSpeed;
        float acceleration;

  /********************************* Start Method ************************************/

        void Start ()
            {
            acceleration = Mathf.Abs (Input.acceleration.y);
            }

  /************************************ Fixed Update  *************************************/

        void FixedUpdate () {

                if (acceleration < 0.2f) {
                    maxSpeed = 17;
                } else if (acceleration < 0.9f) {
                    maxSpeed = 25;
                } else {
                    maxSpeed = 40;
                }

            float move = Input.acceleration.x;
                rigidbody2D.velocity = new Vector2 (move * maxSpeed, rigidbody2D.velocity.y);

    /******************************* Collision Function ******************************/

        void OnCollisionEnter2D(Collision2D coll)
            {
                foreach(ContactPoint2D contact in coll.contacts)
                {   
                     rigidbody2D.AddForce (new Vector2(0, jumpForce));
                }
            }

2 个答案:

答案 0 :(得分:0)

你不能只用你的Input.acceleration.y作为速度吗?那样你就不需要if条件了。如果这还不够,那么乘以乘数。

void Update () {
    maxSpeed = Mathf.Abs(Input.acceleration.y);
    speedMultiplier = 30;

    float move = Input.acceleration.x;
    rigidbody2D.velocity = new Vector2 (move * maxSpeed * speedMultiplier, rigidbody2D.velocity.y);

您可以随后调整speedMultiplier以符合您的需求 此外,如果您有一些物理作品(在本例中为rigidbody2D.velocity),则应使用Update()代替FixedUpdate()

答案 1 :(得分:0)

您可以使用Mathf.Lerp方法平滑速度值。

尝试使用

maxSpeed = Mathf.Lerp(maxSpeed, 17, Time.deltaTime);

而不是

maxSpeed = 17;