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); // 恢复之前的旋转
}
}
效果展示
热门推荐
云南臭参变身“香饽饽”:年产值3640万元助力乡村振兴
“小臭参”变身“香饽饽”:寻甸县金源乡的致富密码
《雪中悍刀行》教你如何打造高光角色
黄种人迁徙史:从白令海峡到“冰城”的人类史诗
周彻:嫁入皇室的名将之女,三国时期最悲怜的女性
春季防毒蘑菇,幼儿园安全教育指南
和田玉蘑菇:美味还是陷阱?
毒蘑菇中毒自救指南:从应急处理到预防要点
《斗罗大陆》:玄机出品,国漫巅峰!
肖战版《斗罗大陆》:唐三最受欢迎,小舞加戏引发争议
唐家三少揭秘:如何打造《斗罗大陆》奇幻世界?
个人绩效考评意见中,如何平衡肯定和批评?
如何收集客户反馈:5个实践方法
如何确保供应商管理体系符合法律法规?
龙虎山无蚊村:揭秘神奇自然生态
江西龙虎山无蚊村:避暑胜地的秘密
胆囊息肉样病变的危害及应对方法
如何在情人节找到自我爱?探索心理健康的重要性
碳纤维钓鱼竿:钓友最爱的神器!
太平洋西北部的迷幻蘑菇:从自然奇观到心理治疗新希望
新媒体运营中的数据分析与决策优化
解密直播间冲动消费:李佳琪薇娅如何影响你的购物决策?
春节档大片来袭!灯塔App助你精准预测票房
你会正确使用灭火器么?
深圳湾公园&大鹏所城:必打卡的一日游路线!
GB/T4237-2015:不锈钢板厚度公差详解
GB/T709-2019:不锈钢板厚度公差新标准解析
森林探险:一场心灵的旅程
《锦囊妙录》:古装悬疑探案剧,能否再创唐人当年的精品口碑?
UI设计优化细节分享,提升界面设计水平