C# 在统一中生成系统,摧毁SPWAN
我正在为我的游戏制作一个产卵系统,在任意位置产卵敌人,但是Unity告诉我我没有检查对象是否已经被摧毁。我试着用其他一些话题来解决这个问题,但我做不到。 这是我的密码: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
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