我正在为我的游戏制作一个生成系统,该系统会在随机位置生成敌人,但 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);
}
}
}
我得到的错误是:
"类型为'游戏对象'的对象已被销毁,但您仍在尝试访问它。你的脚本应该检查它是否为空,或者你不应该破坏对象">
在Update
函数中,您正在检查GameObject
是否为 null,这意味着它不存在,然后您使用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++;
}
}
}
嗯,这个脚本有几件事似乎不对劲:
在此之前:对于错误,如果您将Enemy2Spawn
设置为场景中的对象并且它被销毁,那么该值为 null,然后当它尝试再次实例化时,这会导致错误(可以将条件"Enemy2Spawn != null
"放在第一个 if 语句中作为修复(
"transform.position = new Vector3(Random.Range(minWidth, maxWidth), transform.position.y, transform.position.z);
" 这条线会改变附加到脚本的对象,确切地说是位置,这不会影响你将要生成的敌人的位置。
"Instantiate(Enemy2Spawn(;" 创建变量值的克隆。克隆继承原始位置的所有值,因此位置将是原始位置的位置。
除非你没有设置"Enemy2Spawn
"的值,否则它不会变为空,除非不同的脚本更改了该值并且它是一个预制件。因此,假设设置了值,"if (Enemy2Spawn == null)
"不会更改其他地方,并且在这种情况下设置为预制件,则语句永远不会为真。如果该语句变为真,"Destroy(this.gameObject);
"中的行会破坏脚本附加到的对象,因此对我来说似乎适得其反(破坏生成器(,但如果这是防止错误的措施,它应该在 Start or 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++;
}
}
}
错误的不同原因,给定的脚本可能会吐出错误,但我看不出它是如何引起的,所以它必须由不同的脚本引起,该脚本导致附加了脚本的对象在执行更新功能之前被销毁。
此外,脚本 API 建议在使用 JS/unityscript 时像下面这样调用 Destroy。
UnityEngine.Object.Destroy(this.gameObject(;
我希望这有所帮助,如果没有,则需要更多信息