C#(Unity)实现FPS游戏后坐力 解决MouseLook脚本重置相机旋转问题
你的问题根源是MouseLook脚本每帧都直接通过内部维护的xRotation变量计算相机旋转并强制赋值,完全覆盖了其他脚本对相机旋转的修改,所以后坐力的改动会被每帧重置。
以下是两种可直接落地的实现方案:
方案1:修改MouseLook脚本,新增后坐力接口(最稳定)
直接在原有视角控制逻辑中加入后坐力偏移计算,确保后坐力和鼠标输入的旋转可以叠加生效,修改后的代码如下:
using UnityEngine; public class MouseLook : MonoBehaviour { public float mouseSensitivity = 1500f; public Transform playerBody; // 后坐力衰减系数,数值越大后坐力回弹越快 public float recoilDecay = 15f; float xRotation = 0f; // 新增后坐力偏移变量,分别对应垂直、水平方向的后坐力 float recoilXOffset = 0f; float recoilYOffset = 0f; void Start() { Cursor.lockState = CursorLockMode.Locked; } void Update() { float mouseX = Input.GetAxis("Mouse X") * mouseSensitivity * Time.deltaTime; float mouseY = Input.GetAxis("Mouse Y") * mouseSensitivity * Time.deltaTime; xRotation -= mouseY; xRotation = Mathf.Clamp(xRotation, -90f, 90f); // 每帧衰减后坐力偏移,实现自动回弹效果 recoilXOffset = Mathf.Lerp(recoilXOffset, 0f, recoilDecay * Time.deltaTime); recoilYOffset = Mathf.Lerp(recoilYOffset, 0f, recoilDecay * Time.deltaTime); // 计算最终旋转时叠加后坐力偏移 transform.localRotation = Quaternion.Euler(xRotation + recoilXOffset, recoilYOffset, 0f); // 水平后坐力可以叠加到人物身体旋转上,也可以只加在相机上,根据需求调整 playerBody.Rotate(Vector3.up * (mouseX + recoilYOffset * Time.deltaTime)); } // 公共方法,给武器脚本开枪时调用,传入后坐力数值 public void AddRecoil(float recoilX, float recoilY) { recoilXOffset += recoilX; recoilYOffset += recoilY; } }
使用方法:在开枪逻辑中获取相机上的MouseLook组件,调用AddRecoil方法即可,示例:
// 垂直后坐力一般为正数,代表镜头上抬;水平后坐力可以加随机值模拟左右偏移 mouseLook.AddRecoil(Random.Range(0.8f, 1.2f), Random.Range(-0.3f, 0.3f));
方案2:层级拆分法(无需修改原有MouseLook代码)
如果你不想改动已经跑通的MouseLook逻辑,可以通过调整节点层级实现:
- 给相机新增一个父节点,把原来挂在相机上的
MouseLook脚本移到这个父节点上 - 后坐力的旋转逻辑直接写在相机节点上,修改相机本身的
localRotation即可
这种方式下MouseLook控制父节点的旋转,后坐力控制相机相对父节点的偏移,两者互不干扰,也不会出现被重置的问题。
内容的提问来源于stack exchange,提问作者Big Nickel
相关产品推荐
相关产品推荐

