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

ScriptableObject未生效,运行时引用变为None的技术问题

问题原因与解决办法

核心问题是Awake方法里的weaponsData = new Weapons[totalWeapons];把编辑器中手动赋值的ScriptableObject数组覆盖了——运行游戏时这行代码会创建一个全新的空数组,导致你之前选的对象全部丢失,变成None。

具体修复步骤

  • 删掉Awake里的weaponsData = new Weapons[totalWeapons];,保留编辑器中给weaponsData数组赋值的内容。
  • 用weaponsData.Length替代硬编码的totalWeapons,避免数组长度和总数不一致:
    把public int totalWeapons = 2;改成public int totalWeapons => weaponsData.Length;,或者在Awake开头加totalWeapons = weaponsData.Length;(后续要修改武器总数,直接调整编辑器里的数组长度即可)。
  • 修正scroll方法里的硬编码错误:原来的currentWeapon = weaponsData[1];是固定取第二个元素,应该改成currentWeapon = weaponsData[currentWeaponIndex];,确保切换武器时对应索引的配置。
  • 在Awake中初始化currentWeapon,避免refreshWeapon触发空引用:在currentWeaponIndex = 0;后面加currentWeapon = weaponsData[currentWeaponIndex];。
  • 修正weaponHolder = this.GetComponent<GameObject>();的错误写法:GameObject不需要通过GetComponent获取,直接用this.gameObject或者gameObject即可。

修改后的关键代码示例

Awake方法

private void Awake()
{
    totalWeapons = weaponsData.Length; // 同步数组长度
    weapons = new GameObject[totalWeapons];
    
    for (int i = 0; i < totalWeapons; i++)
    {
        weapons[i] = transform.GetChild(i).gameObject;
        weapons[i].SetActive(false);
    }
    weapons[0].SetActive(true);
    currentWeaponGO = weapons[0];

    currentWeaponIndex = 0;
    currentWeapon = weaponsData[currentWeaponIndex]; // 初始化当前武器配置
    refreshWeapon();
    currentAmmo = currentWeapon.maxAmmoCapacity;
    weaponHolder = gameObject; // 修正获取方式
}

scroll方法

void scroll()
{
    if(Input.GetAxis("Mouse ScrollWheel") < 0f && currentWeaponIndex < totalWeapons -1)
    {
        weapons[currentWeaponIndex].SetActive(false);
        currentWeaponIndex += 1;
        weapons[currentWeaponIndex].SetActive(true);
        currentWeapon = weaponsData[currentWeaponIndex]; // 对应当前索引
        refreshWeapon();
    }

    if(Input.GetAxis("Mouse ScrollWheel") > 0f && currentWeaponIndex > 0)
    {
        weapons[currentWeaponIndex].SetActive(false);
        currentWeaponIndex -= 1;
        weapons[currentWeaponIndex].SetActive(true);
        currentWeapon = weaponsData[currentWeaponIndex]; // 对应当前索引
        refreshWeapon();
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 12:17:23