[方法] Unity 解决类《原神》角色移动方向问题

embedded/2024/10/20 13:32:40/

第三人称视角类的游戏有很多,比如《原神》、《崩坏:星穹铁道》、《剑星》、《绝地求生》等。这些游戏中,角色的移动方向取决于玩家的输入和相机的方向,例如玩家在键盘上按下D键,则角色会相对于相机方向向右移动,本篇文章就来揭晓这背后的实现方式。

1. 根据位移动画进行模型实际位移

假设目前我们的角色有一个胶囊体(characterController)和一个动画器(animator),并正在播放与位移相关的动画,那么,我们就要根据动画中的运动偏移来对模型进行一个实际的位移:

// [事件] 模型的动画带有位置的偏移
private void OnAnimatorMove()
{OnRootMotion(animator.deltaPosition, animator.deltaRotation);
}private void OnRootMotion(Vector3 deltaPosition, Quaternion deltaRotation)
{// 加入重力影响deltaPosition.y = gravity * Time.deltaTime;// 对玩家进行一个实际的位移characterController.Move(deltaPosition);
}

2. 处理模型位移方向

接下来,我们要根据玩家的输入相机的朝向来实现类似于《原神》的角色移动方向的机制,核心代码十分简单,并不需要我们亲自编写旋转算法,拿来即用:

void Update()
{// 玩家输入向量:x - 水平输入,y - 垂直输出Vector2 moveVector = PlayerInput.input.Player.Move.ReadValue<Vector2>().normalized;// 转向过渡float rotateSpeed = 5f;// -----------核心代码-----------// 将玩家的输入组合成一个三维向量Vector3 input = new Vector3(moveVector.x, 0, moveVector.y);// 拿到相机的朝向float y = Camera.main.transform.rotation.eulerAngles.y; // 求得角色的目标移动方向Vector3 targetDic = Quaternion.Euler(0, y, 0) * input;// 让模型旋转到目标方向transform.rotation = Quaternion.Slerp(transform.rotation, Quaternion.LookRotation(targetDic), Time.deltaTime * rotateSpeed);
}


http://www.ppmy.cn/embedded/30710.html

相关文章

搭建一个基于Python的Django框架后端、MySQL数据库、Vue前端以及Element UI组件库的图书管理系统

搭建一个基于Python的Django框架后端、MySQL数据库、Vue前端以及Element UI组件库的图书管理系统是一个复杂的项目,但我们可以将其分解为几个步骤来简化这个过程。以下是一个基本的步骤指南: 步骤 1: 安装并配置Python和Django 安装Python: 前往Python官网下载并安装适合您操…

VBA 读取sheet页中的指定区域数据,生成CSV文件

⏹待生成数据的sheet页 ⏹VBA代码 CreateObject("ADODB.Stream")&#xff1a;Microsoft ActiveX Data Objects (ADO) 库中的一个对象&#xff0c;用来处理文件的读写操作。Application.PathSeparator&#xff1a;系统默认的分隔符。Const startRowNum 4&#xff1a…

【doghead】ubuntu构建libuv

按照官方的文档2024年3月的版本。首先构建libuv 最终构建的还得了test 构建过程 zhangbin@DESKTOP-1723CM1:/mnt/d/XTRANS/thunderbolt/ayame/zhb-bifrost$ ls Bifrost-202403 README.md draw player-only worker 大神的带宽估计.png zhangbin@DESKTOP-1723CM1:/mnt/d/XTRANS/…

数据库[类型,基本概念,生活实例],登录mysql数据库的三种方式,修改sql编辑器界面样式及字体样式

数据库是按照特定方式组织起来的数据集合&#xff0c;它允许用户对数据进行高效的存储、检索和管理。数据库系统通常由两部分组成&#xff1a;数据库本身&#xff08;数据的物理存储&#xff09;和数据库管理系统&#xff08;DBMS&#xff0c;用于创建和管理数据库的软件&#…

Oracle系统参数调整【数据库实例优化系列一】

Oracle实例是:内存组件和相关的后台进程组成。这些内存组件提高了数据库的运行,而后台进程负责管理系统和内存组件。 一、SGA和实例优化 Oracle的SGA是指的系统全局区。sga是数据库运行期间使用的一段公有内存,即数据库用户都可以访问这段内存,包括: 共享池、重做日志缓冲…

第二十八章:Java中,`stream()`方法使用汇总

Java中&#xff0c;stream()方法使用汇总 目标 通过示例学习&#xff0c;掌握Javastream()方法的实践应用 在Java中&#xff0c;stream()方法用于将集合&#xff08;如List、Set等&#xff09;或数组转换为Stream流对象&#xff0c;以便进行各种流式操作。流&#xff08;Str…

http实现post请求时本地没问题,线上报413错误、nginx配置免费https、nginx反向代理

MENU 错误原因解决其他方式关于nginx的文章 错误原因 前端发送请求以后后端没有收到请求 而客户端却报了413错误 是请求实体过大的异常 如果请求夹带着文件就可能造成请求实体过大 那这里是什么原因造成的呢 在基础的后端开发中 都会用到nginx反向代理 默认大小为1M 超过1M都会…

Leetcode 32. 最长有效括号

心路历程&#xff1a; 本以为要用动态规划&#xff0c;但是递推有点太难了&#xff1b;主要是第一反映hard题不能就一个栈就解决吧&#xff0c;结果还真就是一个栈解决了。 括号问题还是得栈入手&#xff0c;这道题考察栈哈希表思想&#xff08;其实就是数组索引&#xff09; …