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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 17:03:11