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

问题描述 投票:0回答:1

这是有问题的代码,它用于向上/向下/向左/向右移动 3D 立方体。

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;
    }
}

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

c# unity3d
1个回答
0
投票

没有直接内置的东西可以为您提供

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;
© www.soinside.com 2019 - 2024. All rights reserved.