【发布时间】:2021-03-01 15:03:31
【问题描述】:
我正在制作一个 2D 数字棋盘游戏,并使用新的 Unity 输入系统(版本 2020.2.6f1)添加一些用于相机控制的玩家控件。对于鼠标和键盘设置,我能够测量单击和保持(使用交互),但我似乎无法将左键、右键或中键单击的保持与鼠标移动结合起来。我尝试在轴上创建一个“使用一个修改器复合添加按钮”或“两个修改器复合”,但这只是将两个或三个按钮组合在一起。我需要将鼠标的 Vector2 delta 与鼠标或键盘按钮单击(并按住)相结合的东西。
现在,我有一个单独的动作用于鼠标移动来设置状态,然后一个用于指针移动以根据状态执行某些操作。
我的方法是正确的方法吗? Unity 中是否存在带有按钮修饰符的 Vector2(或类似的东西)?
这是我早期的输入代码。如您所见,有一个版本的平移、旋转和拖动(“OnSet”方法)对应于设置 CameraState,然后是“OnPointerMovement”,它根据输入系统中的鼠标增量进行移动。然后是用于使用游戏手柄的“OnPan”和“OnRotate”(OnPan 使用右摇杆,OnRotate 使用 L/R 触发器作为轴)。
using UnityEngine;
using UnityEngine.InputSystem;
public class HumanPlayerInput : MonoBehaviour
{
[SerializeField]
Player HumanPlayer;
[SerializeField]
Camera PlayerCamera;
PointerChangeState CameraState;
void OnEnable()
{
CameraState = PointerChangeState.None;
if(PlayerCamera = null)
SetPlayerCamera();
}
public void OnSetPan(InputAction.CallbackContext context) => SetPointerState(context.ReadValueAsButton(), PointerChangeState.Pan);
public void OnSetDrag(InputAction.CallbackContext context) => SetPointerState(context.ReadValueAsButton(), PointerChangeState.Drag);
public void OnSetRotate(InputAction.CallbackContext context) => SetPointerState(context.ReadValueAsButton(), PointerChangeState.Rotate);
public void OnPan(InputAction.CallbackContext context) => PanCamera(context.ReadValue<Vector2>());
public void OnRotate(InputAction.CallbackContext context) => RotateCamera(context.ReadValue<float>());
public void OnPointerMovement(InputAction.CallbackContext context)
{
switch(CameraState)
{
case PointerChangeState.Drag:
break;
case PointerChangeState.Pan:
PanCamera(context.ReadValue<Vector2>());
break;
case PointerChangeState.Rotate:
RotateCamera(context.ReadValue<Vector2>().x);
break;
default:
break;
}
}
public void OnZoom(InputAction.CallbackContext context) => PlayerCamera.orthographicSize = context.ReadValue<float>() * 100f;
void PanCamera(Vector2 changeInPan) => PlayerCamera.transform.Translate(changeInPan * 500f);
void RotateCamera(float changeInRotation) => PlayerCamera.transform.Rotate(Vector3.up, changeInRotation);
void SetPointerState(bool isButtonPressed, PointerChangeState stateToEnable) => CameraState = isButtonPressed ? stateToEnable : PointerChangeState.None;
void SetPlayerCamera()
{
var playerCameraTransform = transform.Find("PlayerCamera");
if(playerCameraTransform == null)
PlayerCamera = Camera.main;
else
{
PlayerCamera = playerCameraTransform.GetComponent<Camera>();
if(PlayerCamera == null)
PlayerCamera = Camera.main;
}
}
}
【问题讨论】: