Unity功能点---模拟枪械射击时的后坐力
生活随笔
收集整理的這篇文章主要介紹了
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功能点---模拟枪械射击时的后坐力的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: pycharm中的红色小闪电
- 下一篇: fileReader学习-前端展示本地图