Unity中初始化GameObject时如何直接添加组件并解决字段初始化报错
报错根因
你遇到的报错和创建对象、挂载组件的逻辑本身无关,属于C#语法限制:你不能在类的字段初始化阶段引用另一个非静态类成员。你当前是把创建GameObject、添加组件的代码直接写在了ChooseGameMode类的字段定义区域,没有放到Unity生命周期方法(比如Awake/Start)中执行,才会触发这个报错。
创建GameObject时直接挂载多个组件的实现方法
Unity的GameObject构造函数本身就支持传入需要初始化添加的组件类型,可一步完成对象创建+组件挂载,不需要分开多次调用AddComponent,示例代码如下:
// 构造时直接传入所有需要添加的组件类型,创建完成的对象会自带所有对应组件 GameObject mapOutline = new GameObject("MapOutline", typeof(LineRenderer), typeof(LineRenderer), typeof(LineRenderer), typeof(LineRenderer)); // 按添加顺序获取所有LineRenderer组件即可 LineRenderer[] lineRenderers = mapOutline.GetComponents<LineRenderer>(); LineRenderer top = lineRenderers[0]; LineRenderer right = lineRenderers[1]; LineRenderer bottom = lineRenderers[2]; LineRenderer left = lineRenderers[3];
正确的代码放置示例
把初始化逻辑放到Awake或者Start生命周期方法中即可正常运行,完整代码结构参考:
public class ChooseGameMode : MonoBehaviour { // 仅在类字段区域声明变量,不做初始化赋值 private GameObject mapOutline; private LineRenderer top; private LineRenderer right; private LineRenderer bottom; private LineRenderer left; void Awake() { // 所有初始化逻辑放到生命周期方法内执行 mapOutline = new GameObject("MapOutline", typeof(LineRenderer), typeof(LineRenderer), typeof(LineRenderer), typeof(LineRenderer)); LineRenderer[] lines = mapOutline.GetComponents<LineRenderer>(); top = lines[0]; right = lines[1]; bottom = lines[2]; left = lines[3]; // 后续可继续补充LineRenderer的参数配置逻辑 } }
内容的提问来源于stack exchange,提问作者George Bland
相关产品推荐
相关产品推荐

