这是有问题的代码,它用于向上/向下/向左/向右移动 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;
}
}
我尝试过设置输入管理器,但由于缺乏耐心而放弃了。 另外,我不知道如何将按钮绑定到动作。
没有直接内置的东西可以为您提供
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;