Unity中LineRenderer私有/公有List显示差异问题咨询
问题原因分析
你的代码核心问题是**private List<Vector3> wayPointsPositions;没有初始化**:
- 当把这个List设为
public时,Unity的序列化系统会自动帮你实例化这个List(因为它会在Inspector面板中显示,Unity会为可序列化的public引用类型字段创建实例),所以wayPointsPositions.Add()能正常执行,后续设置LineRenderer的代码也能顺利跑完,线条自然正常显示。 - 改成
private后,如果你不在代码里手动用new List<Vector3>()初始化,这个变量就是null,调用Add()方法时会触发空引用异常,导致Start()方法里后续的lineRenderer.positionCount和lineRenderer.SetPositions()代码根本没执行,所以看不到线条。
修正方法很简单,声明时直接初始化:
private List<Vector3> wayPointsPositions = new List<Vector3>();
Unity中类似需要注意的情况
- 序列化字段的自动实例化差异:
- public字段或加了
[SerializeField]标签的private字段,Unity序列化系统会自动实例化List、自定义类实例这类引用类型;但未标记的private引用类型不会被自动初始化,必须手动new。
- public字段或加了
- Inspector面板的序列化影响:
- 要是private字段需要在Inspector里编辑,必须加
[SerializeField],否则Unity不会序列化它,也不会自动初始化。反过来,不想让public字段显示在Inspector的话,可以加[HideInInspector],但Unity依然会自动初始化它(因为它属于可序列化的public字段)。
- 要是private字段需要在Inspector里编辑,必须加
- 空引用异常的高频场景:
- 组件引用:比如
private LineRenderer lineRenderer;如果不在Start/Awake里用GetComponent获取,或者挂载脚本的对象上没有这个组件,就会变成null。(不过你这里已经正确获取了,所以没问题) - 资源引用:private的Texture、AudioClip等资源变量,要是不手动在Inspector拖入赋值或通过代码加载,也会是null;而public的可以直接在Inspector里拖入赋值。
- 组件引用:比如
内容的提问来源于stack exchange,提问作者keepupwiththetimes
相关产品推荐
相关产品推荐

