【Unity2022】Unity实现手机游戏操控摇杆(实现操控轮盘)

文章目录

  • 运行效果预览
  • 创建物体
  • 脚本
    • 获取RectTransform
    • 处理玩家拖动事件
    • 完整代码
  • 获取输入
  • 运行
  • 其他文章

运行效果预览

首先展示一下本文章实现的效果:
在这里插入图片描述

创建物体

创建两个UI图像,一个用于表示背景,作为父物体,命名为JoyStick,一个表示摇杆,命名为Center。
在这里插入图片描述
背景图像选择一个圆,最好加点半透明的属性,最终完成图如下图所示。
在这里插入图片描述

脚本

创建一个脚本,命名为Joystick,然后将脚本挂载到JoyStick物体上,我们将通过这个脚本来实现摇杆。

获取RectTransform

我们首先需要在Awake() 方法中,获取摇杆背景的 RectTransform 组件和手柄的RectTransfomr组件。

background = GetComponent<RectTransform>();
handle = transform.GetChild(0).GetComponent<RectTransform>(); // 摇杆手柄是背景的子元素

background 变量保存了背景的 RectTransform 组件,handle 变量保存了摇杆手柄的 RectTransform 组件。

处理玩家拖动事件

接下来,编写一个方法,用于处理拖动事件,代码如下所示。

public void OnDrag(PointerEventData eventData)
{Vector2 touchPosition = Vector2.zero;if (RectTransformUtility.ScreenPointToLocalPointInRectangle(background, eventData.position, eventData.pressEventCamera, out touchPosition)){// 获取触摸位置相对于摇杆背景的百分比touchPosition.x = (touchPosition.x / background.sizeDelta.x)*2;touchPosition.y = (touchPosition.y / background.sizeDelta.y)*2;touchPosition = (touchPosition.magnitude > 1f) ? touchPosition.normalized : touchPosition;// 更新摇杆手柄的位置handle.anchoredPosition = new Vector2(touchPosition.x * (background.sizeDelta.x / 2), touchPosition.y * (background.sizeDelta.y / 2));// 更新输入方向inputDirection = touchPosition;}
}

OnDrag(PointerEventData eventData) 方法用于处理拖动事件。在该方法中,首先通过 RectTransformUtility.ScreenPointToLocalPointInRectangle() 方法将触摸位置从屏幕坐标系转换为摇杆背景的本地坐标系。然后将触摸位置转换成相对于摇杆背景的百分比,这样摇杆手柄就能够根据触摸位置的百分比调整自己的位置。最后更新输入方向变量。

完整代码

using UnityEngine;
using UnityEngine.EventSystems;public class Joystick : MonoBehaviour, IDragHandler, IPointerUpHandler, IPointerDownHandler
{private RectTransform background; // 摇杆背景private RectTransform handle; // 摇杆手柄private Vector2 inputDirection; // 输入方向private void Awake(){background = GetComponent<RectTransform>();handle = transform.GetChild(0).GetComponent<RectTransform>(); // 摇杆手柄是背景的子元素}public void OnDrag(PointerEventData eventData){Vector2 touchPosition = Vector2.zero;if (RectTransformUtility.ScreenPointToLocalPointInRectangle(background, eventData.position, eventData.pressEventCamera, out touchPosition)){// 获取触摸位置相对于摇杆背景的百分比touchPosition.x = (touchPosition.x / background.sizeDelta.x)*2;touchPosition.y = (touchPosition.y / background.sizeDelta.y)*2;touchPosition = (touchPosition.magnitude > 1f) ? touchPosition.normalized : touchPosition;// 更新摇杆手柄的位置handle.anchoredPosition = new Vector2(touchPosition.x * (background.sizeDelta.x / 2), touchPosition.y * (background.sizeDelta.y / 2));// 更新输入方向inputDirection = touchPosition;}}public void OnPointerDown(PointerEventData eventData){OnDrag(eventData);}public void OnPointerUp(PointerEventData eventData){// 重置摇杆位置和输入方向handle.anchoredPosition = Vector2.zero;inputDirection = Vector2.zero;}// 返回输入方向public Vector2 GetInputDirection(){return inputDirection;}
}

获取输入

接下来就可以在其他所需获取输入的地方调用我们的GetInputDirection方法,来获取玩家的输入了,具体示例代码如下所示;

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class Player : Ball
{public Joystick joystick;// Start is called before the first frame updateprotected override void Start(){base.Start();GameObject canvas = GameObject.FindGameObjectWithTag("UI");joystick = canvas.transform.Find("Input/JoyStick").GetComponent<Joystick>();}
// Update is called once per frame
void Update(){Vector2 joystickInput=joystick.GetInputDirection();Move(new Vector3(joystickInput.x,joystickInput.y,transform.position.z));//Debug.Log(Weight);}
}

运行

运行程序,效果如下所示:
在这里插入图片描述

其他文章

Unity实现在两个物体之间连出一条线

Unity如何生成随机数

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

zookeeper mac安装

目录 1.下载zookeeper安装包 2.解压安装包 3.修改配置文件 4.启动服务端 5.启动客户端 这边工作中用到了zookeeper组件&#xff0c;但自己独立安装弄的不太多&#xff0c;这边本机mac装一个做测试使用 以下是安装记录&#xff0c;可以作为参考 从以下链接zookeeper版本列…

【算法|动态规划No.10】leetcode LCR 089. 打家劫舍 LCR 090. 打家劫舍 II

个人主页&#xff1a;兜里有颗棉花糖 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 兜里有颗棉花糖 原创 收录于专栏【手撕算法系列专栏】【LeetCode】 &#x1f354;本专栏旨在提高自己算法能力的同时&#xff0c;记录一下自己的学习过程&#xff0c;希望…

RTC 时间、闹钟

实时时钟RTC是一个独立的定时器。RTC模块拥有一个连续计数的计数器&#xff0c;在软件配置下&#xff0c;可以提供时钟日历的功能。修改计数器的值可以重新设置当前时间和日期 RTC还包含用于管理低功耗模式的自动唤醒单元。 在掉电情况下 RTC仍可以独立运行 只要芯片的备用电源…

.balckhoues-V-XXXXXXX勒索病毒数据怎么处理|数据解密恢复

导言&#xff1a; 勒索病毒已经成为网络犯罪者最喜爱的武器之一。其中&#xff0c;.balckhoues-V-XXXXXXX勒索病毒以其阴险的特性而著称。本文91数据恢复将深入探讨这个神秘的数字威胁&#xff0c;解析它的工作原理&#xff0c;以及如何保护自己免受其侵害。如果您正在经历勒索…

计算机毕业设计 基于SSM的民宿推荐系统的设计与实现 Java实战项目 附源码+文档+视频讲解

博主介绍&#xff1a;✌从事软件开发10年之余&#xff0c;专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精…

uniapp实现微信小程序隐私协议组件封装

uniapp实现微信小程序隐私协议组件封装。 <template><view class"diygw-modal basic" v-if"showPrivacy" :class"showPrivacy?show:" style"z-index: 1000000"><view class"diygw-dialog diygw-dialog-modal bas…

计算机竞赛 车道线检测(自动驾驶 机器视觉)

0 前言 无人驾驶技术是机器学习为主的一门前沿领域&#xff0c;在无人驾驶领域中机器学习的各种算法随处可见&#xff0c;今天学长给大家介绍无人驾驶技术中的车道线检测。 1 车道线检测 在无人驾驶领域每一个任务都是相当复杂&#xff0c;看上去无从下手。那么面对这样极其…

VBA学习方法3.2.4:VBA中的查找操作

【分享成果&#xff0c;随喜正能量】一旦被欲望的毒箭射中&#xff0c;心会变得麻木&#xff0c;失去觉知&#xff0c;甚至疯狂。如果没有及时清醒&#xff0c;就会如同爱美的飞蛾扑向火焰、贪吃的鱼儿被鱼钩钓起&#xff0c;当发现自己身处险境时&#xff0c;后悔也来不及了。…

我的第一个react.js 的router工程

react.js 开发的时候&#xff0c;都是针对一个页面的&#xff0c;多个页面就要用Router了&#xff0c;本文介绍我在vscode 下的第一个router 工程。 我在学习react.js 前端开发&#xff0c;学到router 路由的时候有点犯难了。经过1-2天的努力&#xff0c;终于完成了第一个工程…

spring-cloud-alibaba-dubbo-issues1805修复

spring-cloud-alibaba-dubbo-issues1805修复 文章目录 [toc] 1.官方信息2.版本代码对比3.修改尝试4.验证5.总结 这个issue就是我这前写了那两篇文章的那个issue Dubbo重启服务提供者或先启动服务消费者后启动服务提供者&#xff0c;消费者有时候会出现找不到服务的问题及解决 …

Java泛型理解

什么是泛型&#xff1f; 我们都知道 Java 中有形参和实参之分&#xff0c;是在定义函数名和函数体的时候使用的参数,目的是用来接收调用该函数时传入的参数&#xff0c;其本身没有确定的值。在调用函数时&#xff0c;实参将赋值给形参。 而泛型是一种参数化的类型&#xff08…

以太网基础学习(四)——IP协议

一 、IP协议概述 IP&#xff08;Internet Protocol&#xff0c;互联网协议&#xff09;是互联网通信的基础协议&#xff0c;它负责将数据包从源地址传输到目的地址。IP协议定义了如何封装数据包&#xff0c;如何寻址数据包以及如何路由数据包&#xff0c;它是随着互联网的出现而…

Pytorch基础:Tensor的reshape方法

相关阅读 Pytorch基础https://blog.csdn.net/weixin_45791458/category_12457644.html?spm1001.2014.3001.5482 在Pytorch中&#xff0c;reshape是Tensor的一个重要方法&#xff0c;它与Numpy中的reshape类似&#xff0c;用于返回一个改变了形状但数据和数据顺序和原来一致的…

linux入门---信号的理解

目录标题 如何理解计算机中的信号如何查看计算机中的信号初步了解信号的保存和发送如何向目标进程发送信号情景一&#xff1a;使用键盘发送信号情景二&#xff1a;系统调用发送信号情景三&#xff1a;硬件异常产生信号情景四&#xff1a;软件条件产生信号 核心转储信号的两个问…

单调栈---基础数据结构与算法

简介 栈 (stack) 又名堆栈&#xff0c;是一种数据结构&#xff0c;向一个栈插入新元素又称作进栈、入栈或压栈&#xff0c;从一个栈删除元素又称作出栈或退栈。 栈是一种只允许在表尾进行插入和删除操作的线性表&#xff0c;也就是我们所说的后进先出&#xff0c;我们把栈想象…

【Linux】ping命令详解

目录 一、ping概述 二、Ping用法 三、ping参数详解 四、使用 五、Wireshark抓取ICMP请求应答消息 一、ping概述 ping 命令用于测试与目标主机之间的连接。它向目标主机发送一个ICMP&#xff08;Internet Control Message Protocol&#xff09;Internet控制报文协议回显请求…

知识图谱小白入门(1):neo4j的安装与CQL的使用

文章目录 序一、安装neo4j1.1 下载neo4j1.2 安装JDK1.3 BUG&#xff1a;dbms failed to start 二、CQL语法2.1 CQL语法创建节点查询节点创建关系查询关系2.2 习题 习题答案 序 知识图谱&#xff0c;是一种实体间的信息与关系知识的网状结构&#xff0c;借用图论中点与边的概念…

SLAM从入门到精通(用python实现机器人运动控制)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 在ROS下面&#xff0c;开发的方法很多&#xff0c;可以是c&#xff0c;可以是python。大部分接口操作类的应用&#xff0c;其实都可以用python来开…

「专题速递」数字人直播带货、传统行业数字化升级、远程协作中的低延时视频、地产物业中的通讯终端...

音视频技术作为企业数字化转型的核心要素之一&#xff0c;已在各行各业展现出广泛的应用和卓越的价值。实时通信、社交互动、高清视频等技术不仅令传统行业焕发新生&#xff0c;还为其在生产、管理、服务提供与维护等各个领域带来了巨大的助力&#xff0c;实现了生产效率和服务…

postgresql-聚合函数增强功能

postgresql-聚合函数增强功能 按季度统计入职员工 按季度统计入职员工 select -- extract截取&#xff0c;按季度进行统计入职员工总数 extract(year from hire_date), count(*) filter(where extract(quarter from hire_date) 1) "第一季度", count(*) filter(wh…