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
相关产品推荐
相关产品推荐

