C# 在统一中生成系统,摧毁SPWAN

C# 在统一中生成系统,摧毁SPWAN,c#,unity3d,null,spawn,C#,Unity3d,Null,Spawn,我正在为我的游戏制作一个产卵系统,在任意位置产卵敌人,但是Unity告诉我我没有检查对象是否已经被摧毁。我试着用其他一些话题来解决这个问题,但我做不到。 这是我的密码: using System.Collections; using System.Collections.Generic; using UnityEngine; public class EnemySpawn : MonoBehaviour { public GameObject Enemy2Spawn; pub

我正在为我的游戏制作一个产卵系统,在任意位置产卵敌人,但是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);
        }
    }
}
使用系统集合;
使用System.Collections.Generic;
使用UnityEngine;
公共阶级敌人的棋子:单一行为{
公共游戏对象Enemy2典当;
公共浮动最大宽度;
公共浮动宽度;
公共浮动汇率;
专用浮动电流rspawn=2.0f;
公共int maxInimigo;
公共int Inimigos=0;
void Start()
{
transform.position=新矢量3(0,6.03f,0);
}
//每帧调用一次更新
无效更新()
{

如果(currentRSpawn>Time.Time&Inimigos那么,在这个脚本中有两件事情似乎不对劲:

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

transform.position=new Vector3(Random.Range(minWidth,maxWidth),transform.position.y,transform.position.z);
这一行改变了附在脚本上的对象,它的位置要精确,这不会影响你将要繁殖的敌人的位置

“实例化(Enemy2Spawn);”对变量的值进行克隆。克隆将继承原始变量的所有值,因此位置将与原始变量的位置相同

除非您没有设置“
Enemy2Spawn
”的值,否则它不会变为null,除非另一个脚本更改该值并且它是一个预置。因此,“
if(Enemy2Spawn==null)
”假设该值已设置,不在其他位置更改,并且在本例中设置为预设,则该语句永远不会为真。如果该语句为真,则“
Destroy(this.gameObject);
”中的行将销毁脚本附加到的对象,因此对我来说似乎适得其反(销毁产卵器)但是,如果这是一种防止错误的措施,那么它应该在Start或Awake函数中,或者如果使用不同的脚本设置它,那么只需销毁脚本,而不是将变量设置为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++;
        }
    }
}
使用系统集合;
使用System.Collection.Generic;
使用UnityEngine;
公共阶级敌人的棋子:单一行为{
公共游戏对象Enemy2典当;
公共浮动最大宽度;
公共浮动宽度;
公共浮动汇率;
专用浮动电流rspawn=2.0f;
公共int maxInimigo;
公共int Inimigos=0;
void Start()
{
transform.position=新矢量3(0,6.03f,0);
}
//每帧调用一次更新
无效更新()
{

如果在
Update
函数中(currentRSpawn>Time.Time&Inimigos,您正在检查
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++;
        }
    }
}
使用系统集合;
使用System.Collections.Generic;
使用UnityEngine;
公共阶级敌人的棋子:单一行为{
公共游戏对象Enemy2典当;
公共浮动最大宽度;
公共浮动宽度;
公共浮动汇率;
专用浮动电流rspawn=2.0f;
公共int maxInimigo;
公共int Inimigos=0;
void Start()
{
transform.position=新矢量3(0,6.03f,0);
}
//每帧调用一次更新
无效更新()
{
如果(currentRSpawn>Time.Time&&Inimigos