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

Unity中C#委托赋值报错:ArgumentException值不在预期范围

解决Unity中委托绑定的ArgumentException错误

刚接触Unity委托踩这个坑太正常了,我帮你拆解下问题根源和修复方案:

问题核心原因

你遇到的ArgumentException本质是脚本生命周期顺序搞反了。Unity里脚本的构造函数(包括你直接在字段里赋值Del marySuccess = question.MarySuccess;的语句),会在Awake方法之前执行——这时候你的question静态字段还没被初始化,甚至GetComponent<Questions>()在构造阶段根本无法正确获取到组件实例!

当你试图从一个未就绪(甚至是null)的对象上获取方法引用时,就会触发这个“值不在预期范围内”的异常,而不是更直观的空引用异常(Unity内部的事件/委托系统有时候会把底层逻辑包装成这类异常)。

具体修复步骤

1. 推迟委托的赋值时机

把委托字段的赋值从构造函数/字段初始化,移到Awake或Start方法里,这时候组件已经完成初始化,question也能被正确获取:

// 先声明委托字段,不要直接赋值
private Del marySuccess;
private static Questions question;

private void Awake()
{
    // 先初始化question
    question = this.GetComponent<Questions>();
    // 再赋值委托,增加空检查避免后续错误
    if (question != null)
    {
        marySuccess = question.MarySuccess;
    }
    else
    {
        Debug.LogError("找不到挂载在同一物体上的Questions组件!");
    }
}

2. 确保事件绑定在委托赋值之后

把inputField.onEndEdit.AddListener的代码也移到Awake或Start里,避免委托还没赋值就被传入ProcessAnswer:

private void Start()
{
    string answer = "grace";
    float clockStart = 90f;
    // 先确认marySuccess不为空再绑定
    if (marySuccess != null)
    {
        inputField.onEndEdit.AddListener(delegate { 
            ProcessAnswer(inputField, answer, clockStart, marySuccess); 
        });
    }
}

3. 再次验证方法签名(你已完成,但做个确认)

确保Questions脚本里的MarySuccess方法签名和自定义委托完全匹配:

public void MarySuccess()
{
    // 你的业务逻辑
}

额外小建议

如果不想自己定义委托,可以直接用Unity内置的UnityAction(适合无参数、无返回值的场景),它和Unity事件系统兼容性更好,代码可以简化成:

private UnityAction marySuccess;
// 后续赋值和绑定逻辑和上面一致即可

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 10:06:44