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

news/2024/5/20 1:25:32

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

1. 对骨骼动画的设置

首先选中一个骨骼动画,单击 Inspector 面板里的 Animation 选项卡按钮:

我们以行走动画为例,如果我们想让动画中出现的模型偏移来改变角色的实际位置,那么我们就要取消勾选 XZ轴 的 Bake into Pose

如果是跳跃动画,则需要取消勾选 Y轴 的 Bake into Pose

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

假设目前我们的角色有一个胶囊体(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);
}

3. 处理模型位移方向

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

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.mrgr.cn/p/83767628

相关文章

抖音无人直播循环播放录音频软件

需求是做抖音或其他短视频平台无人直播时,需要循环播放录音文件列表,那么就可以用到这个小软件。 使用方法 双击exe的可执行文件,启动软件 点击循环播放按钮,可以读取当前目录以及子目录下面的音频文件列表,循环往复播放 点击停止循环按钮,可以停止播放插队播放 实现效果…

苹果手机突然黑屏打不开怎么办?多种方法合集

苹果手机突然黑屏打不开怎么办&#xff1f;苹果手机突然开不开机了怎么办&#xff1f;手机打不开机了按键长按没有反应怎么办&#xff1f; 如果您的苹果手机出现这些情况无法正常开机&#xff0c;可以尝试以下办法恢复&#xff1a; 方法1&#xff1a;给手机充电 首先&#xf…

基于表面法线法的二维人脸图构建三维人脸模型matlab仿真

1.算法运行效果图预览2.算法运行软件版本 matlab2022a3.算法理论概述 二维人脸图像获取表面法线首先,我们需要从二维灰度或者彩色人脸图像中估计表面法线。通常这一过程包括以下几个步骤:人脸检测与对齐:确保人脸图像被准确检测并进行标准化对齐,以便后续处理。深度信息估计…

项目冲刺——第 1 篇 Scrum 冲刺博客

作业所属课程 所属课程作业要求 作业要求作业目标 敏捷开发前的安排一、各个成员在 Alpha 阶段认领的任务二、明日各个成员的任务安排成员 任务肖杨、梁丽贤 搭建前端开发框架黄诃华、欧文杰 编写数据库姚佳如、李慧娣 不断根据需求完善功能设计,并完成首页、登陆模块的页面设…

Linux学习之路 -- 文件 -- 文件描述符

前面介绍了与文件相关的各种操作&#xff0c;其中的各个接口都离不开一个整数&#xff0c;那就是文件描述符&#xff0c;本文将介绍文件描述符的一些相关知识。 目录 <1>现象 <2>原理 文件fd的分配规则和利用规则实现重定向 <1>现象 我们可以先通过prin…

STATA 核密度图

. clear . set obs 625 . gen x = (mod((_n-mod(_n-1,25)-1)/25,25)-12)/12 . gen y = (mod(_n-1,25)-12)/12 . gen z = normalden(x,0,2)*normalden(y,0,2) //二维乘积核 . twoway contour z x y, level(15)

全栈开发之路——前端篇(6)生命周期和自定义hooks

全栈开发一条龙——前端篇 第一篇&#xff1a;框架确定、ide设置与项目创建 第二篇&#xff1a;介绍项目文件意义、组件结构与导入以及setup的引入。 第三篇&#xff1a;setup语法&#xff0c;设置响应式数据。 第四篇&#xff1a;数据绑定、计算属性和watch监视 第五篇 : 组件…

彻底解决python的pip install xxx报错(文末附所有依赖文件)

今天安装pip install django又报错了&#xff1a; C:\Users\Administrator>pip install django WARNING: Ignoring invalid distribution -ip (d:\soft\python\python38\lib\site-pac kages) Looking in indexes: https://pypi.tuna.tsinghua.edu.cn/simple Collecting djan…

构造照亮世界——快速沃尔什变换 (FWT)

之前学习 FFT 的时候,我们知道 FFT 是用来快速求两个多项式乘积的,而 FWT 解决的多项式的位运算……博客园 我的博客快速沃尔什变换解决的卷积问题 快速沃尔什变换(FWT)是解决这样一类卷积问题: \[c_i=\sum_{i=j\odot k}a_jb_k \]其中,\(\odot\) 是位运算的一种。举个例子…

【webrtc】RemoteAudioSource的创建线程

m98 代码&#xff1a;I:\webrtc m98_yjf\src\pc\rtp_transmission_manager.cc RtpTransmissionManager::CreateReceiver 在信令线程创建receiver receiver 是&#xff1a; rtc::scoped_refptr<RtpReceiverProxyWithInternal<RtpReceiverInternal>>receiver;其实际…

Nessus 部署实验

一、下载安装https://www.tenable.com/downloads/nessus 安装好之后&#xff0c;Nessus会自动打开浏览器&#xff0c;进入到初始化选择安装界面&#xff0c;这里我们要选择 Managed Scanner 点击继续&#xff0c;下一步选择Tenable.sc 点击继续&#xff0c;设置用户名和密码 等…

软件测试之linux学习day2

今天学习linux中的shell编程

虚拟机文件夹共享操作(本地访问)

新建一个文件夹 右击文件夹点击属性 找到共享 点击共享 选择本地用户共享就可以了 本地winr 输入我们图片中的格式&#xff08;IP前加 “\\” &#xff09; 会弹一个窗口&#xff0c;输入虚拟机的入户名和密码就可以共享了&#xff08;一般默认用户名都是administrator&am…

SwiftUI ScrollView 滚动视图

代码 // // ContentView.swift // SwiftUIScrollView // // Created by CHEN Hao on 2024/5/7. //import SwiftUIstruct ContentView: View {var body: some View {VStack(alignment: .leading) {VStack(alignment: .leading) {Text("monday, aug 20".uppercased(…

wpf字符图标

1、网页使用: font face=webdings size="32">i</font 2、WPF使用: TextBlock Text="1" FontFamily="Wingdings" FontSize="32"></TextBlock

虚拟机安装

学习视频:点这里 学习文字:点这里 下载安装包和密钥文件后得到: 创建虚拟机的安装目录: 安装中需要注意的地方:

欧拉回路(leetcode 重新安排行程)

先学习一下欧拉回路是怎么一回事。 对于图中这七个节点&#xff0c;从节点1出发&#xff0c;最终要到达节点1&#xff0c;并且每条路只能走一次&#xff0c;且每条路都得走过一次。 使用dfs&#xff0c;如果算法按照字典序的排列方式选择下一个节点。 第一部分&#xff1a;那…

Linux系统管理-系统概述

1、Linux系统管理-系统概述一、系统概述 3.系统安装 1.系统安装 1.选择第一项install centos7,并且设置语言,推荐使用中文,简体中文2.字符界面安装选择最小或基本网页服务器即可,接下来就是进行磁盘分区,也可以自己分配或者系统自动分配3.手动分区里面也可以让系统自动创建…

推荐几款AI写作工具:智能在线一键文章创作、代码编写、论文等

在五一节的休假期结束之后,广大员工常常体验到了显著的疲劳,对立即恢复工作状态感到抗拒。虽然这种心态在职场中并不罕见,但工作的责任与需求仍需要我们去面对。 在这种背景下,如何能够既保证工作效率与质量,又能为自己争取到宝贵的调整时间,成为了许多人士所关心的问题。…

C++设计模式-创建型设计模式

设计模式 设计模式是什么 设计模式是指在软件开发中&#xff0c;经过验证的&#xff0c;用于解决在特定环境下&#xff0c;重复出现的&#xff0c;特定问题的解决方案&#xff1b;其实就是解决问题的固定套路。但是要慎用设计模式&#xff0c;有一定的工程代码量之后用它比较…