一. 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;}});}
}
下面看演示效果
相关文章:

一. Unity实现虚拟摇杆及屏幕自适应功能
手游里面很多类型的游戏都需要用到遥感功能,例如王者荣耀,和平精英等,之前的摇杆功能都是用类似于Easy Touch的插件进行开发的,今天不借助任何插件来实现虚拟摇杆的功能。 一般虚拟摇杆的组成都是由轮盘和遥感的点组成,…...

【达梦数据库】mysql 和达梦 tinyint 与 bit 返回值类型差异
测试环境 mysql5.7.44 达梦2024Q2季度版 前言 在mysql 中存在 tinyint(1)的用法来实现存储0 1 作为boolean的标识列;但是在达梦并不允许使用 tinyint(1)来定义列,只能使用 tinyint 即 取值范围为ÿ…...
VUE工程中axios基本使用
安装axios npm install axios -s在main.js中引入 import http from axios Vue.prototype.$http = http将其绑定在VUE的prototype属性中 vue工程目录下,新建config文件夹,在config文件夹下新建index.js export default {...
跨服务器执行PowerShell脚本
本机和远程机都要执行 Enable-PSRemoting -Force 远程端关闭公用网络 Get-NetConnectionProfile Set-NetConnectionProfile -Name "未识别的网络" -NetworkCategory Private 本机和远程机都要执行 winrm quickconfig 将远程机ip加入信任列表 cd WSMan::localhost\…...

linux_L2_linux删除文件
linux 删除文件 在Linux下删除文件有多种实现方法,以下是其中几种常见的方法: 方法一:使用rm命令删除单个文件 rm 文件路径例如,删除当前目录下的文件file.txt: rm file.txtQuestion :当你在Linux系统中使用rm命令删…...

系统架构设计师 - 项目管理
项目管理 项目管理(1-3分,案例分析 25分)立项管理 ★盈亏平衡分析 范围管理 ★★时间管理 ★★★★概述前导图法 PDM(单代号网络图)箭线图法 ADM(双代号网络图) 了解关键路径法总时差自由时差 甘特图 成本管理 ★挣值管理概述指数计算 软件质…...

Spring Boot基础
项目创建 项目启动 请求响应 RestController 1.返回值处理 RestController:这个注解结合了Controller和ResponseBody的功能。它默认将所有处理请求的方法的返回值直接作为响应体内容返回,主要用于构建RESTful API。返回的数据格式通常是JSON或XML&…...

C语言 | Leetcode C语言题解之第402题移掉K位数字
题目: 题解: char* removeKdigits(char* num, int k) {int n strlen(num), top 0;char* stk malloc(sizeof(char) * (n 1));for (int i 0; i < n; i) {while (top > 0 && stk[top] > num[i] && k) {top--, k--;}stk[top]…...

使用Visual Studio Code配置C/C++开发环境的全面指南
目录 引言 一、准备工作 1. 安装Visual Studio Code 2. 安装C/C编译器 3. 配置环境变量(仅Windows用户) 二、在VS Code中安装C/C扩展 三、创建您的第一个C/C项目 1. 创建项目文件夹 2. 打开项目文件夹 3. 创建源文件 四、配置任务(…...

算法练习题26——多项式输出(模拟)
输入格式 输入共有 2 行 第一行 1 个整数,n,表示一元多项式的次数。 第二行有 n1 个整数,其中第 i 个整数表示第 n−i1 次项的系数,每两个整数之间用空格隔开。 输出格式 输出共 1 行,按题目所述格式输出多项式。…...

卷积神经网络经典模型架构简介
【图书推荐】《PyTorch深度学习与企业级项目实战》-CSDN博客 《PyTorch深度学习与企业级项目实战(人工智能技术丛书)》(宋立桓,宋立林)【摘要 书评 试读】- 京东图书 (jd.com) ImageNet是一个包含超过1 500万幅手工标记的高分辨率图像的数据…...
【Kubernetes】常见面试题汇总(十三)
目录 39.简述 Kubernetes Scheduler 使用哪两种算法将 Pod 绑定到 worker 节点? 40.简述 Kubernetes kubelet 的作用? 41.简述 Kubernetes kubelet 监控 Worker 节点资源是使用什么组件来实现的? 39.简述 Kubernetes Scheduler 使用哪两种算…...

嵌入式QT开发:构建高效智能的嵌入式系统
摘要: 本文深入探讨了嵌入式 QT 相关的各个方面。从 QT 框架的基础架构和核心概念出发,详细阐述了其在嵌入式环境中的优势与特点。文中分析了嵌入式 QT 的开发环境搭建过程,包括交叉编译工具链的配置等关键步骤。进一步探讨了嵌入式 QT 的界面…...

Linux抢占调度
目录 抢占流程 抢占时机 用户态抢占时机 1、 从系统调用返回用户空间 2、 从中断返回用户空间 内核态抢占时机 1、中断处理程序返回内核空间 可以看到最终是到了 preempt_schedule_irq 2、当内核从non-preemptible(禁止抢占)状态变成pr…...
k8s中,为什么把pod的服务以deployment的形式通过nodeport对外发布,以及容器和虚拟机的一些区别
deployment是个控制器 主要负责管理pod,来代表k8s集群向外提供稳定的服务。 说,k8s有很多优点。 说k8s的优点,可能先需要说容器提供的便利。 同样的硬件资源 跑几个虚拟机,每个虚拟机上跑几个服务。 就挺重了。风扇呼呼叫 …...

PMP--一模--解题--41-50
文章目录 14.敏捷--方法--回顾--回顾是最重要的一个实践,原因是它能让团队学习、改进和调整其过程。41、 [单选] 新项目中的所有团队成员都希望通过尽快交付价值来获得客户的信任。项目经理了解到一个资源已经在其他项目中与发起人一起工作。某资源似乎在使用个人影…...
Kafka启动关闭及其相关命令kafka启动、状态监控、日常操作
开启zookeeper命令(备注:先进入zookeeper的bin目录) ./zkServer.sh start 关闭zookeeper命令(备注:先进入zookeeper的bin目录) ./zkServer.sh stop Kafka启动命令(备注:先进入kafka目录) 常规模式启动kafka bin/kafka-server-start.sh config/server.properties 进程守…...
CentOS 系统设置与维护教程
CentOS 系统设置与维护教程 在这篇博客中,我们将介绍在 CentOS 系统上进行的一些常见操作,包括停止和禁用防火墙服务、配置 SELinux。我们还将展示如何切换到 root 用户以执行这些操作。通过这些操作,你可以更好地管理和配置你的 CentOS 环境…...
流量牵引技术与传统防火墙的区别
在网络安全领域,流量牵引技术和传统防火墙都起着重要的作用,但它们在很多方面存在着明显的区别。 一、工作原理不同 传统防火墙主要是通过设置访问控制规则来过滤网络流量。它基于预先设定的策略,对进入和离开网络的数据包进行检查…...

【Python爬虫系列】_020.异步协程asyncio
课 程 推 荐我 的 个 人 主 页:👉👉 失心疯的个人主页 👈👈入 门 教 程 推 荐 :👉👉 Python零基础入门教程合集 👈👈虚 拟 环 境 搭 建 :👉👉 Python项目虚拟环境(超详细讲解) 👈👈PyQt5 系 列 教 程:👉👉 Python GUI(PyQt5)文章合集 👈👈…...

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型
摘要 拍照搜题系统采用“三层管道(多模态 OCR → 语义检索 → 答案渲染)、两级检索(倒排 BM25 向量 HNSW)并以大语言模型兜底”的整体框架: 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后,分别用…...

关于nvm与node.js
1 安装nvm 安装过程中手动修改 nvm的安装路径, 以及修改 通过nvm安装node后正在使用的node的存放目录【这句话可能难以理解,但接着往下看你就了然了】 2 修改nvm中settings.txt文件配置 nvm安装成功后,通常在该文件中会出现以下配置&…...
基于服务器使用 apt 安装、配置 Nginx
🧾 一、查看可安装的 Nginx 版本 首先,你可以运行以下命令查看可用版本: apt-cache madison nginx-core输出示例: nginx-core | 1.18.0-6ubuntu14.6 | http://archive.ubuntu.com/ubuntu focal-updates/main amd64 Packages ng…...
1688商品列表API与其他数据源的对接思路
将1688商品列表API与其他数据源对接时,需结合业务场景设计数据流转链路,重点关注数据格式兼容性、接口调用频率控制及数据一致性维护。以下是具体对接思路及关键技术点: 一、核心对接场景与目标 商品数据同步 场景:将1688商品信息…...
电脑插入多块移动硬盘后经常出现卡顿和蓝屏
当电脑在插入多块移动硬盘后频繁出现卡顿和蓝屏问题时,可能涉及硬件资源冲突、驱动兼容性、供电不足或系统设置等多方面原因。以下是逐步排查和解决方案: 1. 检查电源供电问题 问题原因:多块移动硬盘同时运行可能导致USB接口供电不足&#x…...

对WWDC 2025 Keynote 内容的预测
借助我们以往对苹果公司发展路径的深入研究经验,以及大语言模型的分析能力,我们系统梳理了多年来苹果 WWDC 主题演讲的规律。在 WWDC 2025 即将揭幕之际,我们让 ChatGPT 对今年的 Keynote 内容进行了一个初步预测,聊作存档。等到明…...
Spring AI与Spring Modulith核心技术解析
Spring AI核心架构解析 Spring AI(https://spring.io/projects/spring-ai)作为Spring生态中的AI集成框架,其核心设计理念是通过模块化架构降低AI应用的开发复杂度。与Python生态中的LangChain/LlamaIndex等工具类似,但特别为多语…...

RNN避坑指南:从数学推导到LSTM/GRU工业级部署实战流程
本文较长,建议点赞收藏,以免遗失。更多AI大模型应用开发学习视频及资料,尽在聚客AI学院。 本文全面剖析RNN核心原理,深入讲解梯度消失/爆炸问题,并通过LSTM/GRU结构实现解决方案,提供时间序列预测和文本生成…...
大数据学习(132)-HIve数据分析
🍋🍋大数据学习🍋🍋 🔥系列专栏: 👑哲学语录: 用力所能及,改变世界。 💖如果觉得博主的文章还不错的话,请点赞👍收藏⭐️留言Ǵ…...
安卓基础(aar)
重新设置java21的环境,临时设置 $env:JAVA_HOME "D:\Android Studio\jbr" 查看当前环境变量 JAVA_HOME 的值 echo $env:JAVA_HOME 构建ARR文件 ./gradlew :private-lib:assembleRelease 目录是这样的: MyApp/ ├── app/ …...