unity2022版本 实现手机虚拟操作杆

简介

在许多移动游戏中,虚拟操纵杆是一个重要的用户界面元素,用于控制角色或物体的移动。本文将介绍如何在Unity中实现虚拟操纵杆,提供了一段用于移动控制的代码。我们将讨论不同类型的虚拟操纵杆,如固定和跟随,以及如何在实际游戏中使用这些操纵杆。

界面节点设置

1. 添加一个Canvas节点

首先,我们需要创建一个画布节点,这是我们整个界面的基础。这个节点将允许我们绘制和排列其他元素。

2. 在Canvas节点下添加一个Panel节点

接下来,我们将在Canvas节点下创建一个Panel节点。这个Panel节点将充当容器,用于组织和管理我们的界面元素。

3. 在Panel节点下添加两个Image节点

在Panel节点中,我们将添加两个Image节点。这两个Image节点具有不同的用途:

a. 背景节点:第一个Image节点将用作背景,为整个界面提供背景图像或颜色。

b. 操作按钮节点:第二个Image节点将用于显示操作按钮或其他交互元素。

4. 结构示意图:

你可以使用以下结构示意图来更清晰地展示节点的层次关系:

UiCanvas (画布)
│
└─ Joystick (面板)│├─ Bg(背景)│└─ Btn(操作按钮)

截图可以这样:

脚本编写

简要说明:

因为编写的是虚拟操作杆 需要添加三个事件:

触摸开始(Pointer Down),拖动(Drag),触摸结束(Pointer Up)

在触摸开始记录拖动的一些起始坐标。

在拖动中移动操作按钮节点如果是操作角色移动这里就可以操作移动角色

在触摸结束的时候重置坐标

  1. PointerDown方法:描述PointerDown方法,它处理当玩家触摸操纵杆时的行为。根据操纵杆类型(固定或跟随),它设置操纵杆的初始位置。

  2. Drag方法:详细解释Drag方法,这是当玩家拖动操纵杆时执行的代码。说明如何计算操纵杆输入的方向,以及如何限制操纵杆的移动范围。

  3. PointerUp方法:描述PointerUp方法,用于当玩家释放操纵杆时重置相关变量和位置,同时停止玩家的移动。

在初始化引用的时候可以传入参数(JoystickType)控制虚拟操作杆是固定的还是跟随触摸点的

完整的脚本如下:

using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.UI;public class MovementJoystick : MonoBehaviour
{// 枚举类型,用于指定操纵杆的类型public enum JoystickType{FIXED,    // 固定类型的操纵杆FOLLOW    // 跟随类型的操纵杆}// 对操纵杆和其背景对象的引用public GameObject joystick;  // 操纵杆对象public GameObject joystickBG;  // 操纵杆背景对象// 存储当前操纵杆的输入值作为一个二维向量public Vector2 joystickVec;// 指定操纵杆的类型(固定或跟随)public JoystickType joystickType = JoystickType.FIXED;// 触摸操纵杆时的位置private Vector2 joystickTouchPos;// 操纵杆背景的原始位置private Vector2 joystickOriginalPos;// 操纵杆背景的半径,根据屏幕宽度计算而来private float joystickRadius;// 初始化void Start(){// 初始化操纵杆背景的原始位置joystickOriginalPos = joystickBG.transform.position;// 根据屏幕宽度计算操纵杆背景的半径joystickRadius = joystickBG.GetComponent<RectTransform>().sizeDelta.y * Screen.width / 800 / 2;}// 当玩家按下操纵杆时调用public void PointerDown(){if (joystickType == JoystickType.FIXED){// 对于固定操纵杆,将触摸位置设置为操纵杆背景的原始位置joystickTouchPos = joystickOriginalPos;}else if (joystickType == JoystickType.FOLLOW){// 对于跟随操纵杆,将操纵杆及其背景设置为触摸位置joystick.transform.position = Input.mousePosition;joystickBG.transform.position = Input.mousePosition;joystickTouchPos = Input.mousePosition;}}// 当玩家拖动操纵杆时调用public void Drag(BaseEventData baseEventData){// 将基本事件数据强制转换为PointerEventDataPointerEventData pointerEventData = (PointerEventData)baseEventData;// 获取当前拖动位置Vector2 dragPos = pointerEventData.position;// 计算操纵杆输入的方向joystickVec = (dragPos - joystickTouchPos).normalized;// 计算当前位置与触摸位置之间的距离float joystickDist = Vector2.Distance(dragPos, joystickTouchPos);// 限制操纵杆在指定半径范围内移动if (joystickDist < joystickRadius){joystick.transform.position = joystickTouchPos + joystickVec * joystickDist;}else{joystick.transform.position = joystickTouchPos + joystickVec * joystickRadius;}// 根据操纵杆输入设置玩家的移动方向// HHSJ.Main.instance.PlayerEx.GetComponent<HHSJ.Player>().moveDir = dragPos - joystickTouchPos;}// 当玩家释放操纵杆时调用public void PointerUp(){// 重置操纵杆输入和位置到初始值joystickVec = Vector2.zero;joystick.transform.position = joystickOriginalPos;joystickBG.transform.position = joystickOriginalPos;// 将玩家的移动方向重置为零// HHSJ.Main.instance.PlayerEx.GetComponent<HHSJ.Player>().moveDir = Vector3.zero;}// 可以在这里添加其他方法和FixedUpdate以实现特定功能
}

大致效果如下:

社交:

QQ群:859055710 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/106067.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

进阶JAVA篇- DateTimeFormatter 类与 Period 类、Duration类的常用API(八)

目录 1.0 DateTimeFormatter 类的说明 1.1 如何创建格式化器的对象呢&#xff1f; 1.2 DateTimeFormatter 类中的 format&#xff08;LocalDateTime ldt&#xff09; 实例方法 2.0 Period 类的说明 2.1 Period 类中的 between(localDate1,localDate2) 静态方法来创建对象。 3.…

京东优惠券怎么找?

京东优惠券怎么找&#xff1f; 1、手机安装「草柴」后&#xff0c;打开京东挑选要购买的商品&#xff1b; 2、挑选好京东商品后&#xff0c;点击右上角的「分享」&#xff0c;并点击「复制链接」&#xff1b; 3、将复制的京东商品链接&#xff0c;粘贴到草柴输入框&#xff0c…

antd pro form 数组套数组 form数组动态赋值 shouldUpdate 使用

antd form中数组套数组 form数组动态变化 动态赋值 需求如上&#xff0c;同时添加多个产品&#xff0c;同时每个产品可以增加多台设备&#xff0c;根据设备增加相应编号&#xff0c;所以存在数组套数组&#xff0c;根据数组值动态变化 使用的知识点 form.list form中的数组…

十六、代码校验(5)

本章概要 基准测试 微基准测试JMH 的引入 基准测试 我们应该忘掉微小的效率提升&#xff0c;说的就是这些 97% 的时间做的事&#xff1a;过早的优化是万恶之源。—— Donald Knuth 如果你发现自己正在过早优化的滑坡上&#xff0c;你可能浪费了几个月的时间(如果你雄心勃勃的…

【AI视野·今日Robot 机器人论文速览 第五十四期】Fri, 13 Oct 2023

AI视野今日CS.Robotics 机器人学论文速览 Fri, 13 Oct 2023 Totally 45 papers &#x1f449;上期速览✈更多精彩请移步主页 Interesting: &#x1f4da;AI与机器人安全, 从攻击界面、伦理法律和人机交互层面进行了论述。(from 密西西比大学) &#x1f4da;机器人与图机器学…

华为云云耀云服务器L实例评测|企业项目最佳实践之建议与总结(十二)

华为云云耀云服务器L实例评测&#xff5c;企业项目最佳实践系列&#xff1a; 华为云云耀云服务器L实例评测&#xff5c;企业项目最佳实践之云服务器介绍(一) 华为云云耀云服务器L实例评测&#xff5c;企业项目最佳实践之华为云介绍(二) 华为云云耀云服务器L实例评测&#xff5…

2021年12月 Python(二级)真题解析#中国电子学会#全国青少年软件编程等级考试

Python编程&#xff08;1~6级&#xff09;全部真题・点这里 C/C编程&#xff08;1~8级&#xff09;全部真题・点这里 一、单选题&#xff08;共25题&#xff0c;每题2分&#xff0c;共50分&#xff09; 第1题 执行以下程序 a[33,55,22,77] a.sort() for i in a:print(i)运行…

Nginx:反向代理(示意图+配置)

示意图&#xff1a; 反向代理 反向代理&#xff08;Reverse Proxy&#xff09;是代理服务器的一种&#xff0c;它代表服务器接收客户端的请求&#xff0c;并将这些请求转发到适当的服务器。当请求在后端服务器完成之后&#xff0c;反向代理搜集请求的响应并将其传输给客户端。…

MFC-对话框

目录 1、模态和非模态对话框&#xff1a; &#xff08;1&#xff09;、对话框的创建 &#xff08;2&#xff09;、更改默认的对话框名称 &#xff08;3&#xff09;、创建模态对话框 1&#xff09;、创建按钮跳转的界面 2&#xff09;、在跳转的窗口添加类 3&#xff0…

docker安装nessus

注册地址:https://zh-tw.tenable.com/products/nessus/nessus-essentials 临时邮箱:http://24mail.chacuo.net/ 帮助文档:https://docs.tenable.com/nessus/Content/DeployNessusDocker.htmdocker pull tenableofficial/nessusdocker run --name "my-nessus" -d -p 8…

vscode用密钥文件连接ssh:如果一直要输密码怎么办

commandshiftP&#xff1a;打开ssh配置文件 加上这么一段&#xff0c;host就是你给主机起的名字 对IdentityFile进行更改&#xff0c;改成相应的密钥文件 然后commandshiftP链接到主机就可以了 但是有时候它会让输入密码 这是由于你给这个IdentityFile的权限太多了&#xf…

数据结构 - 2(顺序表10000字详解)

一&#xff1a;List 1.1 什么是List 在集合框架中&#xff0c;List是一个接口&#xff0c;继承自Collection。 Collection也是一个接口&#xff0c;该接口中规范了后序容器中常用的一些方法&#xff0c;具体如下所示&#xff1a; Iterable也是一个接口&#xff0c;Iterabl…

【Vue面试题二十三】、你了解vue的diff算法吗?说说看

文章底部有个人公众号&#xff1a;热爱技术的小郑。主要分享开发知识、学习资料、毕业设计指导等。有兴趣的可以关注一下。为何分享&#xff1f; 踩过的坑没必要让别人在再踩&#xff0c;自己复盘也能加深记忆。利己利人、所谓双赢。 面试官&#xff1a;你了解vue的diff算法吗&…

【Vue面试题二十一】、Vue中的过滤器了解吗?过滤器的应用场景有哪些?

文章底部有个人公众号&#xff1a;热爱技术的小郑。主要分享开发知识、学习资料、毕业设计指导等。有兴趣的可以关注一下。为何分享&#xff1f; 踩过的坑没必要让别人在再踩&#xff0c;自己复盘也能加深记忆。利己利人、所谓双赢。 面试官&#xff1a;Vue中的过滤器了解吗&am…

Java字符串String

【char】类型代表字符类型&#xff0c;【String】类型代表字符串类型&#xff1b; 1.String类 1.1 声明字符串 在Java中字符串必须包含在一对双引号&#xff08;“ "&#xff09;之内。双引号包含的都是字符串。 声明字符串语法&#xff1a; String str; //声明字符串语…

排序算法-选择排序法(SelectionSort)

排序算法-选择排序法&#xff08;SelectionSort&#xff09; 1、说明 选择排序法也是枚举法的应用&#xff0c;就是反复从未排序的数列中取出最小的元素&#xff0c;加入另一个数列中&#xff0c;最后的结果即为已排序的数列。选择排序法可使用两种方式排序&#xff0c;即在所…

苍穹外卖(七) Spring Task 完成订单状态定时处理

Spring Task 完成订单状态定时处理, 如处理支付超时订单 Spring Task介绍 Spring Task 是Spring框架提供的任务调度工具&#xff0c;可以按照约定的时间自动执行某个代码逻辑。 应用场景: 信用卡每月还款提醒 火车票售票系统处理未支付订单 入职纪念日为用户发送通知 点外…

操作系统学习笔记4-死锁问题

文章目录 1、死锁逻辑图2、死锁三胞胎3、死锁的原因及必要条件4、死锁处理策略之死锁预防5、死锁处理策略之死锁避免&#xff08;银行家算法&#xff09;6、死锁处理策略之死锁检测与解除 1、死锁逻辑图 2、死锁三胞胎 3、死锁的原因及必要条件 4、死锁处理策略之死锁预防 5、死…

python openai宠物名字生成器

文章目录 OpenAICompletion宠物名字生成器提示词工程 prompt enginering 构建应用程序结果展示 OpenAI OpenAI 已经训练了非常擅长理解和生成文本的领先的语言模型。我们的 API 提供对这些模型的访问&#xff0c;可用于处理几乎任何涉及”语言处理“的任务。 Completion 补全…

18 | 生产环境多数据源的处理方法有哪些

工作中我们时常会遇到跨数据库操作的情况&#xff0c;这时候就需要配置多数据源&#xff0c;那么如何配置呢&#xff1f;常用的方式及其背后的原理支撑是什么呢&#xff1f;我们下面来了解一下。 首先看看两种常见的配置方式&#xff0c;分别为通过多个 Configuration 文件、利…