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

Unity报错“无法将窗口重父级到建议父对象”及按钮失效求助

问题描述

我正在Unity中开发一款名为HOMEMADE - House Designer的游戏,作为Unity和C#新手,我搭建了游戏菜单并编写脚本,此前音乐、菜单等功能均正常。但尝试为按钮添加点击音效后,C#编译器无错误,Unity控制台却报错:

Unity Cannot reparent window to suggested parent. Window will not automatically close. UnityEditor.EditorGUI:PropertyField (UnityEngine.Rect,UnityEditor.SerializedProperty,UnityEngine.GUIContent)

所有按钮的高亮、按压效果失效,无法点击按钮或打开菜单,重置Unity及电脑均无效。该项目对我很重要,附上相关脚本:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.SceneManagement;
using UnityEngine.Audio;

public class HOMEMADE : MonoBehaviour
{
    //assossiations
    [SerializeField] private GameObject CreateNewDesignMenu;
    [SerializeField] private GameObject LoadDesignMenu;
    [SerializeField] private GameObject CreateNew3DModelMenu;
    [SerializeField] private GameObject Load3DModelMenu;
    [SerializeField] private GameObject OptionsMenu;
    [SerializeField] private GameObject ContinueCreateNewDesignMenu;
    [SerializeField] private GameObject ErrorMessageCNDM;
    [SerializeField] private GameObject Mountains;
    [SerializeField] private GameObject Forest;
    [SerializeField] private GameObject City;
    [SerializeField] private GameObject BrickWall;
    [SerializeField] private GameObject Sky;
    [SerializeField] private GameObject Grass;
    [SerializeField] private GameObject Dirt;
    [SerializeField] private GameObject Sand;
    [SerializeField] private GameObject Snow;
    [SerializeField] private GameObject Street;
    [SerializeField] private GameObject Park;
    [SerializeField] private GameObject Dawn;
    [SerializeField] private GameObject Noon;
    [SerializeField] private GameObject Dusk;
    [SerializeField] private GameObject Night;
    [SerializeField] private GameObject FOVSlider;
    [SerializeField] private GameObject MovementSpeedSlider;
    [SerializeField] private GameObject SensitivitySlider;
    [SerializeField] private GameObject ShadingEffectsOn;
    [SerializeField] private GameObject ShadingEffectsOff;
    [SerializeField] private GameObject QuitGameErrorMessage;

    //turn off panels
    public void Start()
    {
        CreateNewDesignMenu.SetActive(false);
        LoadDesignMenu.SetActive(false);
        CreateNew3DModelMenu.SetActive(false);
        Load3DModelMenu.SetActive(false);
        OptionsMenu.SetActive(false);
        QuitGameErrorMessage.SetActive(false);
        //ContinueCreateNewDesignMenu.SetActive(false);
        //ErrorMessageCNDM.SetActive(false);
    }


    // 1.- Create New Design
    public void CreateNewDesign()
    {
        CreateNewDesignMenu.SetActive(true);
        OptionsMenu.SetActive(false);
        QuitGameErrorMessage.SetActive(false);
    }

    public void CloseCreateNewDesign()
    {
        CreateNewDesignMenu.SetActive(false);
    }

    public void GetInputs()
    {

    }

    public void CloseContinueCreateNewDesign()
    {
        ContinueCreateNewDesignMenu.SetActive(false);
    }

    public void CloseErrorMessageCNDM()
    {
        ErrorMessageCNDM.SetActive(false);
    }

    // 2.- Load Design
    public void LoadDesign()
    {
        LoadDesignMenu.SetActive(true);
        OptionsMenu.SetActive(false);
        QuitGameErrorMessage.SetActive(false);
    }

    public void CloseLoadDesign()
    {
        LoadDesignMenu.SetActive(false);
    }


    // 3.- Create New 3D Model
    public void CreateNew3DModel()
    {
        CreateNew3DModelMenu.SetActive(true);
        OptionsMenu.SetActive(false);
        QuitGameErrorMessage.SetActive(false);
    }

    public void CloseCreateNew3DModel()
    {
        CreateNew3DModelMenu.SetActive(false);
    }



    // 4.- Load 3D Model
    public void Load3DModel()
    {
        Load3DModelMenu.SetActive(true);
        OptionsMenu.SetActive(false);
        QuitGameErrorMessage.SetActive(false);
    }

    public void CloseLoad3DModel()
    {
        Load3DModelMenu.SetActive(false);
    }



    // 5.- Options
    public void Options()
    {
        OptionsMenu.SetActive(true);
        QuitGameErrorMessage.SetActive(false);
    }

    public void CloseOptions()
    {
        OptionsMenu.SetActive(false);
    }



    // 6.- Quit Game
    public void QuitGame()
    {
        QuitGameErrorMessage.SetActive(true);
        OptionsMenu.SetActive(false);
    }

    public void QuitGameYes()
    {
        Application.Quit();
    }

    public void QuitGameNo()
    {
        QuitGameErrorMessage.SetActive(false);
    }


    //set volume    

    private GameObject MusicVolumeSlider;

    public void OnMusicValueChange(float newMusicValue)
    {
        GetComponent<AudioSource>().volume = newMusicValue;
        Debug.Log(GetComponent<AudioSource>().volume);
    }
}

解决思路

1. 排查UI交互核心组件问题

  • 检查场景中是否存在多个EventSystem对象,多个EventSystem会直接导致UI点击失效,保留一个即可
  • 确认所有按钮的Interactable属性为true,Selectable组件的过渡效果未被误删或修改
  • 检查按钮添加音效时,是否覆盖了原有的OnClick()事件绑定,或者误删了按钮的Button组件

2. 修复序列化数据损坏问题

  • 检查脚本中所有[SerializeField]标记的字段,确认拖入的引用对象没有被删除或丢失(比如菜单面板是否存在)
  • 将HOMEMADE脚本从挂载的GameObject上移除,保存场景后重新挂载,并重新赋值所有序列化引用,强制刷新序列化数据
  • 删除项目目录下的Library文件夹,重启Unity让其重新生成编辑器缓存(操作前备份项目)

3. 分离音效与菜单逻辑

单独创建音效管理脚本,避免与菜单逻辑耦合:

using UnityEngine;
using UnityEngine.UI;

public class ButtonSoundManager : MonoBehaviour
{
    [SerializeField] private AudioClip clickSound;
    private AudioSource audioSource;

    void Awake()
    {
        audioSource = GetComponent<AudioSource>();
        if (audioSource == null)
        {
            audioSource = gameObject.AddComponent<AudioSource>();
        }
    }

    public void PlayClickSound()
    {
        audioSource.PlayOneShot(clickSound);
    }
}

将该脚本挂载到空对象上,给每个按钮的OnClick()事件添加该对象的PlayClickSound()方法,不修改原菜单脚本。

4. 检查Canvas与渲染设置

  • 确认所有菜单UI都在同一个Canvas下,且Canvas渲染模式设为Screen Space - Overlay(适合菜单场景)
  • 检查EventSystem的Standalone Input Module组件是否启用,输入设置是否正常

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 02:27:45