Unity功能点---模拟枪械射击时的后坐力
最近要在VR里面制作一个射击的功能,枪是外接设备也不知道有没有后坐力,模拟一个先以防万一
这个是PC测试的,模拟的不是很真实,用摄像机的抖动造成后坐力的感觉,但是改改还是够用
首先是枪的发射脚本:
using UnityEngine;public class GunRecoil : MonoBehaviour
{private GameObject bullet;//子弹private Vector3 FrontStar;//准星private CameraController cam;//摄像机控制脚本private float shootRate = 0.15f;//射击频率private float shootTimer;//射击计时private void Start(){bullet = transform.Find("Bullet").gameObject;cam = Camera.main.GetComponent<CameraController>(); ;LookAtStar();}private void Update(){if (Input.GetButton("Fire1")){Fire();}else{if (Input.GetAxis("Mouse X") == 0 && Input.GetAxis("Mouse Y") == 0)cam.Recover();}}/// <summary>/// 射击,射击频率,后坐力模拟/// </summary>private void Fire(){shootTimer += Time.deltaTime;if (shootTimer >= shootRate){GameObject go = Instantiate(bullet, bullet.transform.position, Quaternion.identity);go.SetActive(true);go.GetComponent<Rigidbody>().velocity = transform.forward * 20000;Destroy(go, 4f);shootTimer = 0;cam.SimulateRecoil();}}/// <summary>/// 枪始终看向准星/// </summary>private void LookAtStar(){Ray ray = Camera.main.ScreenPointToRay(new Vector3(Screen.width / 2, Screen.height / 2));RaycastHit hit;if (Physics.Raycast(ray, out hit)){FrontStar = hit.point;}else{//Debug.DrawRay(Camera.main.transform.position,Camera.main.transform.forward * 1000,Color.red);FrontStar = Camera.main.transform.forward * 1000;}transform.LookAt(FrontStar);}
}
配置的结构:
脚本已经注释很清楚了,下面是摄像机的脚本,主要是一个旋转功能,抖动功能和恢复初始选择的功能:
using UnityEngine;
using UnityEngine.EventSystems;
public class CameraController : MonoBehaviour
{ public float RotateAngle;public void CameraRotate(){float x_axis = Input.GetAxis("Mouse X");float y_axis = Input.GetAxis("Mouse Y");if (Input.GetMouseButton(1)){if (Mathf.Abs(x_axis) > Mathf.Abs(y_axis)){transform.Rotate(Vector3.up, RotateAngle * x_axis * Time.deltaTime);}if (Mathf.Abs(y_axis) > Mathf.Abs(x_axis)){if (transform.eulerAngles.x > -80 && transform.eulerAngles.x < 360){transform.Rotate(Vector3.left, RotateAngle * y_axis * Time.deltaTime);}else{return;}}transform.eulerAngles = new Vector3(transform.eulerAngles.x, transform.eulerAngles.y, 0);if(!Input.GetButton("Fire1"))//如果不是在射击时移动镜头就设置最终旋转等于移动的旋转lastQ = transform.rotation; //避免在射击时压枪射击完后镜头不恢复到射击前的状态}}public float Max_X_Recoil;//X轴最大旋转偏移public float Max_Y_Recoil;//Y轴最大旋转便宜private float x_Range;//X轴射击时的旋转度private float y_Range;//Y轴射击时的旋转度public void SimulateRecoil(){x_Range = Random.Range(0.1f, Max_X_Recoil);y_Range = Random.Range(0.1f, Max_Y_Recoil);//transform.eulerAngles += transform.rotation * transform.up*x_Range+transform.rotation*transform.right * y_Range;//使用右乘会导致左右旋转后出现偏差transform.eulerAngles = new Vector3(transform.eulerAngles.x-x_Range, transform.eulerAngles.y+y_Range, 0);//射击时的旋转}private Quaternion lastQ;//摄像机射击之前的旋转public void Recover(){transform.rotation = Quaternion.Lerp(transform.rotation, lastQ, 5f * Time.deltaTime);//恢复之前的旋转}
}
看下效果:
欢迎加群:4364930讨论
Unity功能点---模拟枪械射击时的后坐力相关推荐
- 【Unity新闻】如何使用Unity进行机器人模拟? | AR/VR全球需求率激增1400%
洪流学堂,让你快人几步. 我们一起看看上周Unity有什么大事情发生吧! 如何使用Unity进行机器人模拟? 机器人开发工作流程依赖于模拟进行测试和培训,Unity展示了机器人专家如何使用Unity来 ...
- Unity三体运行模拟体验
Unity三体运行模拟体验 这两天看完三体电视剧,很想体验一把三体人的世界-于是,说干就干. 先来看看效果吧 先来个上帝视角的 Unity三体模拟上帝视角 然后再来个三体人视角的(行星视角) Unit ...
- Unity功能—— 在VS中快速访问Unity API对应文档
声明:本文为个人笔记,用于学习研究使用非商用,内容为个人研究及综合整理所得,若有违规,请联系,违规必改. Unity功能-- 在VS中快速访问Unity API对应文档 文章目录 Unity功能-- ...
- Unity实战之模拟飞碟
Unity实战之模拟飞碟 unity实现简易打飞碟游戏. 项目地址 Unity飞碟实现效果 游戏规则 一共10轮,每轮10s 轮次越高,难度越大. 每轮的一定时间都会生成一定数量的飞碟,一共有四种颜色 ...
- Unity功能——宏定义的使用
声明:本文为个人笔记,用于学习研究使用非商用,内容为个人研究及综合整理所得,若有违规,请联系,违规必改. Unity功能--宏定义的使用 文章目录 Unity功能--宏定义的使用 一.开发环境 二.问 ...
- Vehicle Spy3软件常用功能之模拟报文发送
Vehicle Spy3软件常用功能之模拟报文发送 功能说明 在很多测试场景下,我们都需要通过往总线发送特定报文对控制器的功能进行测试,模拟报文发送的方式可以简单.直接地满足我们的需求. 模拟报文发送 ...
- Unity功能记录(一) ------ 截图/录屏保存到相册(Android/iOS横屏竖屏都可以)
截屏和录屏unity端代码都已经分享过 : Unity功能记录(十七) ------ 截屏功能 Unity插件(二) ------ NatCorder(录屏保存到相册) 但是之前一个个的其实并没有用在 ...
- Unity功能记录(十四) ------ 启动画面
今天换启动画面时美术给了好多图,但是很神奇要不是拉伸要不就是有边框,比如以下: 整了好久,都不知道为什么,透明图更离谱,还拉伸了,查看官方文档才发现要怎么修改 Unity Splash Screen设 ...
- 基于unity的飞行模拟设计
使用unity开发游戏真是非常方便.研究飞行模拟也有一段时日,尝试过物理和数学模拟.从效果上来看,物理模拟较为真实一点.但是操作不好.数学模拟的话,虽然牺牲了飞行效果,操控是非常方便的. 所谓的数学模 ...
最新文章
- java task多线程_JAVA语言-多线程实现的四种方式
- 从源码层面带你实现一个自动注入注解
- 使用JavaScript给对象修改注册监听器
- 五月两场!! NVIDIA DLI 深度学习入门课程——计算机视觉
- 【Python】strip()方法
- pytorch保存.pth文件
- python Udp与Tcp
- 内存测试软件 ddr 4,DDR4内存理论性能测试
- win10配置oracle环境变量,win10环境下Oracle环境搭建过程
- 新手想做IT运维工程师该详细学习哪些知识?
- 数字逻辑电路(二、逻辑代数基础)
- 让机器学习助力医疗领域
- mysql 设置密码出现ERROR 1819 (HY000): Your password does not satisfy the current policy requirements
- c++成员函数指针揭秘
- 路由器恢复出厂设置,如何重新配置访问网络
- zz:使用Monkeyrunner进行Android自动化的总结
- html5 javascript写法,9 个强大而非主流的JS写法(各种 Hack 写法)
- iOS-推送自定义提示音
- 深信服EDS分布式存储第三方服务器安装教程(戴尔服务器IPMI)
- 转:程序猿也爱学英语
热门文章
- 51单片机基础——串口通信发送字符ab控制流水灯
- Redis 取消保护模式
- 几行代码,让黑白老照片重获新生!
- Python实用模块
- android mysql 驱动_Java-使用com.mysql.jdbc.Driver的Android MySQL
- 洋葱模型php,PHPIZE的作用 - tree2013的个人空间 - OSCHINA - 中文开源技术交流社区
- 台式计算机碟片怎么安装,怎样用光盘从装台式电脑系统?
- 弹出框样式,swal is not define
- 电商私域流量搭建规划社群运营推广sop销售转化计划书表格模板方案
- 什么是水货?如何辨别水货手机?水货手机能不能用?