Unity C#报错CS1022:尝试从列表随机选取GameObject生成时出错
错误CS1022的排查与修复
你的代码存在3个核心问题,直接导致了CS1022错误,以下是具体问题和修复方案:
问题1:类成员不能用var隐式声明
C#中类的字段不允许用var隐式推断类型,必须显式指定类型。你的squareslist字段需要明确声明为List<GameObject>。
问题2:局部变量不能添加访问修饰符
在Start方法的循环内,private GameObject objectToSpawn是非法写法——局部变量不允许使用private这类访问修饰符,直接去掉private即可。
问题3:Random类调用错误+列表初始化时机不当
random.Next中的random需要大写为Random(System.Random类的首字母需大写),且需要实例化Random对象;或者更推荐使用Unity内置的Random.Range方法,适配Unity的随机数逻辑。- 直接在类初始化阶段创建
squareslist,可能导致greenSquare等public对象未完成编辑器赋值(Unity的public字段在Awake阶段后才完成赋值),建议移到Start方法内初始化列表。
修正后的完整代码
using System.Collections; using System.Collections.Generic; using UnityEngine; using System; public class Spawner : MonoBehaviour { public float moveX; public float moveXIncrease; public GameObject greenSquare; public GameObject blueSquare; public GameObject pinkSquare; public GameObject greySquare; // 显式声明列表类型,添加private修饰符避免编辑器暴露 private List<GameObject> squareslist; void Start() { // 在Start中初始化列表,确保public对象已完成赋值 squareslist = new List<GameObject>{greenSquare, blueSquare, pinkSquare, greySquare}; for (int i = 0; i < 5; i++) { // 使用Unity内置随机数方法获取索引 int index = Random.Range(0, squareslist.Count); // 去掉不必要的private修饰符 GameObject objectToSpawn = squareslist[index]; // 增加空值判断,避免未赋值对象导致空引用错误 if(objectToSpawn == null) continue; Vector3 newPos = new Vector3(objectToSpawn.transform.position.x + moveX, objectToSpawn.transform.position.y, objectToSpawn.transform.position.z); Instantiate(objectToSpawn, newPos, objectToSpawn.transform.rotation); moveX += moveXIncrease; } } }
内容的提问来源于stack exchange,提问作者M. Amenta
相关产品推荐
相关产品推荐

