【Unity】常见的角色移动旋转

在Unity 3D游戏引擎中,可以使用不同的方式对物体进行旋转。以下是几种常见的旋转方式:
-
欧拉角(Euler Angles):欧拉角是一种常用的旋转表示方法,通过绕物体的 X、Y 和 Z 轴的旋转角度来描述物体的旋转。在Unity中,可以通过修改物体的 transform.eulerAngles 属性来进行欧拉角旋转。
-
四元数(Quaternion):四元数是另一种常见的旋转表示方法,在Unity中经常用于插值和平滑旋转。使用四元数可以避免万向锁等问题,并提供更高效和准确的旋转计算,可以通过修改物体的 transform.rotation 属性来进行四元数旋转。
-
轴角(Axis-Angle):轴角表示法使用一个单位向量来定义旋转轴,并使用旋转角度来描述旋转。在Unity中,可以使用 Quaternion.AngleAxis() 函数来创建一个轴角旋转,并通过修改物体的 transform.rotation 属性进行应用。
-
矩阵(Matrix):矩阵表示法通过使用旋转矩阵来描述旋转变换。在Unity中,可以通过修改物体的 transform.localRotation 属性或 transform.rotation 属性中的矩阵元素来进行矩阵旋转。
我们接下来实现下面2种方法来实现人物的旋转和移动
一:使用WADS进行移动旋转
代码实现:
using System; using System.Collections; using System.Collections.Generic; using UnityEditor; using UnityEngine;public class PlayerMove : MonoBehaviour {// Start is called before the first frame update//设置速度public float speed = 6f;Rigidbody rig;//动画Animator anim;//偏移量Vector3 moveMent;//跳起来的力public float Jump_AddForce = 300f;void Awake(){//获取刚体rig = GetComponent<Rigidbody>();//获取动画anim = GetComponent<Animator>();}// Update is called once per framevoid FixedUpdate(){// -1 1float h = Input.GetAxisRaw("Horizontal");float v = Input.GetAxisRaw("Vertical");//移动 横向和纵向Move(h, v);}void Move(float h, float v){//设置方向moveMent.Set(h, 0f, v);moveMent = moveMent.normalized * speed * Time.deltaTime;//通过刚体主键移动 对象rig.MovePosition(transform.position + moveMent);//移动动画bool isWalking = (h != 0 || v != 0);anim.SetBool("Run", isWalking);//旋转Vector3 dir = new Vector3(h, 0, v);if (dir != Vector3.zero){transform.rotation = Quaternion.LookRotation(dir);transform.Translate(Vector3.forward * speed * Time.deltaTime);}}
二:使用鼠标来控制人物的旋转,WASD移动
代码实现:
using System; using System.Collections; using System.Collections.Generic; using UnityEditor; using UnityEngine;public class PlayerMove : MonoBehaviour {// Start is called before the first frame update//设置速度public float Speed = 6f;Rigidbody RigidbodyPlayer;Animator animatorPlayer;//偏移量Vector3 moveMent;//地板LayerMask floorMask;//Vector3 playerToMouse;void Awake(){//获取刚体RigidbodyPlayer = GetComponent<Rigidbody>();//获取动画animatorPlayer = GetComponent<Animator>();//获取地板floorMask = LayerMask.GetMask("floor");}// Update is called once per framevoid FixedUpdate(){// -1 1float h = Input.GetAxisRaw("Horizontal");float v = Input.GetAxisRaw("Vertical");//移动 横向和纵向Move(h, v);//检测动画Animating(h, v);//角色旋转Turning();}void Move(float h, float v){//设置方向moveMent.Set(h, 0f, v);moveMent = moveMent.normalized * Speed * Time.deltaTime;//通过刚体主键移动 对象RigidbodyPlayer.MovePosition(transform.position + moveMent);}//移动动画void Animating(float h, float v){if (h != 0 || v != 0){animatorPlayer.SetBool("IsWaking", true);}else{animatorPlayer.SetBool("IsWaking", false);}}void Turning(){Ray cameraRay = Camera.main.ScreenPointToRay(Input.mousePosition);RaycastHit cameraHit;if (Physics.Raycast(cameraRay, out cameraHit, 100f, floorMask)){Vector3 playerToMouse = cameraHit.point - transform.position;playerToMouse.y = 0f;//旋转 四元素Quaternion newQraternion = Quaternion.LookRotation(playerToMouse);//角色刚体旋转RigidbodyPlayer.MoveRotation(newQraternion);}} }
最后
以上步骤就是实现角色的移动旋转。希望能对你们提供帮助!!!
看到的小伙伴一键三连一下吧,你们的支持让我更有动力去创作和分享,希望能一直为你们带来惊喜和收获。
![]()
相关文章:
【Unity】常见的角色移动旋转
在Unity 3D游戏引擎中,可以使用不同的方式对物体进行旋转。以下是几种常见的旋转方式: 欧拉角(Euler Angles):欧拉角是一种常用的旋转表示方法,通过绕物体的 X、Y 和 Z 轴的旋转角度来描述物体的旋转。在Un…...
今天的小结
1、冒泡排序 冒泡排序(Bubble Sort)是一种简单的排序算法,它重复地遍历待排序的元素列表,比较相邻的元素并交换它们的位置,直到整个列表排序完成。冒泡排序的基本思想是通过不断交换相邻元素,将最大&#…...
了解 Socks 协议:它的过去、现在与未来
在网络世界的江湖中,有一名叫做 Socks 协议的高手,它凭借着一招“代理”绝技,在网络安全领域独步天下。今天,就让我们来了解一下这位神秘高手的过去、现在和未来。 在过去,互联网世界的江湖可谓是风起云涌,…...
小谈静态类和单例模式
静态类(Static Class)和单例(Singleton)都是在编程中用于实现特定类型的设计模式或代码组织方式。它们在不同的情境下有不同的用途和特点。 静态类(Static Class) 静态类是一种类,它的方法和属…...
LeetCode解法汇总823. 带因子的二叉树
目录链接: 力扣编程题-解法汇总_分享记录-CSDN博客 GitHub同步刷题项目: https://github.com/September26/java-algorithms 原题链接:力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台 描述: 给出一个含…...
TypeScript的变量声明的各种方式
TypeScript是一种静态类型的JavaScript超集,它为JavaScript代码提供了类型检查和更好的代码组织结构。在TypeScript中,变量声明是非常重要的,因为它们定义了变量的类型和范围。本文将详细介绍TypeScript的变量声明,并通过代码案例…...
c++ lambda
Lambda Lambda 表达式一般用于定义匿名函数,使得代码更加灵活简洁,优点: 声明式编程风格:就地匿名定义目标函数或函数对象,不需要额外写一个命名函数或者函数对象。以更直接的方式去写程序,好的可读性和可…...
泊松回归和地理加权泊松回归
01 泊松回归 泊松回归(Poisson Regression)是一种广义线性模型,用于建立离散型响应变量(计数数据)与一个或多个预测变量之间的关系。它以法国数学家西蒙丹尼泊松(Simon Denis Poisson)的名字命名,适用于计算“事件发生次数”的概率,比如交通事故发生次数、产品缺陷数…...
【数学建模竞赛】各类题型及解题方案
评价类赛题建模流程及总结 建模步骤 建立评价指标->评价体系->同向化处理(都越多越好或越少越少)->指标无量纲处理 ->权重-> 主客观->合成 主客观评价问题的区别 主客观概念主要是在指标定权时来划分的。主观评价与客观评价的区别…...
【12期】谈一谈redis两种持久化机制的区别?
Redis两类持续性的方法 RDB方案可以在规定时间间隔内创建数据集的时间点快照。 AOF方案记录了服务器执行的所有写操作命令,并在服务器启动时通过重新执行这些命令来还原数据集。AOF文件完全遵循Redis协议格式保存,新命令会被追加到文件末尾。此外&#…...
Lambda 编程(Kotlin)一
学习记录,以下为个人理解 知识点: Lambda的定义:允许你把代码块当作参数传递给函数Lambda的语法约定:如果lambda 表达式是函数调用的最后一个实参,它可以放到括号的外边当lambda表达式时函数唯一的实参时,…...
网络字节序——TCP接口及其实现简单TCP服务器
网络字节序——TCP接口及其实现简单TCP服务器 文章目录 网络字节序——TCP接口及其实现简单TCP服务器简单TCP服务器的实现1. 单进程版:客户端串行版2. 多进程版:客户端并行版netstat查看网络信息3.多线程版:并行执行log.hpp 守护进程fg、bg s…...
RxJS如何根据事件创建Observable对象?
RxJS提供了一些用来创建Observable对象的函数,我们可以根据事件、定时器、Promise,AJAX等来创建Observable对象。 下面是根据事件创建Observable对象的几个例子。 this.outsideClick$ fromEvent(document, click).subscribe((event: MouseEvent) > …...
网站常见安全漏洞 | 青训营
Powered by:NEFU AB-IN 文章目录 网站常见安全漏洞 | 青训营 网站基本组成及漏洞定义服务端漏洞SQL注入命令执行越权漏洞SSRF文件上传漏洞 客户端漏洞开放重定向XSSCSRF点击劫持CORS跨域配置错误WebSocket 网站常见安全漏洞 | 青训营 网站常见安全漏洞-网站基本组成及漏洞定义…...
vue2使用 vis-network 和 vue-vis-network 插件封装一个公用的关联关系图
效果图: vis组件库:vis.js vis-network中文文档:vis-network 安装组件库: npm install vis-network vue-vis-network 或 yarn add vis-network vue-vis-network 新建RelationGraph.vue文件: <template><…...
给定一个 m x n 的矩阵,如果一个元素为 0 ,则将其所在行和列的所有元素都设为 0 。
LeetCode第73题矩阵置零 1.思路: 想到一个开辟一点空间来解决方法,使用哈希集。就是使用一个哈希集(row和col)来储存数组中的元素为0的下标。然后再遍历,整个二维数组,在哈希集中存在对应的下标,…...
java-初识Servlet,Tomcat,JDBC
文章目录 前言一、ServletServlet 生命周期Servlet 实例Servlet 过滤器 二、TomcatJDBCJDBC连接数据库实例 总结 前言 java入门须知的重要概念/名词/技术 等 一、Servlet Servlet是Java Web开发中的一个核心组件,它是基于Java语言编写的服务器端程序,…...
SpringBoot+mybatis+pgsql多个数据源配置
一、配置文件 jdk环境:1.8 配置了双数据源springbootdruidpgsql,application.properties配置修改如下: #当前入库主数据库 spring.primary.datasource.typecom.alibaba.druid.pool.DruidDataSource spring.primary.datasource.driver-class…...
视频汇聚/视频监控管理平台EasyCVR接入海康SDK协议后无法播放该如何解决?
开源EasyDarwin视频监控/安防监控/视频汇聚EasyCVR能在复杂的网络环境中,将分散的各类视频资源进行统一汇聚、整合、集中管理,在视频监控播放上,视频安防监控汇聚平台可支持1、4、9、16个画面窗口播放,可同时播放多路视频流&#…...
MQ消息队列(主要介绍RabbitMQ)
消息队列概念:是在消息的传输过程中保存消息的容器。 作用:异步处理、应用解耦、流量控制..... RabbitMQ: SpringBoot继承RabbitMQ步骤: 1.加入依赖 <dependency><groupId>org.springframework.boot</groupId&g…...
宁德时代2026春招开启:6000+offer,这一轮机会在扩大
很多人现在还在犹豫一个问题:新能源是不是已经开始降温了?现在再投,还能不能拿到好的岗位?但从今年的招聘情况来看,趋势其实很清晰:岗位没有减少,而是在结构性增加。尤其是动力电池、储能、电池…...
Java继承详解:从基础到实战,吃透面向对象核心特性
哈喽,各位Java学习者!今天咱们深入拆解面向对象编程(OOP)的三大核心特性之一——继承。作为Java开发的基础重点,继承不仅能帮我们实现代码复用、简化开发,更是后续理解多态、抽象类、接口的关键前提。不管你…...
STM32F407ZGT6最小系统:从原理图到PCB的实战设计解析
1. STM32F407ZGT6最小系统设计入门 第一次接触STM32F407ZGT6最小系统设计时,我也被各种专业术语和复杂的电路图搞得晕头转向。但经过几个项目的实战后,我发现只要掌握几个关键模块,设计一个稳定可靠的最小系统其实并不难。STM32F407ZGT6是STM…...
3个实战场景×5个核心技巧:Umi-OCR本地化部署与效率提升完全指南
3个实战场景5个核心技巧:Umi-OCR本地化部署与效率提升完全指南 【免费下载链接】Umi-OCR OCR software, free and offline. 开源、免费的离线OCR软件。支持截屏/批量导入图片,PDF文档识别,排除水印/页眉页脚,扫描/生成二维码。内置…...
AI中混淆矩阵及其核心评估指标案例
AI中混淆矩阵及其核心评估指标案例...
保姆级教程:在PVE 8.3上搞定Windows 11和Server 2025的VirtIO驱动安装与优化
PVE 8.3虚拟化环境下的Windows系统性能优化全攻略 在虚拟化技术日益普及的今天,Proxmox VE(PVE)作为开源的虚拟化平台,因其稳定性和灵活性受到众多技术爱好者和企业用户的青睐。然而,许多用户在PVE上部署Windows系统时…...
Peroxidase-conjugated AffiniPure Goat Anti-Human IgG:高酶活,低背景,精准定量人源抗体
在现代生命科学研究中,抗体是实现特定分子识别和信号检测的核心工具。其中,二抗作为连接一抗与检测系统的重要桥梁,其特异性和灵敏度直接影响实验结果的准确性与可靠性。Peroxidase-conjugated AffiniPure Goat Anti-Human IgG, Fcγ Fragmen…...
2026年4月怎么搭建OpenClaw?腾讯云保姆级5分钟安装及百炼APIKey配置方法
2026年4月怎么搭建OpenClaw?腾讯云保姆级5分钟安装及百炼APIKey配置方法。OpenClaw(原Clawdbot)作为2026年主流的AI自动化助理平台,可通过阿里云轻量服务器实现724小时稳定运行,并快速接入钉钉,让AI在企业群…...
C++手动实现共享智能指针my_shared_ptr|引用计数+删除器+完整可运行代码
1.共享智能指针的概念 共享型智能指针就是做出一个像JAVA中垃圾回收器,并且可以运用到所有资源,heap内存和系统资源都可以使用的系统。 shared_ptr实现了共享所有权(shared ownership)方式来管理资源对象,这意味没有一个特定的shared_ptr拥有资源对象。相反,这些指向同一…...
Delphi网络编程实战:UDP通信与多线程网络优化详解
前两篇文章分别讲解了Delphi中基于Indy组件的TCP点对点通信、HTTP/HTTPS接口交互,覆盖了可靠连接、Web对接两大常用场景。本篇将深入讲解UDP通信,同时补充多线程网络编程、数据传输防护、常见故障排查等进阶内容,补齐Delphi网络开发的核心模块…...
