我正在为我的游戏制作一个生成系统,该系统在随机位置生成敌人,但是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或不应该破坏该对象”
答案 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++;
}
}
}