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

Unity概览相机模式下鼠标点击无法放置物体问题排查

概览相机模式下鼠标左键点击无响应的排查与解决

问题场景

启用overview(概览)相机后,尝试通过鼠标左键点击放置物体,但切换到该相机后点击左键无任何反应。添加调试日志后发现PlaceBox方法中Input.GetMouseButtonDown(0)内的日志均未执行,其余日志正常输出,Unity编辑器无报错,怀疑与相机切换有关。

提供的代码

public void InputHandler()
{
    if (pickUpText.enabled)
    {
        // Handle picking up the box
        if (Input.GetKeyDown(pickUpKey))
        {
            overview.transform.position = cameraSpawnPosition;
            Destroy(box1);
            playerFirstPerson.enabled = false;
            overview.enabled = true;
            isOverviewCameraOn = true;
            Debug.Log(isOverviewCameraOn);
        }
    }
    
    if (isOverviewCameraOn)
    {
        Debug.Log("Overview camera is on, waiting for mouse click...");
        PlaceBox();
    }
}

    
private void PlaceBox()
{
    Debug.Log("Place Box Is On Waiting For Left Click");
    
    if (Input.GetMouseButtonDown(0))
    {
        Debug.Log("Mouse Button Clicked!");

        Vector3 mousePosition = Input.mousePosition;

        Ray ray = overview.ScreenPointToRay(mousePosition);

        Debug.DrawRay(ray.origin, ray.direction * 100f, Color.red, 1f);

        LayerMask layerMask = LayerMask.GetMask("Ground");

        RaycastHit hit;
        if (Physics.Raycast(ray, out hit, Mathf.Infinity, layerMask))
        {
            Debug.Log("World Position: " + hit.point);
        }
        else
        {
            Debug.Log("No hit detected.");
        }

        spawnPlacedBox = new Vector3(hit.point.x, offsetY, hit.point.y);

        Instantiate(box2, spawnPlacedBox, Quaternion.identity);

        Debug.Log("Box Has Spawned!");
    }
}

排查与解决步骤

1. 检查鼠标输入是否被UI或其他组件拦截

  • 如果场景中有激活的UI元素(如Canvas面板、按钮)覆盖屏幕,Unity的事件系统会优先将鼠标点击事件发送给UI,导致Input.GetMouseButtonDown(0)无法触发。可以暂时隐藏所有UI,测试点击是否生效。
  • 排查其他脚本是否在监听鼠标输入,比如是否有EventSystem相关的逻辑抢占了输入事件。

2. 确认相机切换后的输入关联

  • 切换相机时,确保overview相机是当前激活的主相机,可以在切换逻辑中添加:
    overview.enabled = true;
    overview.SetCurrent(); // 确保该相机成为当前接收输入的相机
    isOverviewCameraOn = true;
    
  • 检查playerFirstPerson相机的脚本是否还在运行,即使相机被禁用,其挂载的脚本如果未禁用可能仍会处理输入,导致冲突。

3. 修正PlaceBox方法中的逻辑错误

  • 当前代码中,无论射线是否命中地面,都会直接使用hit.point生成物体,这会导致未命中时的空引用问题(虽然编辑器没报错,但可能间接影响逻辑)。同时你错误地将hit.point.y作为z轴坐标,这会导致物体位置异常。修正后的代码如下:
    private void PlaceBox()
    {
        Debug.Log("Place Box Is On Waiting For Left Click");
        
        if (Input.GetMouseButtonDown(0))
        {
            Debug.Log("Mouse Button Clicked!");
    
            Vector3 mousePosition = Input.mousePosition;
            Ray ray = overview.ScreenPointToRay(mousePosition);
            Debug.DrawRay(ray.origin, ray.direction * 100f, Color.red, 1f);
    
            LayerMask layerMask = LayerMask.GetMask("Ground");
            RaycastHit hit;
            
            if (Physics.Raycast(ray, out hit, Mathf.Infinity, layerMask))
            {
                Debug.Log("World Position: " + hit.point);
                // 修正坐标错误:使用hit.point.z作为深度轴,而非y
                spawnPlacedBox = new Vector3(hit.point.x, offsetY, hit.point.z);
                Instantiate(box2, spawnPlacedBox, Quaternion.identity);
                Debug.Log("Box Has Spawned!");
            }
            else
            {
                Debug.Log("No hit detected.");
            }
        }
    }
    

4. 确保InputHandler每帧执行

  • Input.GetMouseButtonDown(0)仅在点击的那一帧返回true,如果InputHandler不是每帧调用,会错过点击事件。需要在Update方法中调用它:
    void Update()
    {
        InputHandler();
    }
    

5. 验证isOverviewCameraOn变量的正确性

  • 在PlaceBox方法开头添加日志,确认变量状态:
    private void PlaceBox()
    {
        Debug.Log("isOverviewCameraOn: " + isOverviewCameraOn);
        Debug.Log("Place Box Is On Waiting For Left Click");
        // ... 其余逻辑
    }
    
  • 排查是否有其他脚本或逻辑意外修改了isOverviewCameraOn的值。

6. 检查Unity输入设置

  • 打开Edit > Project Settings > Input Manager,确认Mouse Button 0的映射未被修改或占用,确保输入轴配置正确。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 15:36:01