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

Unity中命名空间类的公共静态变量无法在Inspector显示求助

问题解决:Unity Inspector无法显示Enemy脚本变量

核心原因

Unity的Inspector面板只会序列化非静态类实例字段,你的代码里所有要编辑的变量(atk、def、hp等)以及基础属性变量都加了static关键字——静态字段属于类本身而非单个GameObject实例,所以无论加什么序列化特性都不会在Inspector中显示。

具体修改方案

  1. 移除不必要的static关键字:把需要在Inspector编辑的字段全部改为非静态,包括基础属性和等级字段。如果需要全局访问这些属性,可以通过获取组件实例的方式实现(比如单例或场景查找)。
  2. 调整方法为非静态:SetBaseInfectionStats方法依赖非静态字段,因此也要去掉static,并在初始化生命周期函数(如Awake或Start)中调用。
  3. 按需添加序列化特性:如果字段是private但需要显示,可添加[SerializeField];类本身继承MonoBehaviour时,[System.Serializable]不是必须的,仅自定义嵌套类才需要。

修改后的示例代码

using UnityEngine;
using UnityEngine.UI;

namespace Stats
{
    public class Enemy : MonoBehaviour
    {
        // 可在Inspector编辑的属性字段(非静态)
        public int atk;
        public int def;
        public int hp;
        public int spd;
        public int mana;
        public Image enemyImage;

        // 若这些数组是每个Enemy实例独有的,改为非静态;若全局共享,保留static但无法在Inspector编辑
        public GameObject[] infectedLvlOne;
        public GameObject[] infectedLvlTwo;
        public GameObject[] infectedLvlThree;
        public GameObject[] infectedLvlFour;
        public GameObject[] infectedLvlFive;
        public GameObject[] infectedLvlSix;
        public GameObject[] infectedLvlSeven;
        public GameObject[] infectedLvlEight;
        public GameObject[] infections;

        // 基础属性(加[SerializeField]让private字段在Inspector显示)
        [SerializeField] private int baseAtk;
        [SerializeField] private int baseDef;
        [SerializeField] private int baseHp;
        [SerializeField] private int baseSpd;
        [SerializeField] private int baseMana;
        [SerializeField] private int lvl;

        private void Awake()
        {
            // 初始化属性
            SetBaseInfectionStats();
        }

        void SetBaseInfectionStats()
        {
            atk = baseAtk * lvl;
            def = baseDef * lvl;
            hp = baseHp * lvl;
            spd = baseSpd * lvl;
            mana = baseMana * lvl;
        }
    }
}

额外说明

  • 如果需要全局访问某个Enemy的属性,可以使用单例模式(确保场景中只有一个Enemy实例):
    public static Enemy Instance;
    private void Awake()
    {
        Instance = this;
        SetBaseInfectionStats();
    }
    
    其他脚本中可通过Stats.Enemy.Instance.atk直接访问。
  • 若要全局共享敌人模板数据,推荐使用ScriptableObject来存储,避免多个实例重复配置。

内容的提问来源于stack exchange,提问作者Alejandro Velasquez

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 02:23:17