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

用Unity ScrollRect组件实现王者荣耀的操作摇杆

用Unity ScrollRect组件复现王者荣耀的操作摇杆

目录

  1. 前言
  2. 效果展示
  3. 实现过程
  4. 脚本实现

1.前言

看到一位博主用ScrollRect制作摇杆的过程,遂想复现一下王者荣耀的摇杆,呈现效果可谓是两模两样。
参考来源:Unity使用ScrollRect制作摇杆(UGUI)

2.效果展示

3. 实现过程

这个实现过程其实和那位博主是一样的,不过我还加了一个箭头辅助让方向可视化,这里就需要注意了,直接把这个 Arrow 加在代码中是不会被序列化到Inspector面板上的,因为ScrollRect的自定义编辑器原因,我们需要加一个辅助的自定义编辑器来让我们加的元素显示到Inspector上。

4.脚本实现

1.自定义编辑器 - RockerEditor

usingSystem.Collections;usingSystem.Collections.Generic;usingUnityEditor;usingUnityEditor.UI;usingUnityEngine;usingUnityEngine.UI;[CustomEditor(typeof(Rocker),true)]publicclassRockerEditor:ScrollRectEditor{privateSerializedPropertym_Arrow;protectedoverridevoidOnEnable(){base.OnEnable();m_Arrow=serializedObject.FindProperty("arrow");}publicoverridevoidOnInspectorGUI(){//绘制父类 ScrollRect的属性base.OnInspectorGUI();//绘制子类新增的自定义属性serializedObject.Update();EditorGUILayout.Space();// 空行分隔EditorGUILayout.LabelField("Custom Properties",EditorStyles.boldLabel);// 新增的属性标题EditorGUILayout.PropertyField(m_Arrow,newGUIContent("Arrow Image"));serializedObject.ApplyModifiedProperties();}}

2.摇杆 Rocker

usingSystem;usingSystem.Collections;usingSystem.Collections.Generic;usingUnityEngine;usingUnityEngine.EventSystems;usingUnityEngine.UI;publicclassRocker:ScrollRect{//摇杆半径protectedfloatmRadius=0f;//箭头显示的半径protectedfloatmBgRadius=0f;//显示摇杆方向的箭头[SerializeField]privateImagearrow;protectedoverridevoidStart(){base.Start();varrectTransform=this.GetComponent<RectTransform>();//计算摇杆半径,取 RectTransform 的宽度(sizeDelta的x表示对象的实际宽度)的20%//表示手柄的可移动范围mRadius=rectTransform.sizeDelta.x*0.15f;mBgRadius=rectTransform.sizeDelta.x*0.2f;if(arrow!=null){arrow.gameObject.SetActive(false);//初始状态隐藏箭头}}publicoverridevoidOnBeginDrag(PointerEventDataeventData){base.OnBeginDrag(eventData);if(arrow!=null)arrow.gameObject.SetActive(true);//开始拖拽时显示箭头}publicoverridevoidOnDrag(PointerEventDataeventData){//调用父类方法,更新 content 的 anchoredPosition(手柄位置)base.OnDrag(eventData);varcontentPosition=this.content.anchoredPosition;//获取手柄相对于摇杆的锚点位置//magnitude = √(x² + y²)if(contentPosition.magnitude>mRadius){contentPosition=contentPosition.normalized*mRadius;//限制手柄的位置在圆形范围内SetContentAnchoredPosition(contentPosition);//设置手柄在圆形范围内的位置}//Debug.Log(contentPosition);if(arrow!=null&&contentPosition.magnitude>0.01f)//防止微小的输入导致箭头抖动{//获取当前手柄的标准化方向向量Vector2direction=contentPosition.normalized;//计算箭头在摇杆背景外表面的位置arrow.rectTransform.anchoredPosition=direction*mBgRadius;//计算箭头旋转角度floatangle=Mathf.Atan2(direction.y,direction.x)*Mathf.Rad2Deg;//计算手柄位置与水平轴的夹角arrow.rectTransform.localRotation=Quaternion.Euler(0,0,angle-90f);}}publicoverridevoidOnEndDrag(PointerEventDataeventData){base.OnEndDrag(eventData);if(arrow!=null)arrow.gameObject.SetActive(false);//拖拽结束隐藏箭头}}
http://www.jsqmd.com/news/492196/

相关文章:

  • 通义千问3-Reranker-0.6B模型解析:架构设计与训练原理
  • Python异步编程实战:用asyncio.subprocess实现高效子进程管理(附完整代码示例)
  • Silvaco实战:3种提取电子浓度的方法对比(附完整代码+避坑指南)
  • seaTunnel Web 部署常见问题排查指南
  • Apache Hop实战部署指南:从零搭建跨平台数据集成环境
  • all-MiniLM-L6-v2保姆级部署教程:3步搭建轻量级文本嵌入服务
  • AnythingtoRealCharacters2511实战:批量处理动漫图,效率提升10倍
  • Chromium视频硬解调试全攻略:从VAAPI配置到GPU状态监控
  • DIY树莓派相机的RAW图像处理:用libcamera-still玩转专业摄影后期
  • ZeroMQ inproc实战:如何用内存共享提升线程间通信效率(附C++代码示例)
  • JavaBoot/.Net6双引擎加持!引迈JNPF低代码平台5.0保姆级上手评测
  • 基于OFA图像英文描述模型的智能相册管理系统开发
  • Qwen-Turbo-BF16模型安全防护:防止恶意攻击
  • MAML实战避坑指南:如何用元学习快速适应新任务(附代码示例)
  • 5分钟部署Meta-Llama-3-8B-Instruct:AutoDL平台+WebUI界面完整指南
  • 避坑指南:Zemax中柯克物镜设计的5个常见错误及解决方法
  • TI MSPM0G3507开发板驱动0.96寸SSD1306 SPI OLED屏移植实战
  • IP-Adapter避坑指南:SD15/SDXL预处理器选择误区与面部特征保留技巧
  • HexView脚本工具实战:如何用生成格式文件功能验证嵌入式系统闪存数据
  • Joplin笔记党福音:手把手教你安装Kity Minder思维导图插件(附常见问题解决)
  • 音乐节目标签系统:CCMusic与自然语言处理的联合应用
  • Phi-3-vision-128k-instruct效果展示:交通监控截图车辆行为识别+事件报告生成
  • Chatbot 开发者出访地址优化实战:提升微服务架构下的通信效率
  • LiuJuan Z-Image Generator多场景落地:游戏原画草图生成+服装设计概念图输出
  • 智能图文审核!OFA图像语义蕴含模型实战全解析
  • Qwen3-14b_int4_awq效果对比评测:vs Qwen2.5-14B、vs Llama3-13B中文生成质量
  • 论文写作篇#3:YOLO改进模块结构框图绘制实战,draw.io高效技巧解析
  • 全球主流语音文本情感数据集盘点与获取指南
  • 7. TI MSPM0G3507开发板串口通信实战:基于SysConfig与中断的UART0收发实验
  • Phi-3-mini-128k-instruct环境部署详解:Windows系统一站式安装配置