最近要在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功能点---模拟枪械射击时的后坐力相关推荐

  1. 【Unity新闻】如何使用Unity进行机器人模拟? | AR/VR全球需求率激增1400%

    洪流学堂,让你快人几步. 我们一起看看上周Unity有什么大事情发生吧! 如何使用Unity进行机器人模拟? 机器人开发工作流程依赖于模拟进行测试和培训,Unity展示了机器人专家如何使用Unity来 ...

  2. Unity三体运行模拟体验

    Unity三体运行模拟体验 这两天看完三体电视剧,很想体验一把三体人的世界-于是,说干就干. 先来看看效果吧 先来个上帝视角的 Unity三体模拟上帝视角 然后再来个三体人视角的(行星视角) Unit ...

  3. Unity功能—— 在VS中快速访问Unity API对应文档

    声明:本文为个人笔记,用于学习研究使用非商用,内容为个人研究及综合整理所得,若有违规,请联系,违规必改. Unity功能-- 在VS中快速访问Unity API对应文档 文章目录 Unity功能-- ...

  4. Unity实战之模拟飞碟

    Unity实战之模拟飞碟 unity实现简易打飞碟游戏. 项目地址 Unity飞碟实现效果 游戏规则 一共10轮,每轮10s 轮次越高,难度越大. 每轮的一定时间都会生成一定数量的飞碟,一共有四种颜色 ...

  5. Unity功能——宏定义的使用

    声明:本文为个人笔记,用于学习研究使用非商用,内容为个人研究及综合整理所得,若有违规,请联系,违规必改. Unity功能--宏定义的使用 文章目录 Unity功能--宏定义的使用 一.开发环境 二.问 ...

  6. Vehicle Spy3软件常用功能之模拟报文发送

    Vehicle Spy3软件常用功能之模拟报文发送 功能说明 在很多测试场景下,我们都需要通过往总线发送特定报文对控制器的功能进行测试,模拟报文发送的方式可以简单.直接地满足我们的需求. 模拟报文发送 ...

  7. Unity功能记录(一) ------ 截图/录屏保存到相册(Android/iOS横屏竖屏都可以)

    截屏和录屏unity端代码都已经分享过 : Unity功能记录(十七) ------ 截屏功能 Unity插件(二) ------ NatCorder(录屏保存到相册) 但是之前一个个的其实并没有用在 ...

  8. Unity功能记录(十四) ------ 启动画面

    今天换启动画面时美术给了好多图,但是很神奇要不是拉伸要不就是有边框,比如以下: 整了好久,都不知道为什么,透明图更离谱,还拉伸了,查看官方文档才发现要怎么修改 Unity Splash Screen设 ...

  9. 基于unity的飞行模拟设计

    使用unity开发游戏真是非常方便.研究飞行模拟也有一段时日,尝试过物理和数学模拟.从效果上来看,物理模拟较为真实一点.但是操作不好.数学模拟的话,虽然牺牲了飞行效果,操控是非常方便的. 所谓的数学模 ...

最新文章

  1. java task多线程_JAVA语言-多线程实现的四种方式
  2. 从源码层面带你实现一个自动注入注解
  3. 使用JavaScript给对象修改注册监听器
  4. 五月两场!! NVIDIA DLI 深度学习入门课程——计算机视觉
  5. 【Python】strip()方法
  6. pytorch保存.pth文件
  7. python Udp与Tcp
  8. 内存测试软件 ddr 4,DDR4内存理论性能测试
  9. win10配置oracle环境变量,win10环境下Oracle环境搭建过程
  10. 新手想做IT运维工程师该详细学习哪些知识?
  11. 数字逻辑电路(二、逻辑代数基础)
  12. 让机器学习助力医疗领域
  13. mysql 设置密码出现ERROR 1819 (HY000): Your password does not satisfy the current policy requirements
  14. c++成员函数指针揭秘
  15. 路由器恢复出厂设置,如何重新配置访问网络
  16. zz:使用Monkeyrunner进行Android自动化的总结
  17. html5 javascript写法,9 个强大而非主流的JS写法(各种 Hack 写法)
  18. iOS-推送自定义提示音
  19. 深信服EDS分布式存储第三方服务器安装教程(戴尔服务器IPMI)
  20. 转:程序猿也爱学英语

热门文章

  1. 51单片机基础——串口通信发送字符ab控制流水灯
  2. Redis 取消保护模式
  3. 几行代码,让黑白老照片重获新生!
  4. Python实用模块
  5. android mysql 驱动_Java-使用com.mysql.jdbc.Driver的Android MySQL
  6. 洋葱模型php,PHPIZE的作用 - tree2013的个人空间 - OSCHINA - 中文开源技术交流社区
  7. 台式计算机碟片怎么安装,怎样用光盘从装台式电脑系统?
  8. 弹出框样式,swal is not define
  9. 电商私域流量搭建规划社群运营推广sop销售转化计划书表格模板方案
  10. 什么是水货?如何辨别水货手机?水货手机能不能用?