You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Unity游戏全屏正常但窗口模式点击红球无响应,寻求技术帮助

问题分析与解决方案

看起来你遇到的是macOS窗口模式下鼠标射线检测失效的问题,全屏模式正常,这大概率和光标锁定的系统行为差异有关,结合你的代码和macOS的特性,我整理了几个排查方向和解决方案:

1. 核心原因:CursorLockMode.Locked在macOS窗口模式下的异常行为

你的Cam脚本里设置了Cursor.lockState = CursorLockMode.Locked,在macOS的窗口模式下,这个锁定模式的行为和全屏模式不一样——它不会像Windows系统那样把光标固定在窗口中心,反而可能导致鼠标位置的输入坐标偏移,进而让ScreenPointToRay生成的射线无法正确指向红球(Target)。

解决方案:根据窗口状态调整光标锁定模式

修改Cam脚本的光标锁定逻辑,窗口模式下使用CursorLockMode.Confined(限制光标在窗口内),全屏模式保持Locked

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Cam : MonoBehaviour {
    public float speedH = 2f, speedV = 2f;
    private float yaw = 0f, pitch = 0f;

    private void Start() {
        UpdateCursorLockState();
        Cursor.visible = false;
    }

    private void Update() {
        // 监听全屏状态变化,实时调整光标锁定(可替换成你自己的全屏切换逻辑)
        if (Input.GetKeyDown(KeyCode.F11)) {
            UpdateCursorLockState();
        }

        yaw += speedH * Input.GetAxis("Mouse X");
        pitch -= speedV * Input.GetAxis("Mouse Y");
        transform.eulerAngles = new Vector3(pitch, yaw, 0f);
    }

    // 窗口/全屏切换时更新光标锁定状态
    private void UpdateCursorLockState() {
        Cursor.lockState = Screen.fullScreen 
            ? CursorLockMode.Locked 
            : CursorLockMode.Confined;
    }

    // 游戏窗口获得焦点时也更新一次
    private void OnApplicationFocus(bool hasFocus) {
        if (hasFocus) {
            UpdateCursorLockState();
        }
    }
}

2. 验证射线检测的准确性(调试步骤)

如果调整光标锁定后问题还存在,可以添加调试代码确认射线是否正确命中目标:

Loop脚本的Update方法中,添加日志和射线绘制:

private void Update() {
    if (Input.GetMouseButtonDown(0) && isRunning) {
        RaycastHit hit;
        // 直接用你引用的cam组件,避免Camera.main查找失败
        Ray ray = cam.GetComponent<Camera>().ScreenPointToRay(Input.mousePosition);
        
        // 打印鼠标位置和屏幕尺寸,对比窗口/全屏的差异
        Debug.Log($"Mouse Position: {Input.mousePosition} | Screen Size: {Screen.width}x{Screen.height}");
        // 在Scene窗口绘制红色射线,持续2秒,方便观察射线方向
        Debug.DrawRay(ray.origin, ray.direction * 100, Color.red, 2f);

        if (Physics.Raycast(ray, out hit)) {
            Debug.Log($"Hit Object: {hit.transform.name} | Tag: {hit.transform.tag}");
            if (hit.transform.tag == "Target") {
                // 原有销毁、计分等逻辑...
            } else if (hit.transform.tag == "Back") {
                // 原有扣分、计时逻辑...
            }
        } else {
            Debug.Log("Raycast did not hit any collider");
        }
    }
    // 其他原有逻辑...
}

通过这些日志,你可以快速判断:

  • 鼠标位置在窗口模式下是否有偏移
  • 射线是否指向了红球的位置
  • 射线是否命中了正确的碰撞体

3. 额外排查点:macOS Player Settings设置

打开Unity的Player Settings > macOS > Resolution and Presentation,检查以下选项:

  • Use Retina Display:如果开启后出现坐标偏移,可以尝试关闭测试
  • Fullscreen Mode:确保窗口模式下的分辨率设置正确,没有拉伸或缩放
  • Resize Window:勾选“Allow Resizing”后,窗口大小变化可能影响射线检测,建议测试固定窗口尺寸的情况

总结

最可能解决问题的是调整光标锁定模式,macOS窗口模式下ConfinedLocked更可靠。如果还是不行,通过调试代码确认射线检测的准确性,逐步排除碰撞体、相机设置等问题。

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

火山引擎 最新活动