Unity中创建BuildingScript实例存入列表失败,能否脱离GameObject存储?
问题解答
首先明确两种核心情况:
- 如果你的
BuildingScript是普通C#类(未继承MonoBehaviour):完全允许直接用new创建实例并存储在列表中,不需要依附GameObject,这种操作合法且正常。你提到的最后一行添加失败,大概率是buildingsList未初始化(比如仅声明了List<BuildingScript> buildingsList;但未执行buildingsList = new List<BuildingScript>();),或是列表类型与实例不匹配导致的。 - 如果你的
BuildingScript继承了MonoBehaviour:绝对不能用new BuildingScript()创建实例!MonoBehaviour是Unity的组件类,必须依附在GameObject上才能被Unity的生命周期系统管理,直接new出来的实例无法正常工作(无法触发生命周期函数、访问组件相关属性,甚至会引发异常)。这种场景下你需要通过挂载组件的方式创建实例:// 创建空GameObject并挂载组件 GameObject buildingHolder = new GameObject("BuildingPlaceholder"); BuildingScript _placeholder = buildingHolder.AddComponent<BuildingScript>(); // 后续赋值逻辑不变 _placeholder.SO_of_This = GameManager.instance.buildingArray[_idInt]; buildingsList.Add(_placeholder);
如果你的BuildingScript仅用于存储数据(比如当前场景里只需要存SO引用、自定义数据),建议直接改成普通C#类,去掉MonoBehaviour继承,这样代码逻辑更简洁,也不会有组件绑定的限制。
内容的提问来源于stack exchange,提问作者Nietzsche
相关产品推荐
相关产品推荐

