如何在Unity的 Inspector中显示对象列表?
我在尝试为一个使用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导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。