【问题标题】:unity mobile controls positions统一移动控制位置
【发布时间】:2018-11-19 05:50:14
【问题描述】:

在我的代码中,脚本附加到的对象总是向右移动,这意味着无论我触摸屏幕的哪个位置,总是满足第二个 if。游戏对象从屏幕中间开始。如果我触摸到对象的左侧,它应该向左移动。我错过了什么吗?

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


        if (touch.position.x < transform.position.x)   {
            transform.Translate (-0.05f * speed, 0, 0); 
        } else if (touch.position.x > transform.position.x) {
            transform.Translate (0.05f * speed, 0, 0);
        }


    }

【问题讨论】:

  • iirc,您从Input.GetTouch(0).position 获得的位置是相对于屏幕空间的位置,对象位置是相对于世界空间的位置,您可能需要使用ScreenToWorldPoint() 之类的东西来转换它们

标签: c# unity3d


【解决方案1】:

您可以使用此代码做您想做的事:

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

    var point = Camera.main.ScreenToWorldPoint(new Vector3(touch.position.x, touch.position.y,
        transform.position.z - Camera.main.transform.position.z));

    Debug.DrawLine(Camera.main.transform.position, point, Color.green, 1);


    var delta = transform.position.x - point.x;

    if(Mathf.Abs(delta) < threshold)
    {
        return;
    }


    if (point.x < transform.position.x)
    {
        transform.Translate(-0.05f * speed, 0, 0);
    }
    else if (point.x >= transform.position.x)
    {
        transform.Translate(0.05f * speed, 0, 0);
    }
}

Input.GetTouch() 会给你一个vector2,它xy 是你在手机/平板电脑的二维屏幕上的触摸位置。因此,您应该将屏幕触摸位置转换为世界位置(xyz 在 3D 空间中),然后将该世界位置与您的对象位置进行比较。

你需要使用主摄像头的原因是你的触摸要转换成3D空间,把2D点转换成3D点需要Z参数。您将通过查找 主摄像头 和对象的位置差异来获得此参数。您可以使用Camera.main获取主摄像头。

我还添加了Debug.DrawLine() 向您展示确切的观点。使用UnityRemote 测试并查看Editor中的行。

有一个threshold 属性可以防止游戏对象的滑动。

注意:请记住,这只是一个示例,不适用于其他摄像机角度。

【讨论】:

  • 这就是我要找的!如果你能解释你的观点来自哪里,那就太好了?而且,当我水平移动我的游戏对象时,如果我将手指放在屏幕上,游戏对象将在手指两侧轻弹。我预料到了这一点,但想不出立竿见影的解决方案。
  • 有什么方法可以做到这一点又不失流畅感?
  • 当然,搜索Dotween,它是一个补间引擎来完成这些任务
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多