unity3d 菜鸟问题:如何将水平/垂直轴绑定到4个触摸按钮?

6psbrbz9  于 2023-03-09  发布在  其他
关注(0)|答案(1)|浏览(159)

下面是代码的问题,它是用来移动三维立方体向上/向下/左/右。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Movement : MonoBehaviour
{
    Vector2 Vec; 
    void Start()
    {

    }
 
    void Update()
    {

        Vec = transform.localPosition;
        Vec.x += Input.GetAxis("Horizontal") * Time.deltaTime * 20;
        Vec.y += Input.GetAxis("Vertical") * Time.deltaTime * 20;
        transform.localPosition = Vec;
    }
}

我试过设置输入管理器,但由于缺乏耐心而放弃。另外,我不知道如何将按钮绑定到操作。

zxlwwiss

zxlwwiss1#

没有任何直接内置的东西可以提供UnityEngine.UI.Button或其他对象的当前按下状态。
但是您可以使用IPointerXYHandler接口来实现,例如

public class PressedState : MonoBehaviour, IPointerEnerHandler, IPointerExitHandler, IPointerDownHander, IPointerUpHandler
{
    [SerializeField] Button _button;

    public bool isPressed { get; private set; }

    public void OnPointerEnter(PointerEventData pointerEventData)
    {
        // not needed only required for handling exit
    }

    public void OnPointerExit(PointerEventData pointerEventData)
    {
        isPressed = false;
    }

    public void OnPointerDown(PointerEventData pointerEventData)
    {
        isPressed = true;
    }

    public void OnPointerUp(PointerEventData pointerEventData)
    {
        isPressed = false;
    }
}
  • 在UI上,这是开箱即用的,如果您的按钮是3D碰撞器,您需要在相机上安装PhysicsRaycaster,如果是2D碰撞器,则需要安装PhyicsRaycaster2D。*

然后把这个连接到所有四个按钮上,并像这样处理它们。

public class Movement : MonoBehaviour
{
    [SerializeField] PressedState up;
    [SerializeField] PressedState down;
    [SerializeField] PressedState left;
    [SerializeField] PressedState right;
 
    void Update()
    {
        var vertical = 0;
        if(up.isPressed) vertical += 1f;
        if(down.isPressed) vertical -= 1f;
        var horizontal = 0;
        if(right.isPressed) horizontal += 1f;
        if(left.isPressed) horizontal -= 1f;

        var Vec = transform.localPosition;
        Vec.x += horizontal * Time.deltaTime * 20;
        Vec.y += vertical * Time.deltaTime * 20;
        transform.localPosition = Vec;
    }
}

确切地说,GetAxis应用了某种平滑,如果您确实需要,您可以使用Mathf.SmoothDamp等选项添加平滑
边注:一般来说,你通常希望避免更快的对角线移动,所以我可能宁愿使用

var movement = Vector2.ClampMagnitude(new Vector2(horizontal, vertical), 1f) * Time.deltaTime * 20;
transform.localPosition += movement;

相关问题