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

如何在Unity Inspector中显示武器对象列表并实现选择功能?

如何在Unity Inspector中显示武器对象列表并实现选择功能?

兄弟,我看你现在是想在Unity Inspector里能直接选已定义好的武器,把脚本挂在交互物体上,让玩家能读取选中武器的属性对吧?咱一步步来改你的代码,解决这个问题:

首先说你当前代码的小问题

你的WeaponProperties是嵌套在MonoBehaviour里的类,而且没加序列化标记,Unity Inspector根本识别不了它;另外你现在把每个武器做成单独的public变量,没法直接在Inspector里做下拉选择,得调整结构。


方案一:基础序列化类+列表管理(适合小型项目快速实现)

1. 让WeaponProperties支持Unity序列化

先给这个类加上[System.Serializable]属性,让Unity能把它显示在Inspector里,最好把它从嵌套类里移出来(单独放一个文件更规范,比如WeaponProperties.cs):

[System.Serializable]
public class WeaponProperties
{
    public int weaponDamage;
    public int weaponMaxAmmo;
    public float weaponReloadTime;
    public float weaponCadence;
    public float weaponLength; // 这里给你修正了拼写,原来是weaponLenght
    [SerializeField] private string weaponID;
    public string WeaponID => weaponID; // 用只读属性封装更规范
    public int weaponMagSize;

    // 保留你的构造函数
    public WeaponProperties(string WeaponID,
                            int WeaponDamage,
                            int WeaponMaxAmmo, 
                            int WeaponMagSize,
                            float WeaponReloadTime,
                            float WeaponCadence,
                            float WeaponLength)
    {
        weaponDamage = WeaponDamage;
        weaponMaxAmmo = WeaponMaxAmmo;
        weaponReloadTime = WeaponReloadTime;
        weaponCadence = WeaponCadence;
        weaponLength = WeaponLength;
        weaponMagSize = WeaponMagSize;
        weaponID = WeaponID;
    }
}

2. 调整武器库脚本,实现Inspector选择

把原来单独的武器变量改成一个可序列化的列表,再加一个选中武器的字段,这样就能在Inspector里管理所有武器,还能直接选要绑定的武器:

using UnityEngine;
using System.Collections.Generic;

public class WeaponDatabase : MonoBehaviour // 把类名改成更贴合的WeaponDatabase
{
    [Header("所有武器库")]
    public List<WeaponProperties> allWeapons = new List<WeaponProperties>();

    [Header("当前绑定的武器")]
    [SerializeField] private WeaponProperties selectedWeapon;

    private void Awake()
    {
        // 初始化你的武器,也可以直接在Inspector里点击allWeapons的"+"按钮手动添加
        allWeapons.Add(new WeaponProperties("Pitola", 1, 24, 6, 3f, 0.6f, 0.1f));
        allWeapons.Add(new WeaponProperties("Rifle", 3, 24, 10, 3f, 1.0f, 0.1f));
    }

    // 给交互脚本提供获取选中武器的方法
    public WeaponProperties GetSelectedWeapon()
    {
        return selectedWeapon;
    }

    // 测试用:比如玩家交互时调用这个方法打印属性
    public void ShowWeaponInfo()
    {
        if(selectedWeapon == null)
        {
            Debug.Log("还没选中任何武器!");
            return;
        }

        Debug.Log($"武器ID:{selectedWeapon.WeaponID}");
        Debug.Log($"伤害:{selectedWeapon.weaponDamage}");
        Debug.Log($"总弹药:{selectedWeapon.weaponMaxAmmo}");
        // 其他属性同理
    }
}

3. 怎么用?

把这个WeaponDatabase脚本挂到你要让玩家交互的GameObject上,在Inspector里:

  • 你可以看到allWeapons列表里的所有武器
  • 在当前绑定的武器下拉框里(或者直接拖)选择你要的武器
  • 写交互逻辑(比如用OnTriggerEnter或者UI按钮),调用ShowWeaponInfo()或者GetSelectedWeapon()就能读取属性了

进阶方案:用ScriptableObject做武器数据库(推荐中大型项目)

如果你的武器会越来越多,用ScriptableObject更方便——武器数据会变成单独的资源文件,和代码完全分离,不用改代码就能加新武器:

1. 创建WeaponData ScriptableObject

新建一个WeaponData.cs文件:

using UnityEngine;

[CreateAssetMenu(fileName = "New Weapon", menuName = "Weapons/Create New Weapon")]
public class WeaponData : ScriptableObject
{
    public string weaponID;
    public int weaponDamage;
    public int weaponMaxAmmo;
    public int weaponMagSize;
    public float weaponReloadTime;
    public float weaponCadence;
    public float weaponLength;
}

2. 创建武器资源

在Project窗口右键 → Weapons → Create New Weapon,会生成一个.asset文件,双击它就能在Inspector里填武器参数(比如Pitola、Rifle各做一个)。

3. 交互脚本里用

using UnityEngine;

public class InteractiveWeaponInfo : MonoBehaviour
{
    [Header("选中的武器")]
    [SerializeField] private WeaponData selectedWeapon;

    // 玩家交互时调用这个方法
    public void DisplayWeaponInfo()
    {
        if(selectedWeapon == null)
        {
            Debug.Log("未绑定武器!");
            return;
        }

        Debug.Log($"【{selectedWeapon.weaponID}】属性:");
        Debug.Log($"伤害:{selectedWeapon.weaponDamage} | 弹匣容量:{selectedWeapon.weaponMagSize}");
        Debug.Log($"总弹药:{selectedWeapon.weaponMaxAmmo} | 换弹时间:{selectedWeapon.weaponReloadTime}s");
    }
}

把这个脚本挂到交互物体上,在Inspector里直接拖对应的武器.asset文件到selectedWeapon字段就行,超级方便!


备注:内容来源于stack exchange,提问作者user32461849

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.13 18:32:59