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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 03:21:02