我的代码:
public class Enemy : MonoBehaviour
{
public GameObject deathEffect;
public float health = 4f;
public static int EnemiesAlive = 0;
public int loadToScene;
void Start ()
{
EnemiesAlive++;
}
void OnCollisionEnter2D (Collision2D colInfo)
{
if (colInfo.relativeVelocity.magnitude > health)
{
Die();
}
}
void Die ()
{
Instantiate(deathEffect, transform.position, Quaternion.identity);
EnemiesAlive--;
if (EnemiesAlive <= 0)
{
Debug.Log ("LEVEL WON!");
Invoke("ChangeScene",2f);
}
Destroy(gameObject);
}
void ChangeScene()
{
Debug.Log ("Hello");
loadToScene = 1;
SceneManager.LoadScene (loadToScene);
}
}有人能指出为什么Invoke()不起作用吗?我想增加2秒的延迟,然后改变场景,一旦条件(EnemiesAlive <= 0)被满足。Debug.Log ("LEVEL WON!");被输出,而Debug.Log ("Hello");没有输出。我知道我也可以使用StartCoroutine,但是我想用Invoke()代替。
发布于 2017-04-26 12:47:22
这是因为您正在调用破坏(GameObject),就像m.rogalski提到的那样,而且它没有机会执行Invoke("ChangeScene",2f);。
但是,我有一种感觉,您想立即销毁该对象,而不需要等待,因为您希望脚本中的内容(如OnCollisionEnter2D)停止运行,但同时希望稍后加载场景。
如果是这样的话,那么您必须将加载函数放入一个单独的脚本中,该脚本附加到一个单独的GameObject中。当您调用Destroy(gameObject)时,此脚本不会破坏。
1.Create是一种名为"SceneLdObj“的新GameObject。
2.Attach下面的脚本指向"SceneLdObj“GameObject。
public class SceneLoader : MonoBehaviour
{
int loadToScene = 1;
public void ChangeScene(int sceneLevel)
{
loadToScene = sceneLevel;
Invoke("loadScene", 2f);
}
private void loadScene()
{
SceneManager.LoadScene(loadToScene);
}
}将下面的脚本添加到您问题中的脚本中:
SceneLoader sceneLoader;
void Start()
{
sceneLoader = GameObject.Find("SceneLdObj").GetComponent<SceneLoader>();
}现在,您可以从您的模具功能加载功能,它将仍然工作,即使GameObject已经被破坏。
void Die()
{
Instantiate(deathEffect, transform.position, Quaternion.identity);
EnemiesAlive--;
if (EnemiesAlive <= 0)
{
Debug.Log("LEVEL WON!");
//Call that function from another script
sceneLoader.ChangeScene(1);
}
Destroy(gameObject);
}编辑:
这应该是您的新Enemy脚本:
public class Enemy : MonoBehaviour
{
public GameObject deathEffect;
public float health = 4f;
public static int EnemiesAlive = 0;
public int loadToScene;
SceneLoader sceneLoader;
void Start ()
{
sceneLoader = GameObject.Find("SceneLdObj").GetComponent<SceneLoader>();
EnemiesAlive++;
}
void OnCollisionEnter2D (Collision2D colInfo)
{
if (colInfo.relativeVelocity.magnitude > health)
{
Die();
}
}
void Die ()
{
Instantiate(deathEffect, transform.position, Quaternion.identity);
EnemiesAlive--;
if (EnemiesAlive <= 0)
{
Debug.Log ("LEVEL WON!");
//Call that function from another script
sceneLoader.ChangeScene(1);
}
Destroy(gameObject);
}
void ChangeScene()
{
Debug.Log ("Hello");
loadToScene = 1;
SceneManager.LoadScene (loadToScene);
}
}发布于 2017-04-26 12:34:01
问题是,Invoke实际上正在被调用,但在调用方法执行之前,您的对象就被销毁了。
要解决这个问题,请将Destroy(gameObject)移动到ChangeScene方法:
void Die ()
{
Instantiate(deathEffect, transform.position, Quaternion.identity);
EnemiesAlive--;
if (EnemiesAlive <= 0)
{
Debug.Log ("LEVEL WON!");
Invoke("ChangeScene",2f);
}
}
void ChangeScene()
{
Debug.Log ("Hello");
loadToScene = 1;
Destroy(gameObject);
SceneManager.LoadScene (loadToScene);
}您可以选择指定使用Destroy方法重载来销毁对象的时间:Destroy(gameObject, 1.0f) (将在1秒后销毁对象)。
https://stackoverflow.com/questions/43634239
复制相似问题