【问题标题】:How to convert mouse input to mobile touch in unity如何统一将鼠标输入转换为移动触摸
【发布时间】:2018-09-13 01:30:15
【问题描述】:

我是游戏开发的新手。我正在尝试做一些像上升一样的东西。我试图更改流动代码以使其可用于移动触摸屏,但不幸的是失败了。你能帮我如何为移动设备制作流动代码吗?

private Vector2 mousePos;
private Rigidbody2D rb;

private Vector2 offsetClicked;
private Vector2 offsetReleased;

private void Start () {
    rb = GetComponent<Rigidbody2D> ();
    offsetReleased = transform.position;
}

private void FixedUpdate () {
    mousePos = Camera.main.ScreenToWorldPoint (Input.mousePosition);

    if (Input.GetMouseButton (0)) {
        Vector2 newPos = new Vector2 (
            Mathf.Clamp(mousePos.x + offsetClicked.x, GameManager.gm.cameraEdges.w + 0.32f, GameManager.gm.cameraEdges.y - 0.32f),
            mousePos.y + offsetClicked.y
        );

        rb.MovePosition (newPos);
        offsetReleased = newPos - (Vector2) Camera.main.transform.position;
    } //Clicked
    else {
        Vector2 newPos = new Vector2 (
            Mathf.Clamp (Camera.main.transform.position.x + offsetReleased.x, GameManager.gm.cameraEdges.w + 0.32f, GameManager.gm.cameraEdges.y - 0.32f),
            Camera.main.transform.position.y + offsetReleased.y
        );

        rb.MovePosition (newPos);
        offsetClicked = newPos - mousePos;
    } //Released
}

以上代码适用于鼠标。

【问题讨论】:

    标签: c# unity3d


    【解决方案1】:

    CrossPlatformInput 包中的导入到您的项目中,您实际上可以继续使用Input.GetMouseButton(xxx)。

    using UnityEngine;
    using CrossPlatformInput;
    
        public class MyClass : MonoBehaviour {
    
        private Vector2 mousePos;
        private Rigidbody2D rb;
    
        private Vector2 offsetClicked;
        private Vector2 offsetReleased;
    
        private void Start () {
            rb = GetComponent<Rigidbody2D> ();
            offsetReleased = transform.position;
        }
    
        private void FixedUpdate () {
            mousePos = Camera.main.ScreenToWorldPoint (Input.mousePosition);
    
            if (Input.GetMouseButton (0)) {
                Vector2 newPos = new Vector2 (
                    Mathf.Clamp(mousePos.x + offsetClicked.x, GameManager.gm.cameraEdges.w + 0.32f, GameManager.gm.cameraEdges.y - 0.32f),
                    mousePos.y + offsetClicked.y
                );
    
                rb.MovePosition (newPos);
                offsetReleased = newPos - (Vector2) Camera.main.transform.position;
            } //Clicked
            else {
                Vector2 newPos = new Vector2 (
                    Mathf.Clamp (Camera.main.transform.position.x + offsetReleased.x, GameManager.gm.cameraEdges.w + 0.32f, GameManager.gm.cameraEdges.y - 0.32f),
                    Camera.main.transform.position.y + offsetReleased.y
                );
    
                rb.MovePosition (newPos);
                offsetClicked = newPos - mousePos;
            } //Released
        }
    
    }
    

    (见此处:https://docs.unity3d.com/Manual/CrossPlatformConsiderations.html

    触摸和点击

    Input.GetMouseButtonXXX 函数的设计使其具有 移动设备上的合理解释,即使有 不是这样的“鼠标”。屏幕上的单次触摸报告为 左键单击和 Input.mousePosition 属性给出的位置 只要手指在触摸屏幕,就可以触摸。这表示 具有简单鼠标交互的游戏通常可以透明地运行 在桌面和移动平台之间。当然,尽管如此, 转换通常比这简单得多。桌面 游戏可以使用多个鼠标按钮,而手机游戏可以 一次检测屏幕上的多次触摸。

    【讨论】:

    • 它工作不完美。一旦我触摸屏幕播放器位置自动移动右上角。并且不平滑。
    • 可能和你在这里做的事情有关:GameManager.gm.cameraEdges.w + 0.32f
    【解决方案2】:

    不是检查鼠标按钮是否被点击,而是检查是否存在任何触摸,然后提取触摸位置。 Input.touches 返回最后一帧期间的触摸列表,因此您可以使用它来查找将替换代码中 mousePos 的触摸位置。

    Touch myTouch;
    Vector2 myTouchPosition;
    
    Update()
    {
        if (Input.touchCount > 0)
        {
            myTouch = Input.touches[0]; //Get the first touch
            myTouchPosition = Camera.main.ScreenToWorldPoint(myTouch.position);
        }
    }
    

    此外,您可以使用touch phases 来确定您希望在触摸期间的哪个时间点发生某些事情。

    【讨论】:

    • 我试过了,但它不可行。你能试试我的完整代码吗
    • 当然。你能帮我理解什么不起作用吗?它是否已编译但未按预期运行?
    • 它编译但没有按预期运行
    • 我在上面发布的代码只是作为如何获取触摸位置的示例。在您的代码中,您不需要添加更新函数,只需将myTouch = Input.touches[0];mousePos = Camera.main.ScreenToWorldPoint(myTouch.position); 添加到您的固定更新函数中,就在您检查是否存在任何触摸的 if 语句之后。
    猜你喜欢
    • 2021-02-10
    • 2015-08-08
    • 2018-05-20
    • 1970-01-01
    • 1970-01-01
    • 2012-03-02
    • 1970-01-01
    • 2018-01-14
    • 1970-01-01
    相关资源
    最近更新 更多