You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Unity 3D:触发进入时锁定FPS控制器相机旋转及解决相机仍旋转问题

解决Unity FPS控制器相机旋转锁定与游戏结束逻辑问题

首先,你遇到的相机仍可旋转的核心原因是:标准资源的FPS控制器里的MouseLook组件不受Time.timeScale = 0影响——它直接读取鼠标硬件输入(Input.GetAxis),而输入系统是独立于时间缩放的。所以光靠设置时间缩放和相机初始角度是不够的,得直接控制MouseLook组件。

结合你的现有代码,给你两种可行的优化方案:

方案一:批量禁用MouseLook组件(推荐)

标准FPS控制器通常包含两个MouseLook组件:一个挂载在玩家主体(控制角色左右旋转),另一个挂载在相机(控制镜头上下旋转)。我们可以一次性找到并禁用它们:

  1. 先在脚本里补充FPS控制器对象的引用:
public GameObject canvas;
public Transform cameraTransform; // 给变量改个更清晰的名字
public GameObject fpsPlayer; // 把你的FPS控制器对象拖到这个字段里

void Start() {
    canvas.gameObject.SetActive(false);
}
  1. 修改OnTriggerEnter方法,添加锁定逻辑:
void OnTriggerEnter(Collider col) {
    // 显示游戏结束UI
    canvas.gameObject.SetActive(true);
    
    // 停止游戏时间相关逻辑
    Time.timeScale = 0;
    
    // 将相机固定到指定角度
    cameraTransform.rotation = Quaternion.Euler(0, 0, 0);
    
    // 找到并禁用所有MouseLook组件,停止相机/角色旋转控制
    MouseLook[] mouseLookComponents = fpsPlayer.GetComponentsInChildren<MouseLook>();
    foreach (MouseLook ml in mouseLookComponents) {
        ml.enabled = false;
    }
    
    // 解锁鼠标,方便玩家操作结束UI(比如重启按钮)
    Cursor.lockState = CursorLockMode.None;
    Cursor.visible = true;
}

方案二:精准控制单个组件

如果你清楚FPS控制器的结构,也可以直接指定禁用移动和旋转脚本:

void OnTriggerEnter(Collider col) {
    canvas.gameObject.SetActive(true);
    Time.timeScale = 0;
    cameraTransform.rotation = Quaternion.Euler(0, 0, 0);
    
    // 禁用玩家移动控制脚本
    fpsPlayer.GetComponent<FPSInputController>().enabled = false;
    // 禁用相机旋转控制脚本
    cameraTransform.GetComponent<MouseLook>().enabled = false;
    
    // 解锁鼠标
    Cursor.lockState = CursorLockMode.None;
    Cursor.visible = true;
}

额外小贴士:

  • 不要依赖Time.timeScale = 0停止所有交互:输入类API(比如Input.GetAxis)不受时间缩放影响,必须直接禁用处理输入的组件才能彻底停止玩家操作。
  • 解锁鼠标是为了让玩家能和结束UI交互,如果你的游戏结束后不需要操作,可以忽略最后两行鼠标相关代码。

内容的提问来源于stack exchange,提问作者Naylinhtun

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 19:53:16