【问题标题】:how to code player to move on mobile device touch screen input using ui button如何编码播放器以使用 ui 按钮在移动设备触摸屏输入上移动
【发布时间】:2020-11-22 06:45:49
【问题描述】:

我想知道当我在统一 2D 中单击 UI 按钮时如何让我的玩家移动。我对如何编写 UI 按钮来接收输入并移动播放器直到没有按下 UI 按钮感到更加困惑,但如果有人也可以帮助移动,我仍然会很高兴,但按钮更重要。我正在用 c# 编码

我希望它像这样工作,但显然这只是伪代码:

public void whenClicked();
{
if (leftButton 被点击)
向左移动玩家

如果(点击右键)
向右移动玩家

如果(upButton 被点击)
移动玩家跳跃
}

【问题讨论】:

    标签: unity3d uibutton touch


    【解决方案1】:

    移动角色有两种主要方式:通过 Transform 组件移动(因为您有 2D 游戏,您很可能在角色上使用 RectTransform)和通过 Rigidbody 组件移动。

    变换: 按钮上的脚本应该是这样的:

    public GameObject character; // The link to the character you want to move
    private bool doMove; // whether the character must move or not
    public float speed;
    
    private void OnMouseDown () {
        doMove = true;
    }
    private void Update () {
        if (doMove) {
            character.transform.Translate(Vector3.right * Time.deltaTime * speed);
        }
    }
    

    它向右移动。您还可以使用 Vector3.up、Vector3.left、Vector3.down、Vector3.forward、Vector3.back 尝试变速,你会得到你想要的。

    但是在这里我有一个问题。我刚刚看到,在您的问题中,您写道您使用 UI 按钮。您是指带有 BoxCollider 的图像还是带有 Button 组件的游戏对象。如果是第二个,我建议您从您的 button_objects 中删除组件 Button,因为只需一个带有 OnMouseDown 函数的脚本就足够了。必须将此脚本添加到您的所有按钮(上、右...)。您还应该在代码中添加下一个字符串:

    public Vector3 direction;
    
    // and also edit Update function this way:
        if (doMove) {
            character.transform.Translate(direction * Time.deltaTime * speed);
        }
    

    然后在 Unity 中设置此脚本中的下一个参数:

    对于按钮向上方向 = x=0, y=1, z=0
    对于按钮向下方向 = x=0, y=-1, z=0
    对于按钮右方向 = x=1, y=1, z=0
    对于按钮左方向 = x=-1, y=1, z=0

    因此,每个按钮都会按照自己的方向移动角色;

    刚体呢?如果你使用它,你可以做同样的事情,但将函数transform.Translate替换为GetComponent().AddForce(Vector3.right*speed, ForceMode2D.Impulse); 但我个人认为通过 Transform 移动更容易

    【讨论】:

    • 但是无论如何你都可以使用 Button 组件。但是在这里你最好把所有的按钮都放在一个对象中(例如称为“Game_Buttons”)。将 OnMouseDown 函数更改为其他名称(例如 Move() 或 MoveCharacter()),并使用此函数添加脚本,而不是添加到每个按钮,而仅添加到 Game_Buttons 对象。之后,在 Button 上的 Button 组件中,您应该指定指向此 Game_Buttons 的链接并选择函数 Move_Charcter()。因此,如果您想使用 Button 组件,而不是 BoxCollider2D,请编写。我会更详细地解释它)
    • 我尝试使用 UI 按钮并附加一个带有 MoveRight() 等函数的脚本,它可以移动我的播放器,但是你是如何做到的,以便你可以按住按钮并连续移动玩家?
    • 据我所知,Button 组件不能跟随长按。它只能在单击(鼠标单击或手指触摸)时调用某些函数。因此,如果您想在单击左上角按钮时每帧执行一些功能,您最好将它们全部添加到 BoxCollider2D 并使用函数OnMouseDrag()。它调用每一帧,当鼠标被夹在对象上时,即使它实际上并没有拖动。而且您还必须将带有功能的脚本添加到每个按钮。在函数 OnMouseDrag() 中,您可以通过单击的按钮的名称检查哪些侧面对象必须移动
    • 顺便说一句,你能不能像我关于 OnMouse 功能的另一个答案一样。问题是我只需要 1 分就能将 cmets 添加到问题(而不是答案)中,这是非常有用的事情:)
    【解决方案2】:

    您可以将组件 BoxCollider2D 添加到您的对象并编写函数

    OnMouseDown(){} // calls one frame when there was touch of boxcollider
    OnMouseDrag(){} // calls every frame when there is touch of boxcollider
    OnMouseUP(){} // calls one framу when there touch of boxcollider was stopped
    

    此功能不仅可以在 PC 上完美运行,在 Android 上也可以。

    【讨论】:

    • 就我糟糕的英语让我理解你的问题而言,你还需要关于物体本身运动的帮助吗?如果是,请写信,我会向您解释。
    • 是的,如果您不介意,我认为这会有所帮助
    • 我宁愿在大约一个小时后在另一个答案中写下它
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-11-12
    • 2016-06-25
    • 2016-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多