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

Unity游戏全屏正常但窗口模式异常,点击红球无响应技术求助(已更新)

问题分析与解决方案

首先,你的问题核心是全屏模式下点击红球正常,但窗口模式无响应,结合你提供的代码和macOS环境,我找到了几个关键问题点:

1. 光标锁定导致窗口模式下无法交互

你的Cam脚本在Start()方法里强制锁定了光标并隐藏:

Cursor.lockState = CursorLockMode.Locked;
Cursor.visible = false;

在全屏模式下,光标锁定是合理的,但窗口模式下,CursorLockMode.Locked会把光标固定在窗口中心,无法移动到红球位置,自然无法触发点击检测。

修复方案:

根据游戏运行的窗口状态动态调整光标锁定状态,修改Cam脚本如下:

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 bool isFullScreen;

    private void Start() {
        isFullScreen = Screen.fullScreen;
        // 初始化时根据窗口状态设置光标
        SetCursorState(isFullScreen);
    }

    private void Update() {
        // 检测窗口/全屏切换,动态更新光标状态
        if (Screen.fullScreen != isFullScreen) {
            isFullScreen = Screen.fullScreen;
            SetCursorState(isFullScreen);
        }

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

    // 封装光标状态设置逻辑
    private void SetCursorState(bool isFullScreen) {
        if (isFullScreen) {
            Cursor.lockState = CursorLockMode.Locked;
            Cursor.visible = false;
        } else {
            Cursor.lockState = CursorLockMode.None;
            Cursor.visible = true;
        }
    }
}

2. Camera.main的潜在不稳定问题

你的Loop脚本里用Camera.main.ScreenPointToRay(),但Camera.main依赖相机的MainCamera标签,若标签误改或场景存在多相机,会导致射线检测失效。

修复方案:

直接通过你已声明的相机引用获取射线,替代Camera.main

// 在Loop脚本的Update()方法中修改射线生成逻辑
if (Input.GetMouseButtonDown(0) && isRunning) {
    RaycastHit hit;
    // 改用已引用的相机创建射线,避免依赖标签查找
    Ray ray = cam.GetComponent<Camera>().ScreenPointToRay(Input.mousePosition);
    if (Physics.Raycast(ray, out hit)) {
        if (hit.transform.tag == "Target") {
            Destroy(hit.transform.gameObject);
            points++;
            touched++;
            click++;
            timeRemaining += timeAdded;
            GenerateTargets(minPos, maxPos);
        } else if (hit.transform.tag == "Back") {
            points -= 0.5f;
            missed++;
            click++;
            timeRemaining -= timeRemoved;
        }
    }
}

3. macOS特有的额外检查点

在macOS下,窗口模式偶尔会出现输入干扰,你可以补充检查:

  • 确保红球(Target)对象带有匹配模型的Collider组件(全屏正常大概率没问题,但窗口分辨率变化可能导致碰撞体适配问题)
  • 在Player Settings中,将Resolution and Presentation下的Fullscreen Mode设为Windowed,并勾选Resizable Window
  • 测试时关闭macOS的“自动隐藏菜单栏”和“自动隐藏Dock”,避免系统UI干扰Unity输入检测

优先尝试第一个光标锁定的修复,这大概率是窗口模式点击失效的核心原因。如果还有问题,再依次排查后面的点。

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

火山引擎 最新活动