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

2024-01-14 15:52

本文主要是介绍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,运行

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

这篇关于Unity摇杆+键鼠控制位移、旋转的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/605700

相关文章

SpringBoot请求参数接收控制指南分享

《SpringBoot请求参数接收控制指南分享》:本文主要介绍SpringBoot请求参数接收控制指南,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Spring Boot 请求参数接收控制指南1. 概述2. 有注解时参数接收方式对比3. 无注解时接收参数默认位置

Spring Security+JWT如何实现前后端分离权限控制

《SpringSecurity+JWT如何实现前后端分离权限控制》本篇将手把手教你用SpringSecurity+JWT搭建一套完整的登录认证与权限控制体系,具有很好的参考价值,希望对大家... 目录Spring Security+JWT实现前后端分离权限控制实战一、为什么要用 JWT?二、JWT 基本结构

Android实现两台手机屏幕共享和远程控制功能

《Android实现两台手机屏幕共享和远程控制功能》在远程协助、在线教学、技术支持等多种场景下,实时获得另一部移动设备的屏幕画面,并对其进行操作,具有极高的应用价值,本项目旨在实现两台Android手... 目录一、项目概述二、相关知识2.1 MediaProjection API2.2 Socket 网络

用js控制视频播放进度基本示例代码

《用js控制视频播放进度基本示例代码》写前端的时候,很多的时候是需要支持要网页视频播放的功能,下面这篇文章主要给大家介绍了关于用js控制视频播放进度的相关资料,文中通过代码介绍的非常详细,需要的朋友可... 目录前言html部分:JavaScript部分:注意:总结前言在javascript中控制视频播放

Python异步编程中asyncio.gather的并发控制详解

《Python异步编程中asyncio.gather的并发控制详解》在Python异步编程生态中,asyncio.gather是并发任务调度的核心工具,本文将通过实际场景和代码示例,展示如何结合信号量... 目录一、asyncio.gather的原始行为解析二、信号量控制法:给并发装上"节流阀"三、进阶控制

使用DrissionPage控制360浏览器的完美解决方案

《使用DrissionPage控制360浏览器的完美解决方案》在网页自动化领域,经常遇到需要保持登录状态、保留Cookie等场景,今天要分享的方案可以完美解决这个问题:使用DrissionPage直接... 目录完整代码引言为什么要使用已有用户数据?核心代码实现1. 导入必要模块2. 关键配置(重点!)3.

SpringSecurity 认证、注销、权限控制功能(注销、记住密码、自定义登入页)

《SpringSecurity认证、注销、权限控制功能(注销、记住密码、自定义登入页)》SpringSecurity是一个强大的Java框架,用于保护应用程序的安全性,它提供了一套全面的安全解决方案... 目录简介认识Spring Security“认证”(Authentication)“授权” (Auth

python之流程控制语句match-case详解

《python之流程控制语句match-case详解》:本文主要介绍python之流程控制语句match-case使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录match-case 语法详解与实战一、基础值匹配(类似 switch-case)二、数据结构解构匹

Spring Security注解方式权限控制过程

《SpringSecurity注解方式权限控制过程》:本文主要介绍SpringSecurity注解方式权限控制过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、摘要二、实现步骤2.1 在配置类中添加权限注解的支持2.2 创建Controller类2.3 Us

Python中如何控制小数点精度与对齐方式

《Python中如何控制小数点精度与对齐方式》在Python编程中,数据输出格式化是一个常见的需求,尤其是在涉及到小数点精度和对齐方式时,下面小编就来为大家介绍一下如何在Python中实现这些功能吧... 目录一、控制小数点精度1. 使用 round() 函数2. 使用字符串格式化二、控制对齐方式1. 使用