没有任何直接内置的东西可以提供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;
|