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
相关产品推荐
相关产品推荐

