Unity中的Spawn系统,销毁Spwans

时间:2018-06-23 18:01:03

标签: unity3d null unityscript spawn

我正在为我的游戏制作一个生成系统,该系统在随机位置生成敌人,但是Unity告诉我,我不检查对象是否已被销毁。我在这里尝试了其他一些主题来解决它,但是我做不到。 这是我的代码:

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

public class EnemySpawn : MonoBehaviour {

    public GameObject Enemy2Spawn;
    public float maxWidth;
    public float minWidth;
    public float rateSpwan;
    private float currentRSpawn = 2.0f;
    public int maxInimigo;
    public int Inimigos = 0;

    void Start()
    {
        transform.position = new Vector3(0, 6.03f, 0);
    }

    // Update is called once per frame
    void Update()
    {
        if (currentRSpawn > Time.time & Inimigos<=maxInimigo)
        {
            transform.position = new Vector3(Random.Range(minWidth, maxWidth), transform.position.y, transform.position.z);
            Instantiate(Enemy2Spawn);
            currentRSpawn = currentRSpawn + rateSpwan;
            Inimigos++;
        }

        if (Enemy2Spawn. == null)
        {
            Destroy(this.gameObject);
        }
    }
}

我得到的错误是:

  

“类型'GameObject'的对象已被破坏,但您仍在尝试访问它。脚本应检查其是否为null或不应该破坏该对象”

2 个答案:

答案 0 :(得分:0)

在此脚本上似乎有几件事:

在此之前:对于错误,如果您将Enemy2Spawn设置为场景中的对象,并且该对象被销毁,则该值为null,然后在尝试再次实例化时,将导致错误(可以将条件“ Enemy2Spawn != null”放在第一个if语句中作为修复)

transform.position = new Vector3(Random.Range(minWidth, maxWidth), transform.position.y, transform.position.z);” 这行代码更改了附加到脚本的对象,它的位置是准确的,不会影响您要生成的敌人的位置。

“实例化(Enemy2Spawn);”复制变量的值。克隆继承了原始文件的所有值,因此位置将是原始文件的位置。

除非您未设置“ Enemy2Spawn”的值,否则除非其他脚本更改该值并且该值是预制的,否则它不会为空。因此,假定设置了值的“ if (Enemy2Spawn == null)”在这种情况下不会更改,并且在其他情况下被设置为预制件,则该语句永远不会为真。如果该语句变为真,则“ Destroy(this.gameObject);”中的行会破坏脚本所附加的对象,因此对我来说似乎适得其反(破坏生成器),但如果要采取措施防止错误,则应将其放在启动或唤醒功能,或者如果使用其他脚本设置它,只需销毁脚本,而不是将变量设置为null(我真的对此表示怀疑)。

这里的脚本已更改,应该可以解决我所说的问题并满足您的需求

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

public class EnemySpawn : MonoBehaviour {

    public GameObject Enemy2Spawn;
    public float maxWidth;
    public float minWidth;
    public float rateSpwan;
    private float currentRSpawn = 2.0f;
    public int maxInimigo;
    public int Inimigos = 0;

    void Start()
    {
        transform.position = new Vector3(0, 6.03f, 0);
    }

    // Update is called once per frame
    void Update()
    {
        if (currentRSpawn > Time.time & Inimigos<=maxInimigo)
        {
            Instantiate(Enemy2Spawn, new Vector3(Random.Range(minWidth, maxWidth), transform.position.y, transform.position.z), Quaternion.identity);
            currentRSpawn = currentRSpawn + rateSpwan;
            Inimigos++;
        }
    }
}

错误的不同原因,给定的脚本可能会吐出该错误,但我不知道它是怎么引起的,因此它必须由不同的脚本引起,该脚本导致带有附加脚本的对象成为在执行更新功能之前已销毁。

此外,脚本API建议如果使用JS / unityscript,则按如下所示调用Destroy

UnityEngine.Object.Destroy(this.gameObject);

我希望这会有所帮助,如果不需要,则需要更多信息

答案 1 :(得分:0)

Update函数中,您正在检查GameObject是否为空,这意味着它不存在,那么您正在使用Destroy()销毁那个不存在。相反,您将需要检查是否在生成敌人的if语句中存在该对象。像这样将其添加到if语句中,您应该会很好。

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

public class EnemySpawn : MonoBehaviour {

    public GameObject Enemy2Spawn;
    public float maxWidth;
    public float minWidth;
    public float rateSpwan;
    private float currentRSpawn = 2.0f;
    public int maxInimigo;
    public int Inimigos = 0;

    void Start()
    {
        transform.position = new Vector3(0, 6.03f, 0);
    }

    // Update is called once per frame
    void Update()
    {
        if (currentRSpawn > Time.time && Inimigos <= maxInimigo && Enemy2Spawn == null)
        {
            transform.position = new Vector3(Random.Range(minWidth, maxWidth), transform.position.y, transform.position.z);
            Instantiate(Enemy2Spawn);
            currentRSpawn = currentRSpawn + rateSpwan;
            Inimigos++;
        }
    }
}