如何在Unity的 Inspector中显示对象列表?

编程语言 2026-07-12

我在尝试为一个使用C#的游戏创建一种武器数据库。

我已经定义了每种武器应该具备的属性,这样就能轻松地继续添加武器。

但我很难找到一种方法来 [SerializeField] 一个变量,使我能够从所有可用武器中选择一个武器。

目的是把这个脚本挂载到一个 gameObject 上,玩家可以与之互动并“读取”所选武器的属性(由Unity Inspector选择)。

这是我当前用于定义武器的代码:

public class WeaponList : MonoBehaviour
{
    public class WeaponProperties
    {
        public int weaponDamage;
        public int weaponMaxAmmo;
        public float weaponReloadTime;
        public float weaponCadence;
        public float weaponLenght;
        private string weaponID;
        public string WeaponID;
        public int weaponMagSize;

        public WeaponProperties(string WeaponID,
                                int WeaponDamage,
                                int WeaponMaxAmmo, 
                                int WeaponMagSize,
                                float WeaponReloadTime,
                                float WeaponCadence,
                                float WeaponLenght)
        {
            weaponDamage = WeaponDamage;
            weaponMaxAmmo = WeaponMaxAmmo;
            weaponReloadTime = WeaponReloadTime;
            weaponCadence = WeaponCadence;
            weaponLenght = WeaponLenght;
            weaponMagSize = WeaponMagSize;
            weaponID = WeaponID;
        }
    };

    public WeaponProperties pitola = new WeaponProperties(WeaponID: "Pitola",
                        WeaponDamage: 1, WeaponMaxAmmo: 24, WeaponMagSize: 6,  WeaponReloadTime: 3,WeaponCadence: 0.6f, WeaponLenght: 0.1f);

    public WeaponProperties rifle = new WeaponProperties(WeaponID: "Rifle",
    WeaponDamage: 3, WeaponMaxAmmo: 24, WeaponMagSize: 10, WeaponReloadTime: 3,
    WeaponCadence: 1.0f, WeaponLenght: 0.1f);

解决方案

首先,我建议为这类配置文件使用 ScriptableObject

[CreateAssetMenu] // <- can be further customized via parameters
public class WeaponProperties : ScriptableObject
{
    // your fields

    // NO constructor
}

这让你可以在Project文件夹中通过右键创建资产 → WeaponProperties。然后根据需要配置每个资产。

然后在你的类中,你只需要公开一个列表/数组,你就可以把相应的配置资产拖入或选中

[SerializeField] private WeaponProperties[] _availableWeapons;

然后你就可以例如按索引来访问

[SerializeField] private int _currentSelectedIndex;

public WeaponProperties CurrentSelectedWeapon => _availableWeapons[_currentSelectedIndex];

或者甚至可以直接将其暴露为,例如

[field: SerializeField] public WeaponProperties CurrentSelectedWeapon {get; private set; }

这取决于你的需求


如果你更想要一些有意义的固定武器ID,确实可以使用一个 enum。不过,在这种情况下,我建议 SerializedDictionary,它可以让你直接序列化一个映射 enum -> WeaponProperties

public enum WeaponType
{      
    Pitola,
    Rifle
}

[SerializeField] private SerializedDictionary<Weaponype, WeaponProperties> _availableWeapons;
[SerializeField] private WeaponType _currentSelectedType;

public WeaponProperties CurrentSelectedWeapon => _avaialableWeapons[_currentSelectedType];
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章