使用Getter/Setter设置controlType导致Unity 2020.2.20崩溃,求排查
问题分析与解决
核心崩溃原因:无限递归导致栈溢出
你在config.cs里定义的controlType属性,其get和set访问器直接操作自身,会触发无限递归调用:
public CONTROL_TYPE controlType { get { return controlType; } // 调用get时会再次触发get,无限循环 set { controlType = value; } // 调用set时会再次触发set,无限循环 }
这种写法会让CPU持续执行递归,最终引发栈溢出,直接导致Unity编辑器崩溃。
修复步骤
1. 给属性添加私有存储字段
修改config.cs,用私有字段存储属性值,彻底避免递归:
public enum CONTROL_TYPE : int { TOUCH_CONTROL = 0, TILT_CONTROL = 1, }; // 私有字段存储实际值 private CONTROL_TYPE _controlType; public CONTROL_TYPE controlType { get { return _controlType; } set { _controlType = value; } }
或者用更简洁的自动属性写法(C# 3.0及以上版本支持):
public enum CONTROL_TYPE : int { TOUCH_CONTROL = 0, TILT_CONTROL = 1, }; public CONTROL_TYPE controlType { get; set; }
2. 修正menu.cs中的其他错误
- 类名规范:C#类名建议用大驼峰格式,
config应改为Config,对应引用也要同步修改 - 变量未初始化:
gameConfig需要先获取场景中的Config组件,或实例化对象 - 枚举引用错误:
GameConfig.CONTROL_TYPE应改为Config.CONTROL_TYPE(匹配类名)
修改后的menu.cs示例:
// 在Inspector面板中拖拽挂载了Config脚本的对象到此处 public Config gameConfig; void Start() { // 先检查对象是否有效,避免空引用异常 if(gameConfig != null) { gameConfig.controlType = Config.CONTROL_TYPE.TOUCH_CONTROL; } }
额外建议
- 遵循C#命名规范:类名、枚举名用大驼峰(比如
ControlType替代CONTROL_TYPE),私有字段以下划线开头,提升代码可读性 - 操作前做空引用检查,减少不必要的编辑器报错或崩溃
内容的提问来源于stack exchange,提问作者noobsee
相关产品推荐
相关产品推荐

