如何在Unity中通过加速度计左右移动和上下移动?

问题描述 投票:0回答:1
using UnityEngine;
using System.Collections;
 
public class PlayerScript : MonoBehaviour {
     
    public static float distanceTraveled;
    private Touch curTouch;
    public float speed;
    public float maxSpeed;
    public float maxSpeedConstant;
    
    //Virtual buttons left and right half of the screen
    private Rect leftHalf = new Rect(0F,F,Screen.width/2,Screen.height);
    private Rect rightHalf = new Rect(Scren.width/2,0F,Screen.width/2,Screen.height);
    
    public void Update() {        
        distanceTraveled = transform.localPosition.x;
    }

    public void FixedUpdate() {
        Movement();
    }

    public void Movement() { 
        //Accelerometer Control up/down
        Vector3 dirAcc = Vector3.zero;
         
        dirAcc.y = Input.acceleration.y*.5F;
         
        transform.Translate(0F,0F,dirAcc.y);
         
        if (Input.touchCount != 0){
            Vector2 curTouch = Input.GetTouch(0).position;

            if (leftHalf.Contains (curTouch)) {
                 transform.Translate(-Vector3.right * speed * Time.deltaTime);
            } else {
                if (rightHalf.Contains(curTouch)) {
                    transform.Translate(Vector3.right*speed*Time.deltaTime);
                }
            }
        } else {
            if (Input.touchCount == 0) {
                transform.Translate(Vector3.right*speed*Time.deltaTime);                     
            }            
        }        
    }
}

我想要实现的是游戏能够通过加速度计控制角色的上/下移动,并通过触摸屏幕的右/左侧来控制角色的右/左移动

使用上面的代码,触摸区域并不重要,角色将始终向后移动,并且加速度计输入完全被忽略。让我困扰的是上面的代码(仅加速度计部分)使用

transform.Translate
而不是
rigidbody.AddForce
。但根据我在互联网上读到的内容,如果我想要碰撞,我将需要刚体。

因此,我们非常感谢有关代码结构/语法或解决我的问题的任何帮助或建议。

c# android ios unity-game-engine
1个回答
0
投票

首先查找向上/向下运动,您尝试更改 z 值,这可能是向前运动。另一个问题可能是您对触摸位置的计算。最好将触摸位置转换到相机的视口并检查左侧或右侧位置。一个简单的实现是这样的。将此代码添加到场景中的任何对象。

using UnityEngine;
using System.Collections;

public class PlayerScript: MonoBehaviour {



    public void FixedUpdate ( ) {
        Movement ( );
    }
    public void Movement ( ) {
        //Accelerometer Control up/down
        Vector3 dirAcc = Vector3.zero;
        Vector3 mousePosition = Vector3.zero;


#if UNITY_ANDROID
        dirAcc.y = Input.acceleration.y * .5F;

         if(Input.touchCount > 0) {
            mousePosition = Camera.main.ScreenToViewportPoint ( Input.touches[0].position );
        }
#elif UNITY_EDITOR
        if( Input.GetKey ( KeyCode.W ) ) {
            dirAcc = Vector3.up * Time.deltaTime;
        }
        else if(Input.GetKey(KeyCode.S)) {
            dirAcc = Vector3.down * Time.deltaTime;
        }

        if(Input.GetMouseButton(0)) {
            mousePosition = Camera.main.ScreenToViewportPoint ( Input.mousePosition );
        }
#endif
        if( mousePosition.x > 0 ) {
            if( mousePosition.x > 0.5f ) { // right side of the screen
                dirAcc += Vector3.right * Time.deltaTime;
            }
            else {
                dirAcc += Vector3.left * Time.deltaTime;
            }
        }

        transform.Translate ( dirAcc );
    }
}

我还没有在设备上测试过这个。

© www.soinside.com 2019 - 2024. All rights reserved.