【unity小技巧】实现没有动画的FPS武器摇摆和摆动效果
文章目录
- 前言
- 开始
- 完结
前言
添加程序摇摆和摆动是为任何FPS游戏添加一些细节的非常简单的方法。但是并不是所以的模型动画都会配有武器摆动动画效果,在本文中,将实现如何使用一些简单的代码实现武器摇摆和摆动效果,这比设置动画来尝试实现类似效果要容易得多。
开始
新增SwayNBobScript代码
using UnityEngine;// 武器摆动脚本
public class SwayNBobScript : MonoBehaviour
{[Header("Sway")]public float step = 0.01f; // 摆动步长public float maxStepDistance = 0.06f; // 最大步长距离Vector3 swayPos; // 摆动位置[Header("Sway Rotation")]public float rotationStep = 4f; // 摆动旋转步长public float maxRotationStep = 5f; // 最大旋转步长Vector3 swayEulerRot; // 摆动旋转角度public float smooth = 10f; // 平滑移动速度float smoothRot = 12f; // 平滑旋转速度[Header("Bobbing")]public float speedCurve; // 速度曲线参数float curveSin { get => Mathf.Sin(speedCurve); } // 曲线正弦值float curveCos { get => Mathf.Cos(speedCurve); } // 曲线余弦值public Vector3 travelLimit = Vector3.one * 0.025f; // 移动限制public Vector3 bobLimit = Vector3.one * 0.01f; // 摆动限制Vector3 bobPosition; // 摆动位置偏移量public float bobExaggeration; // 摆动夸张系数[Header("Bob Rotation")]public Vector3 multiplier; // 摆动旋转系数Vector3 bobEulerRotation; // 摆动旋转角度void Update(){GetInput();Sway();SwayRotation();BobOffset();BobRotation();CompositePositionRotation();}Vector2 walkInput; // 行走输入Vector2 lookInput; // 视角输入// 获取输入void GetInput(){walkInput.x = Input.GetAxis("Horizontal");walkInput.y = Input.GetAxis("Vertical");walkInput = walkInput.normalized;lookInput.x = Input.GetAxis("Mouse X");lookInput.y = Input.GetAxis("Mouse Y");}// 摆动void Sway(){Vector3 invertLook = lookInput * -step;invertLook.x = Mathf.Clamp(invertLook.x, -maxStepDistance, maxStepDistance);invertLook.y = Mathf.Clamp(invertLook.y, -maxStepDistance, maxStepDistance);swayPos = invertLook;}// 摆动旋转void SwayRotation(){Vector2 invertLook = lookInput * -rotationStep;invertLook.x = Mathf.Clamp(invertLook.x, -maxRotationStep, maxRotationStep);invertLook.y = Mathf.Clamp(invertLook.y, -maxRotationStep, maxRotationStep);swayEulerRot = new Vector3(invertLook.y, invertLook.x, invertLook.x);}// 合成位置和旋转部分void CompositePositionRotation(){transform.localPosition = Vector3.Lerp(transform.localPosition, swayPos + bobPosition, Time.deltaTime * smooth);transform.localRotation = Quaternion.Slerp(transform.localRotation, Quaternion.Euler(swayEulerRot) * Quaternion.Euler(bobEulerRotation), Time.deltaTime * smoothRot);}// 摆动偏移void BobOffset(){speedCurve += Time.deltaTime * (MovementScript.Instance.isGround ? (Input.GetAxis("Horizontal") + Input.GetAxis("Vertical")) * bobExaggeration : 1f) + 0.01f;bobPosition.x = (curveCos * bobLimit.x * (MovementScript.Instance.isGround ? 1 : 0)) - (walkInput.x * travelLimit.x);bobPosition.y = (curveSin * bobLimit.y) - (Input.GetAxis("Vertical") * travelLimit.y);bobPosition.z = -(walkInput.y * travelLimit.z);}// 摆动旋转void BobRotation(){bobEulerRotation.x = (walkInput != Vector2.zero ? multiplier.x * (Mathf.Sin(2 * speedCurve)) : multiplier.x * (Mathf.Sin(2 * speedCurve) / 2));bobEulerRotation.y = (walkInput != Vector2.zero ? multiplier.y * curveCos : 0);bobEulerRotation.z = (walkInput != Vector2.zero ? multiplier.z * curveCos * walkInput.x : 0);}
}
代码挂载在武器父类上即可
正常情况下,我们还要实现武器在瞄准时,减低或者禁用武器摆动效果,可以选择在瞄准时启动和禁用SwayNBobScript脚本
public SwayNBobScript swayNBobScript;private void Update()
{DetermineAim();
}//瞄准
void DetermineAim(){swayNBobScript.enabled = true;if (Input.GetMouseButton(1)){swayNBobScript.enabled = false;}
}
效果
完结
赠人玫瑰,手有余香!如果文章内容对你有所帮助,请不要吝啬你的点赞评论和关注
,以便我第一时间收到反馈,你的每一次支持
都是我不断创作的最大动力。当然如果你发现了文章中存在错误
或者有更好的解决方法
,也欢迎评论私信告诉我哦!
好了,我是向宇
,https://xiangyu.blog.csdn.net
一位在小公司默默奋斗的开发者,出于兴趣爱好,最近开始自学unity,闲暇之余,边学习边记录分享,站在巨人的肩膀上,通过学习前辈们的经验总是会给我很多帮助和启发!php是工作,unity是生活!如果你遇到任何问题,也欢迎你评论私信找我, 虽然有些问题我也不一定会,但是我会查阅各方资料,争取给出最好的建议,希望可以帮助更多想学编程的人,共勉~
相关文章:
【unity小技巧】实现没有动画的FPS武器摇摆和摆动效果
文章目录 前言开始完结 前言 添加程序摇摆和摆动是为任何FPS游戏添加一些细节的非常简单的方法。但是并不是所以的模型动画都会配有武器摆动动画效果,在本文中,将实现如何使用一些简单的代码实现武器摇摆和摆动效果,这比设置动画来尝试实现类…...
C语言基础知识(6):UDP网络编程
UDP 是不具有可靠性的数据报协议。细微的处理它会交给上层的应用去完成。在 UDP 的情况下,虽然可以确保发送消息的大小,却不能保证消息一定会到达。因此,应用有时会根据自己的需要进行重发处理。 1.UDP协议的主要特点: …...
12月笔记
#pragma once 防止多次引用头文件,保证同一个(物理意义上)文件被多次包含,内容相同的两个文件同样会被包含。 头文件.h与无.h的文件: iostream是C的头文件,iostream.h是C的头文件,即标准的C头文…...
三、C语言中的分支与循环—for循环 (6)
本章分支结构的学习内容如下: 三、C语言中的分支与循环—if语句 (1) 三、C语言中的分支与循环—关系操作符 (2) 三、C语言中的分支与循环—条件操作符 与逻辑操作符(3) 三、C语言中的分支与循环—switch语句(4)分支结构 完 本章循环结构的…...
tolist()读取Excel列数据,(Excel列数据去重后,重新保存到新的Excel里)
从Excel列数据去重后,重新保存到新的Excel里 import pandas as pd# 读取Excel文件 file r"D:\\pythonXangmu\\quchong\\quchong.xlsx" # 使用原始字符串以避免转义字符 df pd.read_excel(file, sheet_namenameSheet)# 删除重复值 df2 df.drop_duplica…...
ChatGPT大升级,文档图像识别领域迎来技术革新
写在前面ChatGPT迎来重大升级冲击与机遇并存大模型时代的思考与探索■ 像素级OCR统一模型- UPOCR■ OCR大一统模型- SPTS v3■ 文档识别分析LLM应用 写在最后问卷抽奖 写在前面 2023 年 12 月 31 日第十九届中国图象图形学学会青年科学家会议在广州召开,该会…...
2023年全国职业院校技能大赛软件测试—测试报告模板参考文档
ERP(资源协同)管理平台测试报告 目录 ERP(资源协同)管理平台测试报告 1. 概述...
【BCC动态跟踪PostgreSQL】
BPF Compiler Collection (BCC)是基于eBPF的Linux内核分析、跟踪、网络监控工具。其源码存放于GitCode - 开发者的代码家园 想要监控PostgreSQL数据库的相关SQL需要在编译PostgreSQL的时候开启dtrace。下文主要介绍几个和PostgreSQL相关的工具,其他工具可根据需求自行了解。 …...
汽车架构解析:python cantools库快速解析arxml
文章目录 前言一、安装cantools二、官方说明文档三、cantools方法1、解析message的属性2、解析pdu中的signals3、根据message查找signals4、报文组成bytes 四、总结 前言 曾经有拿cantools来解析过dbc,用得比较浅,不知道可以用来解析arxml。最近有个需求…...
Vue 之 修饰符汇总
一、简介 在Vue中,修饰符是一种特殊的语法,用于修改指令或事件绑定的行为,它们以点号(.)的形式添加到指令或事件的后面,并可以改变其默认行为或添加额外的功能,如:禁止事件冒泡、数…...
如何通过内网穿透实现无公网IP远程访问内网的Linux宝塔面板
文章目录 一、使用官网一键安装命令安装宝塔二、简单配置宝塔,内网穿透三、使用固定公网地址访问宝塔 正文开始前给大家推荐个网站,前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。…...
综合跨平台全端ui自动化测试框架Airtest——AirtestIDE录制微信小程序脚本教学
前言 有在自动化测试领域的小伙伴应该都知道,app和小程序自动化这一类的自动化测试在实际操作中有时候很棘手让人心烦,动不动就是用appium写代码脚本维护什么的,不仅步骤繁琐,环境配置方面也是繁琐无比,动不动就与客户…...
如何在ArcGIS Pro中指定坐标系
在进行制图的时候,为了实现某些特定的效果,需要指定特定的坐标系,但是现有的数据可能不是所需要的坐标系,这时候就需要对现有的数据坐标系进行处理,这里为大家介绍一下ArcGIS Pro中指定坐标系的方法,希望能…...
macOS 老版本系统恢复中出现“MacBook Pro无法与恢复服务器取得联系”
macOS 老版本系统恢复中出现“MacBook Pro无法与恢复服务器取得联系” 网络问题系统时间问题镜像索引问题 网络问题 系统时间问题 镜像索引问题 恢复模式的 “实用工具 > 系统终端” 里执行如下 nvram IASUCatalogURLhttps://swscan.apple.com/content/catalogs/others/i…...
[C#]使用OpenCvSharp实现二维码图像增强超分辨率
【官方框架地址】 github.com/shimat/opencvsharp 【算法介绍】 借助于opencv自带sr.prototxt和sr.caffemodel实现对二维码图像增强 【效果展示】 【实现部分代码】 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin…...
优化|流形优化系列(一)
简介 流形优化是非线性优化的一个分支,它主要关注在特定的几何结构下进行优化。在流形优化中,优化问题通常是在黎曼流形上进行的,而非欧几里得空间。黎曼流形是带有黎曼度量的流形,该度量为流形上的每个点都定义了一个内积。这种…...
torch.where()函数
在深度学习的实现中,处理条件逻辑是一项常见而重要的任务。PyTorch 提供了一个强大的函数 torch.where(),它使得基于条件的张量操作变得既简单又高效。本文将深入探讨 torch.where() 的用法,并通过示例展示它在不同场景中的应用。 什么是 to…...
盖子的c++小课堂——第二十三讲:背包问题
前言 又是一次漫长的更新(我真不是故意的aaaaaaaaaaaaaaa),先不多说了,直接给我~坐下~说错了说错了,直接开始~ 背包问题----动态规划 背包问题(knapsack problem) 动态规划(dyna…...
k8s安装hostPath方式存储的PostgreSQL15
1.配置 PostgreSQL 的 ConfigMap cat > postgres-configmap.yaml << EOF apiVersion: v1 kind: ConfigMap metadata:name: postgres-configlabels:app: postgresnamespace: dev data:POSTGRES_DB: postgresdbPOSTGRES_USER: postgresadminPOSTGRES_PASSWORD: admin12…...
51单片机之按键和数码管
51单片机之按键和数码管 ✍前言:♐独立按键😀独立按键的原理😀软件实现按键控制LED灯的亮灭 ♐数码管😊数码管显示数字或者字母的原理🐉共阳极数码管🐉共阴极极数码管🐉4位1体数码管 Ƕ…...
【Oracle】 - 数据库的实例、表空间、用户、表之间关系
Oracle是一种广泛使用的关系型数据库管理系统,它具有高性能、高可靠性、高安全性等特点。1Oracle数据库的结构和组成是一个复杂而又有趣的话题,本文将介绍Oracle数据库的四个基本概念:数据库、实例、表空间和用户,以及它们之间的关…...
ssm基于HTML5的交流论坛的设计与实现+vue论文
摘 要 信息数据从传统到当代,是一直在变革当中,突如其来的互联网让传统的信息管理看到了革命性的曙光,因为传统信息管理从时效性,还是安全性,还是可操作性等各个方面来讲,遇到了互联网时代才发现能补上自古…...
JDBC*
*JDBC数据库连接步骤 1.将JDBC驱动的jar添加到项目的依赖中。 2.加载JDBC驱动 例如: Class.forName("com.mysql.jdbc.Driver"); 3.连接数据库 例如: Connection con DriverManager.getConnection(URL,us…...
Zookeeper注册中心实战
Java学习手册面试指南:https://javaxiaobear.cn Spring Cloud Zookeeper通过自动配置和绑定到 Spring 环境和其他 Spring 编程模型习惯用法,为 Spring Boot 应用程序提供Apache Zookeeper集成。通过一些简单的注释,您可以快速启用和配置应用…...
1-02VS的安装与测试
一、概述 对于一名C语言程序员而言,进行C语言程序的开发一般需要一个文本编辑器加上一个编译器就足够了。但为了方便起见,我们选择使用集成开发环境——Visual Studio(简称VS)。安装Visual Studio 下面讲一下如何安装VS࿰…...
ctfshow——PHP特性
文章目录 web 89web 90web 91web 92web 93web 94web 95web 96web 97web 98web 99web 100——优先级、eval()用法web 101——RefelctionClass反射类web 102——php伪协议、hex2bin()web103web 104——sha1绕过web 105 web 89 使用人工分配 ID 键的数值型数组绕过preg_match. 两个…...
K8S陈述式资源管理
陈述式 命令行:kubectl命令行工具 优点:90%以上的场景都可以满足,对增,删,查比较方便,对改不是很友好 缺点:命令比较冗长,复杂,难记 声明式 k8s当中的yaml文件来实现资…...
详解Python内置函数 !!!
内置函数就是Python给你提供的, 拿来直接用的函数,比如print,input等。 文章目录 前言 一、和数字相关 1. 数据类型 2. 进制转换 3. 数学运算 二、和数据结构相关 1. 序列 2. 数据集合 3. 相关内置函数 三、和数据结构相关 四、和迭代器生成器相关 五、字…...
使用Vue3 + Vite创建uni-app项目(Webstorm)
使用Vue3 Vite创建uni-app项目(Webstorm) 参考:前端VUE3Vite UniAPP-- 框架搭建_uniapp vite-CSDN博客 // 参考github.com的库:https://github.com/dcloudio/uni-preset-vue npx degit dcloudio/uni-preset-vue#vite-ts vite-vu…...
【js】js实现多个视频连续播放:
文章目录 一、效果:二、实现:三、案例: 一、效果: 二、实现: <!DOCTYPE html> <html> <head><title>Video Player</title><style>#progressBar { width: 800px;height: 20px;b…...
哪个网站可以做公务员考试题/网站建设的数字化和互联网化
题目描述 方案:深度优先搜索 解题思路: 用sum值减去当前访问的节点值,若当前节点为叶子节点且减完为0,则将当前路径加入总路径中,否则,依次遍历左右孩子,没有就从上一个节点为起点进行深度优先…...
广东营销网站建设服务/电子商务网站建设教程
一、典型回答 int是我们常说的整形数字,是Java的8个原始数据类型(primitiveTypes,boolean,byte,short,char,int,float,double,long)之一。Java语…...
投资做网站/网络seo营销推广
一.优化器的逻辑 选择索引是优化器的工作 优化器选择索引的目的: 找一个最优的执行方案,用最小的代价执行语句执行行数是影响执行代价的因素之一。扫描的行数越少,意味着访问磁盘数据的次数越少 ,消耗CPU资源越少。 优化器还…...
php网站微信支付怎么做/网站建设平台软件
BUG:z-index 有时候设置了很高的值如:z-index:999; 但是最后在IE7中却达不到我们想要的效果,设置了z-index还是被遮盖了。 原因:因为其实是IE7的渲染DOM的问题,当它的父级容器被定位(显示设置了position属性, 如position:relative…...
海珠网站建设/优化服务公司
#"包含了一个位置信息 默认的锚点是#top 也就是网页的上端 而javascript:void(0) 仅仅表示一个死链接 这就是为什么有的时候页面很长浏览链接明明是#可是跳动到了页首 而javascript:void(0) 则不是如此 所以调用脚本的时候最好用void(0…...
动态网站模板下载/网站百度关键词排名软件
今天分享一个杨氏太极拳的视频文件,让更多喜欢太极拳的朋友能够有好的帮助。。。 链接:https://pan.baidu.com/s/1skJaFXN 密码:sqwj Austin Liu 刘恒辉 Department Manager,Product Manager,Project Manager an…...