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

Unity中如何不通过UI按钮点击、直接从C#代码显示模态弹窗面板

Unity通过C#代码控制UI面板显隐的问题修复

错误方案分析

直接实例化MonoBehaviour类的问题

  • 继承自MonoBehaviour的脚本无法通过new关键字直接创建实例,这是Unity引擎的固定规则:MonoBehaviour必须绑定到场景中的GameObject对象上才能正常运行,直接new出来的实例没有关联任何场景对象,内部引用的Panel、canvasGroup等字段都会为空,触发空引用报错。

单例方案的缺失逻辑

现有单例仅声明了静态属性,缺少初始化赋值逻辑,导致静态的Instance始终为空,调用时自然触发空引用错误。

完整修复步骤

步骤1:补全PromotionPanel的单例逻辑

public class PromotionPanel : MonoBehaviour
{
    public static PromotionPanel Instance { get; private set; }
    // 你的其他公开字段,比如Panel、canvasGroup、promotion等,按实际类型修改
    public GameObject Panel;
    public CanvasGroup canvasGroup;
    public int promotion;

    private void Awake()
    {
        // 单例唯一性校验
        if (Instance != null && Instance != this)
        {
            Destroy(gameObject);
            return;
        }
        Instance = this;
    }

    // 修正后的Show方法
    public void Show()
    {
        // 原逻辑写反,显示面板需要先激活对象
        Panel.gameObject.SetActive(true);
        canvasGroup.alpha = 1f;
        canvasGroup.interactable = true;
        canvasGroup.blocksRaycasts = true;
    }

    // 可选配套Hide方法
    public void Hide()
    {
        Panel.gameObject.SetActive(false);
    }
}

步骤2:确认场景配置

  • 确保场景中存在且仅存在一个激活状态的GameObject,挂载了上述PromotionPanel脚本
  • 确保脚本的Panel、canvasGroup等公开字段都在Inspector面板中正确赋值,参考配置截图:
    Unity引用配置

步骤3:调用方式

修复完成后直接通过单例调用即可:

PromotionPanel.Instance.Show();
p2 = PromotionPanel.Instance.promotion;

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 14:36:07