Unity实现枪械射击后坐力效果
创作时间:
作者:
@小白创作中心
Unity实现枪械射击后坐力效果
引用
CSDN
1.
https://blog.csdn.net/pq8888168/article/details/103686706
最近要在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); // 恢复之前的旋转
}
}
效果展示
热门推荐
为什么选择成为一名软件开发工程师?——职业前景与技能解析
Excel TEXTJOIN函数使用指南
从《黑神话:悟空》看AI数字技术赋能的文化产业新模式
电子设备大观:从智能手机到智能家居,这些设备如何改变我们的生活?
如何寻找合适的创业支持资源
光伏储能逆变器系统设计与选型指南
养鱼必知:水温、酸碱度、硬度与水质的讲究
空腹血糖7.1严重吗?要注意什么
仪器压痕测试:原理、参数与应用
Unity游戏开发入门:从安装到创建你的第一个3D场景
什么是房产合同变更
私人汽油耐烧的原因是什么?如何选择和使用耐烧的汽油?
和动物相处时安全教育
日本全貌:从地理到文化的全面解读
挖掘生活宝藏,创作民间故事的艺术与灵感源泉
地球大气层——抵御附近超新星的最佳屏障
墓碑上的“故、显、先、考、妣”,分别指的是什么?看完长知识了
如何建立孩子的性别意识?
《默杀》:一部揭示社会阴暗面的悬疑犯罪片
仓储行业增值税费率详解及仓储费用税率分析
员工和公司的关系对企业文化有什么影响?
人工智能在教育领域的应用:机遇与挑战
红外碳氢分析仪原理维修维保基础
彭罗斯三角
详尽指南:如何填写及查询收款银行联行号,确保交易无误
医生解答:柿子对胃部的六大影响及食用建议
医院临床会诊流程图解
司法路上的不懈追寻 | 关于法院送达,你了解多少?
企业如何组织安全培训 提升员工安全意识与应急能力
数字孪生与智慧城市:城市规划和服务的新时代