Unity摇杆+键鼠控制位移、旋转

1、位移

首先我们找到两张图片,一个大圆一个小圆,像这样:

结构是这样的:

然后,新建一个场景,用胶囊去做玩家,摄像机在胶囊下,并且在场景中放两个cube作为参照物

像这样搭好后,我们编写脚本,用ScrollRect去实现摇杆,新建ScrollCircle.cs脚本,继承ScrollRect:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.UI;public class ScrollCircle : ScrollRect
{float radius = 0;public Vector2 output;void Start(){output = new Vector2();radius = (transform as RectTransform).rect.size.x * 0.5f;}public override void OnDrag(PointerEventData eventData){base.OnDrag(eventData);Vector2 pos = content.anchoredPosition;if (pos.magnitude > radius){pos = pos.normalized * radius;SetContentAnchoredPosition(pos);}}public override void OnEndDrag(PointerEventData eventData){base.OnEndDrag(eventData);content.localPosition = Vector3.zero;}void Update(){output = content.localPosition / radius;}}

编写完后,将脚本挂在交互区,然后参数按这样设置:

设置完后我们运行场景,会发现摇杆已经做好了,同时,我们开始编写位移等脚本,位移脚本也很简单,只需要把ScrollCircle里的output值拿到就行,新建脚本MoveScript.cs

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UIElements;public class MoveScript : MonoBehaviour
{public ScrollCircle scroll;  public Transform Player;  public float MoveSpeed = 10f; public Vector3 MoveVec3;private float horizontal;private float vertical;void Update(){if (Input.touchCount == 0){// 键盘输入horizontal = Input.GetAxis("Horizontal");vertical = Input.GetAxis("Vertical");}else{scroll.gameObject.SetActive(true);// 摇杆输入horizontal = scroll.output.x;vertical = scroll.output.y;}Vector3 moveVector = new Vector3(horizontal, 0f, vertical) * MoveSpeed * Time.deltaTime;Player.Translate(moveVector);}
}

将位移MoveScript脚本挂在Player上,并且像我这样设置

这时候运行场景会发现摇杆没用,其实这不是摇杆没用,只是我们脚本写了限制条件,只有手指才能触发摇杆,如果有不需要这个判定的可以删除

但是这时候我们又想测试怎么办,很简单,我们找到game下拉框,选择Simulator

窗口就会变成这样:

然后选择你想测试的机型

选择好后再运行场景,会发现我们的摇杆有用了,还记得我们的MoveScript脚本吗,里面我们写了两个交互,一个是摇杆,一个是键盘控制,当我们的视图选择了Simulator后,能够生效的只有摇杆,因为这个是模拟手机的过程,当我们视图选择Game后,我们则回到了键盘控制,这时按下wasd才会生效

2、旋转

新建RotateScript脚本

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.EventSystems;public class RotateScript : MonoBehaviour
{public float rotationSpeed = 1f;private Vector2 lastTouchPosition;[SerializeField] ScrollCircle ScrollCircle;private void Update(){if (Input.touchCount == 0){//鼠标的旋转}else{Rotaes2();}}/// <summary>/// 摇杆旋转/// </summary>void Rotaes(){float x = ScrollCircle.output.x;float xRotationAngle = x * 50 * Time.deltaTime;Vector3 xRotationAxis = transform.up;transform.Rotate(xRotationAxis, xRotationAngle, Space.World);}/// <summary>/// 手指旋转/// </summary>void Rotaes2(){Touch touch;if (Input.touchCount == 1){touch = Input.GetTouch(0);}else{touch = Input.GetTouch(Input.touchCount - 1);}if (touch.phase == TouchPhase.Began){lastTouchPosition = touch.position;}else if (touch.phase == TouchPhase.Moved){Vector2 delta = touch.position - lastTouchPosition;transform.Rotate(Vector3.up, delta.x * rotationSpeed, Space.World);lastTouchPosition = touch.position;}}
}

然后我们将脚本拖给Player

运行场景时,我们成功了,修改场景,将摇杆复制一份出来,作为旋转的摇杆:

打开RotateScript脚本,将方法修改一下

然后把旋转摇杆拖给RotateScript脚本

运行场景,我们的摇杆也有用了,这两者的共存本文暂时不写,因为涉及UI交互的判定,需要根据实际情况去修改

接下来我们把鼠标旋转给补上,修改RotateScript脚本

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.EventSystems;public class RotateScript : MonoBehaviour
{public float rotationSpeed = 1f;private Vector2 lastTouchPosition;[SerializeField] ScrollCircle ScrollCircle;private void Update(){if (Input.touchCount == 0){//鼠标的旋转MouseRotate();}else{Rotaes();}}void MouseRotate(){if (Input.GetMouseButton(0)){float mouseX = Input.GetAxis("Mouse X");float mouseY = Input.GetAxis("Mouse Y");float xRotationAngle = mouseX * rotationSpeed;float yRotationAngle = mouseY * rotationSpeed;transform.Rotate(Vector3.up, xRotationAngle, Space.World);transform.Rotate(Vector3.right, -yRotationAngle, Space.Self);}}/// <summary>/// 摇杆旋转/// </summary>void Rotaes(){float x = ScrollCircle.output.x;float xRotationAngle = x * 50 * Time.deltaTime;Vector3 xRotationAxis = transform.up;transform.Rotate(xRotationAxis, xRotationAngle, Space.World);}/// <summary>/// 手指旋转/// </summary>void Rotaes2(){Touch touch;if (Input.touchCount == 1){touch = Input.GetTouch(0);}else{touch = Input.GetTouch(Input.touchCount - 1);}if (touch.phase == TouchPhase.Began){lastTouchPosition = touch.position;}else if (touch.phase == TouchPhase.Moved){Vector2 delta = touch.position - lastTouchPosition;transform.Rotate(Vector3.up, delta.x * rotationSpeed, Space.World);lastTouchPosition = touch.position;}}
}

 回到场景中,将视图切换为Game,运行

至此,本文结束,我们下次见! 

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

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

相关文章

探索商超货架场景目标检测性能,基于YOLOv8【n/s/m/l/x】全系列参数模型开发构建商超货架场景下亨氏米粉食品种类检测识别系统

在前面的系列博文中&#xff0c;我们陆续应用实践开发了很多有趣的项目&#xff0c;但是在密集排布场景下如商超购物场所内货架上货物种类目标检测模型的开发我们则少有涉及&#xff0c;正值周末&#xff0c;本文的主要目的就是想要实践构建这一场景下的目标检测模型&#xff0…

FPGA之初探

FPGA的构成 基本逻辑单元CLB CLB是FPGA的基本逻辑单元&#xff0c; 一个 CLB 包括了 2 个 Slices&#xff0c;所以知道Slices的数量就可以知道FPGA的“大概”逻辑资源容量了。一个 Slice 等于 4 个6输入LUT8个触发器(flip-flop)算数运算逻辑&#xff0c;每个 Slice 的 4 个触发…

AI与编程学习

在C语言中&#xff0c;指针通常与字符数组或字符串打交道时会涉及到ASCII码的转换&#xff0c;而不是用于表现多位数的第一位。48这个值对应的是ASCII码表中数字字符0的编码。 如果你有一个表示多位数的字符数组&#xff0c;例如&#xff1a; c char number[] "1234&qu…

【DC快速上手教程--1 Setup the DC】

DC快速上手教程--1 Setup the DC 0 Intro1 DC Demo 本篇系列教程介绍总结DC Flow&#xff0c;为了不涉密&#xff0c;在这里以DC labs为Demo做一个入门的介绍&#xff1b;目标&#xff1a;用起来EDA 工具是最基础也是最简单的&#xff1b;重点是如何去分析报告&#xff0c;依据…

vue3实现动态侧边菜单栏的几种方式总结

基于自建json数据的动态侧边菜单栏 后端接口json数据 src/api/menuList.js const menuList [{url: ,name: 人员管理,icon: icon-renyuan,menuId: 1,children: [{url: /user,name: 用户管理,icon: icon-jurassic_user,menuId: 1001,children: []},{url: /role,name: 角色管…

探索短链接:让网络分享更便捷

短链接是一种将长网址缩短为简洁形式的编码&#xff0c;它在互联网领域具有广泛的应用。本文将从多个方面介绍短链接的原理、类型、优势及应用场景&#xff0c;帮助您深入了解这一重要的网络技术。 短链接 | 一个覆盖广泛主题工具的高效在线平台(amd794.com) https://amd794.…

【LabVIEW FPGA 编程入门】使用FPGA IO进行编程

1.在项目中新建一个VI&#xff0c;命名为FPGA IO Test。 2. 可以直接将项目中的FPGA IO拖入程序框图中。 FPGA IO的类型&#xff1a; 数字线&#xff1a; 数字端口&#xff1a; 模拟IO&#xff1a; 其他&#xff1a; 3.如果新增加了FPGA资源&#xff0c;不是创建项目时扫描到的…

Linux centos stream9 parted

在Linux中&#xff0c;常用的磁盘管理工具包括 fdisk、parted、gdisk 等。它们可以用于创建、删除、调整分区、查看分区表等操作。 传统的MBR分区表(即主引导记录)大家都很熟悉&#xff0c;是过去我们使用windows时常见的。所支持的最大卷2T&#xff0c;且对分区有限制&#x…

漏洞复现-金和OA GetAttOut接口SQL注入漏洞(附漏洞检测脚本)

免责声明 文章中涉及的漏洞均已修复&#xff0c;敏感信息均已做打码处理&#xff0c;文章仅做经验分享用途&#xff0c;切勿当真&#xff0c;未授权的攻击属于非法行为&#xff01;文章中敏感信息均已做多层打马处理。传播、利用本文章所提供的信息而造成的任何直接或者间接的…

Linux配置JAR包为服务实现自启动

一、实现bash脚本 1.1 绘图工具 绘图需安装idea的插件plantUML-Integration 只需要上图一个就可以&#xff0c;别的也不需要装。 启动服务的逻辑如下 关闭服务的逻辑如下 1.2 逻辑实现 在/root路径下创建entrance文件&#xff0c;实现逻辑如下 #!/usr/bin/env bash # 2>…

数学建模.皮尔逊相关系数假设检验

一、步骤 查表找临界值 二、更好的方法 三、使用条件 作图可以使用spss 这个图对不对还不好说&#xff0c;因为还没进行正态分布的验证 四、正态分布验证 &#xff08;1&#xff09;JB检验 所以之前的数据的那个表是错的&#xff0c;因为不满足正态分布 &#xff08;2&#xff…

设置了uni.chooseLocation,小程序中打不开

设置了uni.chooseLocation&#xff0c;在小程序打不开&#xff0c;点击没反应&#xff0c;地图显现不出来&#xff1b; 解决方案&#xff1a; 1.Hbuilder——微信开发者工具路径没有配置 打开工具——>设置 2.微信小程序服务端口没有开 解决方法&#xff1a;打开微信开发…

[Linux 进程(三)] 进程优先级,进程间切换,main函数参数,环境变量

文章目录 1、进程优先级1.1 Linux下查看进程优先级1.2 Linux 进程优先级的修改PRI and NItop命令配合操作更改优先级 1.3 竞争 独立 并行 并发 2、进程间切换3、Linux2.6内核进程调度队列3.1 活跃进程3.2 过期进程 4 main函数参数 — 命令行参数4.1 利用main函数的参数实现一个…

强化学习应用(一):基于Q-learning的物流配送路径规划研究(提供Python代码)

一、Q-learning算法简介 Q-learning是一种强化学习算法&#xff0c;用于解决基于马尔可夫决策过程&#xff08;MDP&#xff09;的问题。它通过学习一个值函数来指导智能体在环境中做出决策&#xff0c;以最大化累积奖励。 Q-learning算法的核心思想是使用一个Q值函数来估计每…

在CentOS上设置和管理静态HTTP网站的版本控制

在CentOS上设置和管理静态HTTP网站的版本控制是一项重要的任务&#xff0c;它可以帮助您跟踪和回滚对网站所做的更改&#xff0c;确保数据的一致性和完整性。以下是在CentOS上设置和管理静态HTTP网站的版本控制的步骤&#xff1a; 安装版本控制系统在CentOS上安装Git或其他版本…

dcat admin框架开发前台

前言 dcat admin框架是一款后台框架&#xff0c;我们需要使用laravel开发前台框架&#xff0c;dcat admin本身基于laravel&#xff0c;没必要在重新创建前台项目&#xff0c;这篇文章记录我的开发过程。 开发过程 1. 迁移数据库(非必要) 对于dcat admin来说本身存在一个后台…

GPT-4V的图片识别和分析能力原创

GPT-4V是OpenAI开发的大型语言模型&#xff0c;是GPT-4的升级版本。GPT-4V在以下几个方面进行了改进&#xff1a; 模型规模更大&#xff1a;GPT-4V的参数量达到了1.37T&#xff0c;是GPT-4的10倍。 训练数据更丰富&#xff1a;GPT-4V的训练数据包括了1.56T的文本和代码数据。 …

PyCharm连接服务器 - 2

文章目录 PyCharm连接服务器-21.如何连接服务器&#xff1f;2.如何在终端窗口打开SSH连接&#xff1f;3.Terminal终端出现中文乱码的解决办法&#xff1f;4.如何查看远程服务器的树目录结构&#xff1f;5.如何配置代码同步&#xff1f;6.如何为项目配置远程服务器中的python解释…

第5章案例课:部署Tomcat及其负载均衡

这个实验需要3台虚拟机 192.168.9.40 9.31 9.32 去FTP 下载软件包 192.168.9.40 和 192.168.9.31 都要这里面的配置[rootnode1 ~]# mount /dev/cdrom /mnt/ //挂载[rootnode1 ~]# rpm -ivh /mnt/Packages/ftp-0.17-67.el7.x86_64.rpm //下载 FTP 软件包[roo…

构建 Maven 项目时可能遇到的问题

文章目录 构建 Maven 项目时可能遇到的问题1. Maven 自动下载依赖后&#xff0c;在本地仓库中找不到2. 运行时报错如下&#xff1a;Error: java 不支持发行版本 53. 创建 Maven 项目后 pom.xml 文件为空4. 在 Settings 中 Update 了阿里云远程仓库&#xff0c;导致整个项目不能…