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

一. Unity实现虚拟摇杆及屏幕自适应功能

手游里面很多类型的游戏都需要用到遥感功能,例如王者荣耀,和平精英等,之前的摇杆功能都是用类似于Easy Touch的插件进行开发的,今天不借助任何插件来实现虚拟摇杆的功能。

在这里插入图片描述

一般虚拟摇杆的组成都是由轮盘和遥感的点组成,轮盘控制位移,限制在某个区域内,而点则是控制旋转,限制在轮盘内,因此需要用到的是Unity自带的UI事件,因此创建一个名为UIEventListener的类,去实现IPointerDownHandler,IPointerUpHandler,IDragHandler方法,通过事件监听回调来处理。

using UnityEngine;
using UnityEngine.EventSystems;namespace CS
{[AddComponentMenu("UI/UIEventListener")]public class UIEventListener : MonoBehaviour,IPointerDownHandler,IPointerUpHandler,IDragHandler{public Action<PointerEventData> OnDownEvent;public Action<PointerEventData> OnUpEvent;public Action<PointerEventData> OnDargEvent;public static UIEventListener Get(GameObject go){UIEventListener listener = null;if (go != null){listener = go.GetComponent<UIEventListener>();if (listener == null){listener = go.AddComponent<UIEventListener>();}}return listener;}public void OnPointerDown(PointerEventData eventData){OnDownEvent?.Invoke(eventData);}public void OnPointerUp(PointerEventData eventData){OnUpEvent?.Invoke(eventData);}public void OnDrag(PointerEventData eventData){OnDargEvent?.Invoke(eventData);}}

下面贴出完整代码,接下来对虚拟摇杆进行处理,监听这三个事件,其中mTouchMaxDir是虚拟摇杆的点距离轮盘中心的最大距离,也就是你遥感点能拉到多远,而由于在不同分辨率下,这个距离其实并非是固定的,因此就和我上一篇Unity实现经验条动态自适应一样,以实际画布的高比屏幕的高得到当前高的比值,然后乘以固定的最远拉伸距离,就能得到当前分辨率下的自适应拉伸距离。为了限制轮盘的位置,因此需要设置一张矩形的底图,将其aplha设置为0,表示轮盘可移动的范围。

在这里插入图片描述

在我们按下的时候,记录开始按下的位置,已经显示遥感点,将按下的位置赋值给轮盘,而抬起的时候,隐藏摇杆点,重置轮盘的位置,这个都很简单,然后我们在OnDrag拖拽事件中,首先我们得到遥感的方法,通过遥感的最终位置-开始位置 = 方向,由于我们遥感点是需要限定在轮盘内的,因此需要用距离来判断,因此通过方向的magnitude得到当前遥感点的距离,来判断是否超过我们之前设定的最大遥感距离,如果超出了就用 Vector2.ClampMagnitude(dir, mTouchMaxDir) API限制在这个mTouchMaxDir最大距离内,然后我们遥感点的位置就是我们开始位置+限制在最大距离的Dir ,如果没有超出就直接等于我们Drag传出的位置即可,这里的位置需要注意,都是postion,也就是世界坐标的位置,因为我们UIEvent事件中传出的eventData中的Position是世界坐标位置

    public class UI_MainCityPanel : View<UI_MainCityPanel, MainCityScene>{private Image mDirBgImg;private Image mDirPointImg;private Vector2 mStartPos = Vector2.zero;private Vector2 mDefaultPos = Vector2.zero;private float mTouchMaxDir;public override void IAwake(){base.IAwake();InitComponment();OnTouchEvent();}private void InitComponment(){mPowerImg = transform.Index<Image>("F_PowerImg");mDirBgImg= transform.Index<Image>("F_DirBg");}private void OnTouchEvent(){mTouchMaxDir = Screen.height * 1.0f / Consts.ScreenHeight * Consts.TouchPointMaxLen;mDirPointImg.SetActiveState(false);mUIEvtListener = UIEventListener.Get(gameObject);mUIEvtListener.OnDownEvent += (eventData =>{mStartPos = eventData.position;mDirPointImg.SetActiveState(true);mDirBgImg.transform.position = eventData.position;});mUIEvtListener.OnUpEvent += (eventData =>{mDirPointImg.transform.localPosition = mDefaultPos;mDirPointImg.SetActiveState(false);mDirBgImg.transform.localPosition = mDefaultPos;});mUIEvtListener.OnDargEvent += (eventData =>{Vector2 dir = eventData.position - mStartPos;float length = dir.magnitude;if (length > mTouchMaxDir){Vector2 clampDir = Vector2.ClampMagnitude(dir, mTouchMaxDir);mDirPointImg.transform.position = mStartPos + clampDir;}else{mDirPointImg.transform.position = eventData.position;}});}
}

下面看演示效果

在这里插入图片描述

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • GPS/LBS/Wi-Fi定位,全安排!—合宙Air201资产定位模组LuatOS快速入门04
  • Rust Web开发框架对比:Warp与Actix-web
  • 升级Ubuntu内核的几种方法
  • Table列表复现框实现【勾选-搜索-再勾选】
  • Python | Leetcode Python题解之第406题根据身高重建队列
  • C语言补习课番外篇——采样sin(x)
  • CustomerbasicController
  • 如何 吧一个 一维数组 切分成相同等分,一维数组作为lstm的输入(三维数据)的数据预处理 collate_fn的应用
  • c语言快递小项目
  • 深度学习速通系列:F1和F2分数
  • 边缘计算网关:连接中心计算与边缘设备的重要桥梁-天拓四方
  • C到C++入门基础知识
  • 数据结构基础讲解(八)——树和二叉树专项练习(上)
  • 【LLM:Gemini】文本摘要、信息提取、验证和纠错、重新排列图表、视频理解、图像理解、模态组合
  • windows检查端口占用并关闭应用
  • 30秒的PHP代码片段(1)数组 - Array
  • angular组件开发
  • AWS实战 - 利用IAM对S3做访问控制
  • CEF与代理
  • HTML-表单
  • JAVA并发编程--1.基础概念
  • React as a UI Runtime(五、列表)
  • Vue2.0 实现互斥
  • vue2.0项目引入element-ui
  • 阿里云ubuntu14.04 Nginx反向代理Nodejs
  • 彻底搞懂浏览器Event-loop
  • 个人博客开发系列:评论功能之GitHub账号OAuth授权
  • 力扣(LeetCode)21
  • 人脸识别最新开发经验demo
  • 如何胜任知名企业的商业数据分析师?
  • 新手搭建网站的主要流程
  • 《天龙八部3D》Unity技术方案揭秘
  • kubernetes资源对象--ingress
  • Python 之网络式编程
  • ​LeetCode解法汇总2670. 找出不同元素数目差数组
  • ​软考-高级-系统架构设计师教程(清华第2版)【第12章 信息系统架构设计理论与实践(P420~465)-思维导图】​
  • # 飞书APP集成平台-数字化落地
  • #多叉树深度遍历_结合深度学习的视频编码方法--帧内预测
  • #基础#使用Jupyter进行Notebook的转换 .ipynb文件导出为.md文件
  • #我与Java虚拟机的故事#连载16:打开Java世界大门的钥匙
  • (52)只出现一次的数字III
  • (分类)KNN算法- 参数调优
  • (十)【Jmeter】线程(Threads(Users))之jp@gc - Stepping Thread Group (deprecated)
  • (四)汇编语言——简单程序
  • (算法二)滑动窗口
  • (一)Thymeleaf用法——Thymeleaf简介
  • (一)VirtualBox安装增强功能
  • (转载)PyTorch代码规范最佳实践和样式指南
  • **python多态
  • .NET 5.0正式发布,有什么功能特性(翻译)
  • .net core 3.0 linux,.NET Core 3.0 的新增功能
  • .net core Swagger 过滤部分Api
  • .NET Core中的去虚
  • .NET DataGridView数据绑定说明
  • .NET Remoting Basic(10)-创建不同宿主的客户端与服务器端