前言
上文中实现了用鼠标移动控制弹板的移动,本文将实现手指触屏时弹板跟随手指移动的功能,并通过使用Unity自带的Device Simulator Devices Package来验证和模拟触屏设备的使用场景。
安装Device Simulator Devices Package
打开Unity Package Manager,位置在Window -> PackageManager。
打开之后选择Unity Registry,在搜索栏中输入simu就会显示出一个名为Device Simulator Devices的Package,进行安装。
安装完成后,可以在Window -> General -> Device Simulator中找到。
打开Device Simulator,选择一个Xiaomi Mi Max设备,那么模拟触屏的测试环境就设置好了。
通过触控控制弹板移动
打开SpringBoardController脚本,在脚本里声明两个InputActionReference关联之前创建的输入键映射。
[SerializeField] private InputActionReference _pointAction;
[SerializeField] private InputActionReference _positionAction;
[SerializeField] private bool _isSimulateAndroid;
private bool _isTouching;
private void OnEnable()
{
_pointAction.action.started += HandleOnPointStarted;
_pointAction.action.canceled += HandleOnPointCanceled;
}
private void OnDisable()
{
_pointAction.action.started -= HandleOnPointStarted;
_pointAction.action.canceled -= HandleOnPointCanceled;
}
private void HandleOnPointStarted(InputAction.CallbackContext _)
{
_isTouching = true;
}
private void HandleOnPointCanceled(InputAction.CallbackContext _)
{
_isTouching = false;
}
private void Update()
{
if (_hasMainCamera)
{
if (_isSimulateAndroid || Application.platform == RuntimePlatform.Android)
{
if (_isTouching)
{
var touchPosition = _positionAction.action.ReadValue<Vector2>();
UpdateSpringBoardPosition(touchPosition);
}
}
else if (Application.platform == RuntimePlatform.WindowsPlayer)
{
var mousePosition = Mouse.current.position.ReadValue();
UpdateSpringBoardPosition(mousePosition);
}
}
}
private void UpdateSpringBoardPosition(Vector2 position)
{
_currentXPosition = _mainCamera.ScreenToWorldPoint(position).x;
_currentXPosition = Mathf.Clamp(_currentXPosition, _minXPosition, _maxXPosition);
transform.position = new Vector2(_currentXPosition, transform.position.y);
}
声明了一个bool值用来控制模拟安卓平台,因为在编辑器中运行设备模拟器,Application.platform的值对应还是Windows平台,这个_isSimulateAndroid可以在编辑器运行时用来控制设定当前为安卓平台。
监听触控点击的事件,也就是_pointAction的started和canceled事件。当触控点击发生时用一个bool值_isTouching记录,设置为true,然后在Update中去判断,将之前控制弹板的代码封装出来,传入一个position变量来避免重复代码。触屏点击的位置就是_positionAction对应的Vector2的值,可以用ReadValue来获取。
完成以上步骤后在Unity中关联之前声明的两个Action,Point和Position。
模拟安卓设备运行
运行Unity,然后再打开刚刚的Device Simulator,将游戏物体上的Is Simulate Android勾选上,在设备模拟器的窗口中就可以看到如下效果,这样就完成了弹板触屏版的移动逻辑。