当前位置: 首页 > news >正文

一周一个Unity小游戏2D反弹球游戏 - 移动的弹板(触屏版)

前言

        上文中实现了用鼠标移动控制弹板的移动,本文将实现手指触屏时弹板跟随手指移动的功能,并通过使用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勾选上,在设备模拟器的窗口中就可以看到如下效果,这样就完成了弹板触屏版的移动逻辑。

http://www.dtcms.com/a/41168.html

相关文章:

  • Python--模块(上)
  • IoT 测试:智能互联时代的质量保障
  • DeepSeek-V3后训练揭秘:如何通过监督微调和强化学习提升模型性能
  • 为什么要进行软件测试?
  • 将宇宙不同温度下的能量表现形式 类比为量子计算机的波函数解码过程
  • 《Qt动画编程实战:轻松实现头像旋转效果》
  • 人工智能 pytorch篇
  • 构建动态URL查询字符串以导出报警统计数据
  • C++:指针函数与函数指针
  • Grafana11.5.2 | 安装配置步骤(已成功安装)
  • AI开发利器:Anaconda
  • Golang快速上手01/Golang基础
  • 深入miniqmt:掌握创建交易对象的关键步骤
  • 异常c/c++
  • 原码反码补码计算以及按位取反操作
  • Linux 环境“从零”部署 MongoDB 6.0:mongosh 安装与数据操作全攻略
  • Node.js安装与学习的简单记录
  • C++三大特性之多态
  • Mission Planner MP地面站添加Cesium三维地图
  • 我国公共数据授权运营的实践调查与展望——目标定位、行动要素、政策保障及平台支持
  • JavaScript 简单类型与复杂类型-简单类型的内存分配
  • 【DeepSeek开发】Python实现纽约房价热力图
  • 基于LangChain4j调用火山引擎DeepSeek R1搭建RAG知识库实战指南
  • FreeRTOS-计数型信号量
  • 【OpenCV C++】图像增强:三种锐化方式,图像清晰度增强
  • TCP基本入门-简单认识一下什么是TCP
  • 关于“你对 Spring Cloud 的理解”
  • SpringBoot 中的 Redis 序列化
  • 【全栈开发】从0开始搭建一个图书管理系统【一】框架搭建
  • DeepSeek开源周 Day04:从DualPipe聊聊大模型分布式训练的并行策略