Unity触摸水平移动

4

我不知道如何开始,我想要在触摸屏幕时将我的角色向左或向右移动。

就像这个游戏:

示例游戏 - Ketchapp的楼梯

我只有一个检测屏幕左侧或右侧空间的脚本。

public float forwardSpeed = 5f;
public float sideSpeed = 5f;

private void Update()
{
    Vector3 deltaPosition = transform.forward * forwardSpeed;
    if (Input.touchCount > 0)
    {
        Vector3 touchPosition = Input.GetTouch(0).position;
        if (touchPosition.x > Screen.width * 0.5f)
            deltaPosition += transform.right * sideSpeed;
        else
            deltaPosition -= transform.right * sideSpeed;
    }
    transform.position += deltaPosition * Time.deltaTime;
}

另一个我尝试的游戏是这个:https://play.google.com/store/apps/details?id=com.bigframes.color_road - HeaDTy
4个回答

1

这个解决方案对我很有效。它用于一个简单的打砖块游戏中,用来左右移动挡板。

void Update () {
    if (Input.touchCount > 0){
        Touch touch = Input.GetTouch(0);

        int direction = (touch.position.x > (Screen.width / 2)) ? 1 : -1;
        MovePaddle(direction);
    }

}

void MovePaddle(int direction){
    float xPos = transform.position.x + (direction * Time.deltaTime * paddleSpeed);
    playerPos = new Vector3 (Mathf.Clamp (xPos, -8f, 8f), -9.5f, 0f);
    transform.position = playerPos;
}

谢谢您的回复,但这正是我已经拥有的东西。这个脚本将屏幕从左右两侧分成了一半,但不像我发布的示例那样。 - HeaDTy

1
我认为你想表达的是只有在按压屏幕时才移动,对吗? 也许这可以帮助你:
public float forwardSpeed = 5f;
public float sideSpeed = 5f;

private void Update()
{
    Vector3 deltaPosition = transform.forward * forwardSpeed;
    if (Input.touchCount > 0)
    {
        Vector3 touchPosition = Input.GetTouch(0).position;
        if (touchPosition.x > Screen.width * 0.5f)
            deltaPosition += transform.right * sideSpeed;
        else
            deltaPosition -= transform.right * sideSpeed;
    }
    else{
            deltaPosition = sideSpeed;
    }
    transform.position += deltaPosition * Time.deltaTime;
}

pd: not tested because yet


我认为这应该是被接受的答案。 - Serkan Tarakcı

0

我有一个解决方案,但并不是非常顺畅

public float speed = 5;
public Rigidbody rb;

public void FixedUpdate()
{
    float h = Input.GetAxis("Horizontal");

    //Add touch support
    if (Input.touchCount > 0 && Input.GetTouch(0).phase == TouchPhase.Moved)
    {
        Touch touch = Input.touches[0];
        h = touch.deltaPosition.x;
    }

    //Move only if we actually pressed something
    if (h > 0 || h < 0)
    {
        Vector3 tempVect = new Vector3(h, 0, 0);
        tempVect = tempVect.normalized * speed * Time.deltaTime;

        //rb.MovePosition(rb.transform.position + tempVect);

        Vector3 newPos = rb.transform.position + tempVect;
        checkBoundary(newPos);
    }
}

void checkBoundary(Vector3 newPos)
{
    //Convert to camera view point
    Vector3 camViewPoint = Camera.main.WorldToViewportPoint(newPos);

    //Apply limit
    camViewPoint.x = Mathf.Clamp(camViewPoint.x, 0.04f, 0.96f);
    camViewPoint.y = Mathf.Clamp(camViewPoint.y, 0.07f, 0.93f);

    //Convert to world point then apply result to the target object
    Vector3 finalPos = Camera.main.ViewportToWorldPoint(camViewPoint);
    rb.MovePosition(finalPos);
}

0
private void Start()
{
    Application.targetFrameRate = 60;
}

void Update()
{
    if (Input.touchCount > 0)
    {
        Touch t = Input.GetTouch(0);

         transform.position = new Vector3(transform.position.x + t.deltaPosition.x * .02f, transform.position.y, transform.position.z );
    }
}

你可以使用这个。很简单 :)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接