Unity中标记为static的Serialized Field为何不显示在Inspector面板?
问题原因与解决办法
为什么static字段加[SerializeField]也不显示在Inspector?
Unity的序列化系统只处理类的实例成员,而static字段属于类本身,不属于任何具体的对象实例。不管你加不加[SerializeField],Unity都不会把static字段纳入序列化流程,自然不会在Inspector面板里显示。
解决办法
1. 移除static修饰符
先把size的static去掉,让它成为普通的实例字段,这样[SerializeField]就能生效,在Inspector里看到并修改它的值:
[SerializeField] int size = 0;
2. 延迟数组初始化
你原来的代码里,int[] array = makeArray(size);是在字段声明时直接初始化的,但这时候Unity还没完成对size的序列化赋值(字段初始化在Unity序列化之前执行),所以size还是默认的0,数组长度永远是0。
要解决这个问题,把数组的初始化逻辑移到Awake或Start方法里,等Unity完成序列化后再执行:
using System.Collections; using System.Collections.Generic; using UnityEngine; public class Variables : MonoBehaviour { [SerializeField] int size = 0; int index = 0; int Arraysub = 0; bool runArray = false; int[] array; // 先声明,不初始化 void Awake() { // 等Unity序列化完size的值后,再创建数组 array = makeArray(size); } int[] makeArray(int size){ // 加个判断,避免size为0时创建空数组导致逻辑无意义 if(size <= 0){ Debug.LogWarning("Size不能小于等于0,已创建长度为1的数组"); return new int[1]; } return new int[size]; } void Update() { if(size > 0){ runArray = true; } while(index < array.Length && runArray){ Arraysub++; array[index] = Arraysub; print(array[index]); index++; // 避免index超出数组长度后循环一直触发 if(index >= array.Length){ runArray = false; } } } }
额外优化:直接序列化数组
如果你不需要通过size间接控制数组长度,也可以直接序列化数组本身,这样能在Inspector里直观调整数组元素数量和值,更符合Unity常规用法:
[SerializeField] int[] array;
内容的提问来源于stack exchange,提问作者Rohman Dolezal
相关产品推荐
相关产品推荐

