【问题标题】:Why does this error keep popping up? Index out of range: Unity 2D/WebGL C#为什么这个错误不断出现?索引超出范围:Unity 2D/WebGL C#
【发布时间】:2019-07-29 02:48:19
【问题描述】:

我对 Unity 比较陌生,并且经常出现错误。我正在创建一个简单的 2D 游戏,玩家可以在其中向预制的敌人射击这些子弹。在 Unity 本身中,一切正常,但是当我尝试在 WebGL 中构建以在浏览器中播放时,不断弹出错误提示我的内存超出范围或索引超出范围。

我曾尝试在 chrome、firefox 和 explorer 上执行此操作,但同样的事情一直在发生。我已经尝试搜索互联网,但到目前为止还没有找到有关如何解决此问题的答案。这是我的子弹脚本的代码,如果有帮助的话。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class WebShooter : MonoBehaviour {

    public Transform firePoint;
    public GameObject bulletPrefab;

    void Update() {
        if (Input.GetKeyDown(KeyCode.Space)) {
            Shoot();
        }
    }

    void Shoot() {
        Instantiate(bulletPrefab, firePoint.position, firePoint.rotation);
    }

    private void OnTriggerEnter2D(Collider2D hitInfo) {
        Destroy(gameObject);
    }
}

https://imgur.com/G9ysLFM

【问题讨论】:

  • 听起来您遇到的问题是没有为游戏分配足够的内存。可能必须查看解决方案以增加分配的内存或减少使用的内存量。对于后者,可能需要考虑Object Pooling 你的子弹和敌人。至于超出范围的索引,这可能是由于某些脚本在对象被销毁后试图引用它,因此请仔细检查您处理可被销毁对象的逻辑。
  • 我相信无论是敌方类型还是子弹本身在被摧毁后都可能被引用,所以我会尝试修复这个问题。如果失败,我将尝试对象池。如果它有效,我会更新你。谢谢。

标签: c# unity3d unity-webgl indexoutofrangeexception


【解决方案1】:

这可能与您没有摧毁没有击中游戏对象的子弹这一事实有关吗?你有什么代码可以在它们离开屏幕后销毁它们吗?

If(Mathf.Abs(bulletPrefab.position) - Mathf.Abs(firePoint.position) > 10)
{
   Destroy(gameObject);
}

我只是在想,你可能会因为大量未摧毁的子弹飞向无穷远而使记忆超载

【讨论】:

  • 是的,子弹确实在敌人脚本中被摧毁。当敌人被子弹击中时,敌人本身的状态会被设置为 false 并且它所碰撞的东西会被删除。造成这个问题的可能是敌人。
  • 未命中的子弹怎么办?他们飞出屏幕了吗?
  • 我有一个消失脚本,一旦这些子弹移出相机范围,它们也会被删除。此外,这里是破坏子弹并将敌人设置为假的代码的 sn-p。销毁(other.gameObject); this.gameObject.SetActive(false);你认为有一种方法可以在不删除预制件本身的情况下删除敌人吗?
  • 哦,不要介意解决这个问题,我添加了相同的代码来破坏子弹击中的任何东西,所以它被修复了,但即使这样,错误仍然存​​在。
  • 哦,该死的,我以为它可能只是这样的错误之类的。如果它的工作正常并且你的子弹不是问题,那它一定是别的东西!抱歉,我无法提供更多帮助!
猜你喜欢
  • 2016-08-22
  • 1970-01-01
  • 2015-09-12
  • 1970-01-01
  • 2017-12-02
  • 1970-01-01
  • 2019-01-06
  • 2023-03-30
相关资源
最近更新 更多