【问题标题】:Unity UI not working properly ONLY on WindowsUnity UI 仅在 Windows 上无法正常工作
【发布时间】:2020-02-17 11:42:50
【问题描述】:

至少两天来,我一直在努力弄清楚我的游戏 UI 发生了什么,但没有任何进展。

请注意,这是一款手机游戏,但我被要求为 Windows 构建以实现可视化和演示目的。

所以问题是,当我在 Unity Editor、Android、iOS 和 Mac 平台上运行我的游戏时,UI 运行良好,但是当我在 Windows 上运行游戏时,UI 仍然运行良好,直到我加载特定场景.

这个特定场景是一个加载屏幕(在主菜单和关卡之间),当关卡完成异步加载时,在加载屏幕的脚本中调用了一个名为 MoveObjects 的方法,以移动一些在将屏幕场景加载到关卡场景中(但这不是问题,因为我已经尝试不使用此方法并且 UI 上的问题仍然存在)。

一旦这个MoveObjects方法的逻辑完成,在加载屏幕中启用一个开始按钮,让玩家点击开始播放(我确实尝试将开始按钮移动到关卡场景,因为也许它没有可能是当前活动场景的孩子,但问题仍然存在)。此时用户界面已部分损坏,我的意思是,当鼠标移到按钮上时,我可以看到按钮(以及其他一些用户界面元素,如滚动条)改变颜色/状态,但我无法点击它们不再(按钮甚至不会变为按下状态)。

另外请注意,我尝试创建开发版本以查看控制台中是否有任何错误,并且我注意到这个问题也影响了旧的 UI 系统,因此我无法再与开发控制台进行交互。

另外,请注意,如果我在此问题出现之前抓住并拖动滚动条,并且一直按住滚动条直到发生这种情况,鼠标就会卡在滚动条上,这意味着我无法再与 UI 交互,但滚动条仍会随着鼠标移动。

  • 我已经检查过这不是问题的根源:
    • 缺少 EventSystem、GraphicRaycaster 或 InputModule。
    • 另一个 UI 元素阻塞了 UI 的其余部分。
    • Canvas 为 Screen Space - Overlay,因此无需相机参考。
    • 我只有一个EventSystem
    • Time.timeScale 是 1。

我不确定我还能尝试什么,所以如果有人有任何建议,我将不胜感激。谢谢。

P.S:很抱歉,由于机密性,我不能分享任何代码或视觉材料或示例。

【问题讨论】:

    标签: windows user-interface unity3d


    【解决方案1】:

    对我而言,UI 无法正常工作的主要原因一直是另一个(不可见的)UI 对象阻挡了光线投射(透明图像,或开启光线投射的大型文本对象)。

    这是我根据在其他地方找到的信息汇总的 sn-p,我经常使用它来跟踪在复杂 UI 情况下掩盖光线投射的对象。将组件放在一个文本对象上,确保它至少有几行高,因为结果将在另一个下显示。

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    using UnityEngine.EventSystems;
    using UnityEngine.UI;
    [RequireComponent(typeof(Text))]
    public class DebugShowUnderCursor : MonoBehaviour
    {
        Text text;
        EventSystem eventSystem;
        List<RaycastResult> list;
        void Start()
        {
            eventSystem = EventSystem.current;
            text = GetComponent<Text>();
            text.raycastTarget=false;
        }
    
        public List<RaycastResult> RaycastMouse(){
             PointerEventData pointerData = new PointerEventData (EventSystem.current)   {  pointerId = -1, };
             pointerData.position = Input.mousePosition;
             List<RaycastResult> results = new List<RaycastResult>();
             EventSystem.current.RaycastAll(pointerData, results);
             return results;
         }
        void Update()
        {
            list= RaycastMouse();
            string objects="";
            foreach ( RaycastResult result in list)
                objects+=result.gameObject.name+"\n";
            text.text = objects;
        }
    }
    

    【讨论】:

    • 感谢您的尝试,我并不是要听起来粗鲁,但我确信这不是问题,考虑到 1. 它只发生在 Windows 中(如果这是它应该在所有平台上发生的问题)和 2. 加载屏幕的层次结构并不复杂,所以我确信情况并非如此。我仍然尝试了你的脚本,它确认没有不可见的物体挡住按钮。
    • 我想检查一下也无妨。不幸的是,我不知道任何特定于系统的差异
    猜你喜欢
    • 2020-08-04
    • 2016-04-11
    • 1970-01-01
    • 2021-07-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-01
    相关资源
    最近更新 更多