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.hqwc.cn/news/345761.html

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

相关文章

STM32——OLED实验

1.OLED简介 OLED&#xff0c;即有机发光二极管 OLED引脚说明 引脚说明&#xff1a; 1、CS&#xff1a;OLED片选信号&#xff08;低电平有效&#xff09; 2、WR&#xff1a;向OLED写入数据 3、RD&#xff1a;向OLED读取数据 4、D[7:0]&#xff1a;8位双向数据线&#xff0c;有…

API Monitor简易使用教程 监控Windows dll调用 监控Windows API调用 查看函数名,参数类型,参数,返回值

先看效果&#xff0c;可以显示所有dll及windows api的指定函数调用&#xff0c;以及传递的参数查看与修改。 官网下载 也有教程 我验证使用方法 1、API Filter窗口&#xff1a;选定要监听的dll函数或windows API&#xff0c;可以打断点 选中并右键勾上Breakpoint 选 Before C…

线程安全--互斥锁

文章目录 一.线程安全问题读取无效(脏)数据丢失更新线程安全的保证--操作的原子性 二.互斥锁及其实现原理互斥锁的实现原理pthread线程库提供的锁操作 三.死锁问题 一.线程安全问题 当多个线程并发地对同一个共享资源进行修改操作时,可能会引发数据读写错误(比如读取无效(脏)数…

【Databend】行列转化:一行变多行和简单分列

文章目录 数据准备和需求生成序列和分隔函数根据分隔符变多行JSON 数据简单分列总结 数据准备和需求 行列转化在实际工作中很常见&#xff0c;其中最常见的有一行变多行&#xff0c;有下面一份数据&#xff1a; drop table if exists fact_suject_data; create table if not …

设计模式之迭代器模式【行为型模式】

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档> 学习的最大理由是想摆脱平庸&#xff0c;早一天就多一份人生的精彩&#xff1b;迟一天就多一天平庸的困扰。各位小伙伴&#xff0c;如果您&#xff1a; 想系统/深入学习某…

linux搭建SRS服务器

linux搭建SRS服务器 文章目录 linux搭建SRS服务器SRS说明实验说明搭建步骤推流步骤查看web端服务器拉流步骤final SRS说明 SRS&#xff08;simple Rtmp Server&#xff09;,是一个简单高效的实时视频服务器&#xff0c;支持RTMP/WebRTC/HLS/HTTP-FLV/SRT, 是国人自己开发的一款…

“所有伙食开销统计:轻松查看,智能管理你的餐饮支出“

你是否经常为伙食开销感到困扰&#xff0c;不知道如何有效控制和管理&#xff1f;现在&#xff0c;有了我们的伙食开销统计工具&#xff0c;这些问题将得到轻松解决&#xff01; 首先第一步&#xff0c;我们要进入晨曦记账本并在上方功能栏里选择“查看方式”。并在弹出来的列表…

c++算法之枚举

目录 解空间的类型 循环枚举解空间 例题 特别数的和 输入格式 输出格式 输入样例&#xff1a; 输出样例&#xff1a; 解 例题 反倍数 问题描述 输入格式 输出格式 样例输入 样例输出 解 例题 找到最多的数 解 枚举算法是一种基本的算法思想&#xff0c;它通过…

写一个文字滑动切换样式效果

<template><div class"mainrouter centerWindi"><h1>2024,马上暴富</h1></div> </template> <style lang"scss"> /* 居中 */ .centerWindi {apply flex justify-center items-center;text-align: center; }/* 路…

【Linux笔记】进程等待与程序替换

一、进程的终止 1、进程退出码 在讲解进程的终止之前&#xff0c;先要普及一下进程的退出码概念。 我们父进程之所以要创建子进程&#xff0c;就是为了让子进程运行不一样的任务&#xff0c;那么对于子进程执行的这个任务执行完毕后的结果是否正确或者是否出差错&#xff0c…

宝塔面板安装MySQL8数据库

第一步&#xff1a;搜索mysql 第二步: 点击安装 我这里选择安装8版本 第三步&#xff1a;给宝塔配置mysql防火墙 第四步&#xff1a;修改数据库密码 第五步&#xff1a;想要使用navicat连接 需要修改root的权限 &#xff08;1&#xff09;使用secureCRT先登录mysql (2) 输入u…

网络——华为与华三

作者简介&#xff1a;一名云计算网络运维人员、每天分享网络与运维的技术与干货。 公众号&#xff1a;网络豆云计算学堂 座右铭&#xff1a;低头赶路&#xff0c;敬事如仪 个人主页&#xff1a; 网络豆的主页​​​​​ 写在前面 大家好&#xff0c;我是网络豆&#xff0…