【unity小技巧】FPS游戏实现相机的震动、后坐力和偏移

news2024/12/26 9:24:59

最终效果

在这里插入图片描述

文章目录

  • 最终效果
  • 前言
  • 相机的震动实现后坐力和偏移
  • 相机震动
    • 相机震动脚本
    • 换弹节点震动
  • 武器射击后退效果
  • 完结

前言

关于后坐力之前其实已经分享了一个:FPS游戏后坐力制作思路

但是实现起来比较复杂,如果你只是想要简单的实现,可以看看这个,其实原理是控制相机的震动实现后坐力和偏移

相机的震动实现后坐力和偏移

新增ProceduralRecoil ,Singleton是一个泛型单例

using UnityEngine;

public class ProceduralRecoil : Singleton<ProceduralRecoil>
{
    private Vector3 currentRotation; // 当前旋转角度
    private Vector3 targetRotation; // 目标旋转角度
    private Vector3 targetPosition; // 目标位置
    private Vector3 currentPosition; // 当前位置
    private Vector3 initialGunPosition; // 初始枪支位置

    public Transform cam; // 相机的Transform组件
    public float recoilX; // 旋转角度的偏移量
    public float recoilY;
    public float recoilZ;
    public float kickBackZ; // 位置的偏移量
    public float snappiness; // 平滑度,控制旋转和位置的平滑过渡速度
    public float returnAmount; // 回退程度,控制旋转和位置回到初始状态的速度

    void Start()
    {
        initialGunPosition = transform.localPosition; // 保存初始枪支位置
    }

    void Update()
    {
        targetRotation = Vector3.Lerp(targetRotation, Vector3.zero, Time.deltaTime * returnAmount); // 将目标旋转角度逐渐回到0
        currentRotation = Vector3.Slerp(currentRotation, targetRotation, Time.fixedDeltaTime * snappiness); // 平滑过渡当前旋转角度
        transform.localRotation = Quaternion.Euler(currentRotation); // 更新Transform组件的本地旋转
        Debug.Log(currentRotation);
        cam.localRotation = Quaternion.Euler(currentRotation); // 更新相机的本地旋转

        back(); // 回退效果
    }

    public void Recoil()
    {
        targetPosition = new Vector3(0, 0, kickBackZ); // 将目标位置设置为一个向后的偏移量
        targetRotation = new Vector3(recoilX, Random.Range(-recoilY, recoilY), Random.Range(-recoilZ, recoilZ)); // 将目标旋转角度设置为随机的偏移量
        Debug.Log("RECOIL!");
    }

    void back()
    {
        targetPosition = Vector3.Lerp(targetPosition, initialGunPosition, Time.deltaTime * returnAmount); // 将目标位置逐渐回到初始枪支位置
        currentPosition = Vector3.Lerp(currentPosition, targetPosition, Time.fixedDeltaTime * snappiness); // 平滑过渡当前位置
        transform.localPosition = currentPosition; // 更新Transform组件的本地位置
    }
}

配置数据,脚本挂载在枪身上
在这里插入图片描述
注意,相机的震动可能会和人物鼠标控制视角冲突,所以最好是给相机新增一个父类,防止二者互相干扰
在这里插入图片描述
调用

ProceduralRecoil.Instance.Recoil();

相机震动

如果你只要实现相机震动,可以选择把震动代码提取出来

相机震动脚本

//控制相机震动
public class ProceduralRecoil : Singleton<ProceduralRecoil>
{
    private Vector3 currentRotation; // 当前旋转角度
    private Vector3 targetRotation; // 目标旋转角度
    public float recoilX; // 旋转角度的偏移量
    public float recoilY;
    public float recoilZ;
    public float snappiness; // 平滑度,控制旋转和位置的平滑过渡速度
    public float returnAmount; // 回退程度,控制旋转和位置回到初始状态的速度

    void Update()
    {
        targetRotation = Vector3.Lerp(targetRotation, Vector3.zero, Time.deltaTime * returnAmount); // 将目标旋转角度逐渐回到0
        currentRotation = Vector3.Slerp(currentRotation, targetRotation, Time.fixedDeltaTime * snappiness); // 平滑过渡当前旋转角度
        transform.localRotation = Quaternion.Euler(currentRotation); // 更新相机的本地旋转
    }

    public void Recoil()
    {
        targetRotation = new Vector3(Random.Range(-recoilX, recoilX), Random.Range(-recoilY, recoilY), Random.Range(-recoilZ, recoilZ)); // 将目标旋转角度设置为随机的偏移量
        Debug.Log("RECOIL!");
    }

    public void SetRecoil(int i)
    {
        targetRotation = new Vector3(Random.Range(-i, i), Random.Range(-i, i), Random.Range(-i, i)); // 将目标旋转角度设置为随机的偏移量
    }
}

换弹节点震动

还可以在武器换弹时的某些节点,调用相机的震动,实现不错的人物操作反馈
在这里插入图片描述

//动画事件
public class PangXieAnimEnvent : MonoBehaviour
{
    public void PangXieAnim(int i)
    {
        ProceduralRecoil.Instance.SetRecoil(i);
    }
}

挂载PangXieAnimEnvent 脚本到对应带Animator的武器身上
在这里插入图片描述

武器射击后退效果

如果你只要实现武器射击后退效果,也可以选择把代码提取出来

public class ProceduralRecoil : Singleton<ProceduralRecoil>
{
    private Vector3 targetPosition; // 目标位置
    private Vector3 currentPosition; // 当前位置
    private Vector3 initialGunPosition; // 初始枪支位置

    public float kickBackZ; // 位置的偏移量
    public float snappiness; // 平滑度,控制旋转和位置的平滑过渡速度
    public float returnAmount; // 回退程度,控制旋转和位置回到初始状态的速度

    void Start()
    {
        initialGunPosition = transform.localPosition; // 保存初始枪支位置
    }

    void Update()
    {
        back(); // 回退效果
    }

    public void Recoil()
    {
        targetPosition = new Vector3(0, 0, kickBackZ); // 将目标位置设置为一个向后的偏移量
        Debug.Log("RECOIL!");
    }

    void back()
    {
        targetPosition = Vector3.Lerp(targetPosition, initialGunPosition, Time.deltaTime * returnAmount); // 将目标位置逐渐回到初始枪支位置
        currentPosition = Vector3.Lerp(currentPosition, targetPosition, Time.fixedDeltaTime * snappiness); // 平滑过渡当前位置
        transform.localPosition = currentPosition; // 更新Transform组件的本地位置
    }
}

完结

赠人玫瑰,手有余香!如果文章内容对你有所帮助,请不要吝啬你的点赞评论和关注,以便我第一时间收到反馈,你的每一次支持都是我不断创作的最大动力。当然如果你发现了文章中存在错误或者有更好的解决方法,也欢迎评论私信告诉我哦!

好了,我是向宇,https://xiangyu.blog.csdn.net

一位在小公司默默奋斗的开发者,出于兴趣爱好,最近开始自学unity,闲暇之余,边学习边记录分享,站在巨人的肩膀上,通过学习前辈们的经验总是会给我很多帮助和启发!php是工作,unity是生活!如果你遇到任何问题,也欢迎你评论私信找我, 虽然有些问题我也不一定会,但是我会查阅各方资料,争取给出最好的建议,希望可以帮助更多想学编程的人,共勉~

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1361135.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

R304S 指纹识别模块指令系统二

(16) 读索引表 PS_ReadIndexTable 功能说明&#xff1a;读取录入模版的索引表 输入参数&#xff1a;索引表页码&#xff0c;页码 0&#xff0c;1&#xff0c;2&#xff0c;3…分别对应模版从 0-256&#xff0c;256-512&#xff0c;512-768&#xff0c;768-1024…的索引&#…

玩转Python:用Python处理文档,5个必备的库,特别实用,附代码

在Python中&#xff0c;有几个流行的库用于处理文档&#xff0c;包括解析、生成和操作文档内容。以下是一些常用的库及其简介和简单的代码示例&#xff1a; PyPDF2 - 用于处理PDF文件。 简介&#xff1a;PyPDF2是一个纯Python库&#xff0c;用于分割、合并、转换和提取PDF文件中…

IDEA2023 最新版详细图文安装教程(Java环境搭建+IDEA安装+运行测试+汉化+背景图设置)

IDEA2023 最新版详细图文安装教程 名人说&#xff1a;工欲善其事&#xff0c;必先利其器。——《论语》 作者&#xff1a;Code_流苏(CSDN) o(‐&#xff3e;▽&#xff3e;‐)o很高兴你打开了这篇博客&#xff0c;跟着教程去一步步尝试安装吧。 目录 IDEA2023 最新版详细图文安…

pycharm indent rainbow插件

设置自定义颜色&#xff1a; 4DF0FFFF,4DE1FFFF,4DFFFACD,4DAFEEEE 前两位为4D&#xff0c;后面4位为RGB颜色表中的字 颜色表&#xff1a;RGB颜色对照表

『华为云耀云服务器实战』|云服务器如何快速搭建个人博客(图文详解)

文章目录 引言一、云耀云服务器L实例介绍1.1 准备一个华为云耀云服务器1.2 重置实例密码1.3 利用xshell 远程连接 二、安装环境软件2.1 安装git准备远程拉取2.2 安装Docker 和 Docker compose 三、博客开源项目介绍3.1 操作界面展览 四、拉取项目搭建个人博客4.1 拉取项目进行配…

书摘:C 嵌入式系统设计模式 06

本书的原著为&#xff1a;《Design Patterns for Embedded Systems in C ——An Embedded Software Engineering Toolkit 》&#xff0c;讲解的是嵌入式系统设计模式&#xff0c;是一本不可多得的好书。 本系列描述我对书中内容的理解。本文章描述原书第 2 章的内容。 作为嵌入…

运维工程师的出路

运维工程师的出路到底在哪里&#xff1f; 你是不是也常常听到身边的运维人员抱怨&#xff0c;他们的出路到底在哪里呢&#xff1f;别着急&#xff0c;让我告诉你&#xff0c;运维人员就像是IT界的“万金油”&#xff0c;他们像“修理工”一样维修服务器&#xff0c;像“消防员…

专业级的渗透测试服务,助力航空业数字化安全启航

​某知名航空公司是中国首批民营航空公司之一&#xff0c;运营国内外航线200多条&#xff0c;也是国内民航最高客座率的航空公司之一。在数字化发展中&#xff0c;该航空公司以数据驱动决策&#xff0c;通过精细化管理、数字创新和模式优化等方式&#xff0c;实现了精准营销和个…

0基础学习VR全景平台篇第134篇:720VR全景,云台调整节点

相机、云台和脚架全套设备组装完成后需要进行调校才能开始拍摄。这一节&#xff0c;我们将主要介绍云台调整的两个内容&#xff1a;对中心靶、调三点一线。&#xff08;后附调校原理&#xff09; 云台部件名称 一、调节准备 &#xff08;一&#xff09;对于安装好的云台 1.检…

基础面试题整理1

1.面向对象的特点 继承&#xff08;复用性&#xff09;、封装&#xff08;复用性&#xff09;、多态&#xff08;可移植性、灵活性&#xff09; 2.ArrayList与LinkedList区别 ArrayList和LinkedList都是实现了List接口 ArrayList底层是动态数组 LinkedList底层是链表&#…

人工智能:模拟人类智慧的科技奇迹

人工智能&#xff08;Artificial Intelligence&#xff0c;简称AI&#xff09;作为一项模拟人类智慧行为的科学与技术&#xff0c;正以惊人的速度改变着我们的世界。它旨在让计算机系统具备感知、推理、学习、决策和交互等人类智慧的能力&#xff0c;成为当今科技领域的巨大突破…

分布式系统架构设计之分布式缓存技术选型

一、概述 随着互联网业务的快速发展&#xff0c;分布式系统已经成为了解决大规模并发请求、高可用性、可扩展性等问题的重要手段。在分布式系统中&#xff0c;缓存作为提高系统性能的关键技术&#xff0c;能够显著降低数据库负载、减少网络延迟、提高数据访问速度。当面对大量…

C# visual studio COM创建及调用

1.visual studuio操作 1.1visual Studio创建类库项目ClassLibrary1。 1.1.1ClassLibrary1项目Class1.cs内容如下&#xff1a; using System; using System.Collections.Generic; using System.Linq; using System.Runtime.InteropServices; using System.Text; using System.T…

java基于ssm的线上选课系统的设计与实现论文

摘 要 在如今社会上&#xff0c;关于信息上面的处理&#xff0c;没有任何一个企业或者个人会忽视&#xff0c;如何让信息急速传递&#xff0c;并且归档储存查询&#xff0c;采用之前的纸张记录模式已经不符合当前使用要求了。所以&#xff0c;对学生选课信息管理的提升&#x…

MATLAB习题操作实战

2.1创建一个有7个元素的一维数组&#xff0c;并做如下处理:直接寻访一维数组的第6个元素;寻访一维数组的第1、3、5个元素;寻访一维数组中第4个至最后1个元素;寻访一维数组中大于70的元素。 % 创建一维数组 array [50, 60, 70, 80, 90, 100, 110];% 直接寻访一维数组的第6个元…

图像处理中的DCT变换

图像处理中的DCT变换 Discrete Cosine Transform&#xff0c;离散余弦变换。 来源及公式推导&#xff0c;可以查看下面链接&#xff0c;介绍的比较详细&#xff0c;这里就不再重复说明了&#xff1a; 详解离散余弦变换&#xff08;DCT&#xff09; - 知乎 (zhihu.com)DCT变换…

仿真炫酷烟花+背景音乐-H5代码实现_可直接运行【附完整源码】

文章目录 背景效果实现源码代码解析完整源码下载总结寄语 背景 烟花仿真是一项具有创意和娱乐性质的项目&#xff0c;旨在通过H5技术实现炫酷的烟花效果&#xff0c;并结合背景音乐营造出一个生动、愉悦的视听体验。该项目的目标是通过Web浏览器即时展现精美的烟花效果&#x…

ubuntu20.04安装cuda11.7和显卡驱动

1、禁用nouveau sudo vi /etc/modprobe.d/nouveau.conf 在最下面加入blacklist nouveau sudo update-initramfs -u sudo reboot 输入命令&#xff0c;如果没有任何输出&#xff0c;证明禁用成功 lsmod | grep nouveau 2、安装cuda11.7 CUDA Toolkit Archive | NVIDIA Deve…

再谈“敏捷”与“瀑布”在产品开发过程中的反思

作为一家专注于软件开发的公司《智创有术》&#xff0c;我们致力于为客户提供创新、高效和可靠的解决方案。通过多年的经验和专业知识&#xff0c;我们已经在行业内建立了良好的声誉&#xff0c;并赢得了客户的信任和支持。 支持各种源码&#xff0c;网站搭建&#xff0c;APP&a…

AI绘画Midjourney绘画提示词Prompt大全

一、Midjourney绘画工具 SparkAi创作系统是基于ChatGPT进行开发的Ai智能问答系统和Midjourney绘画系统&#xff0c;支持OpenAI-GPT全模型国内AI全模型。本期针对源码系统整体测试下来非常完美&#xff0c;可以说SparkAi是目前国内一款的ChatGPT对接OpenAI软件系统。那么如何搭…