首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >调用()不被调用

调用()不被调用
EN

Stack Overflow用户
提问于 2017-04-26 12:28:30
回答 2查看 149关注 0票数 1

我的代码:

代码语言:javascript
复制
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()代替。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-04-26 12:47:22

这是因为您正在调用破坏(GameObject),就像m.rogalski提到的那样,而且它没有机会执行Invoke("ChangeScene",2f);

但是,我有一种感觉,您想立即销毁该对象,而不需要等待,因为您希望脚本中的内容(如OnCollisionEnter2D)停止运行,但同时希望稍后加载场景。

如果是这样的话,那么您必须将加载函数放入一个单独的脚本中,该脚本附加到一个单独的GameObject中。当您调用Destroy(gameObject)时,此脚本不会破坏。

1.Create是一种名为"SceneLdObj“的新GameObject。

2.Attach下面的脚本指向"SceneLdObj“GameObject。

代码语言:javascript
复制
public class SceneLoader : MonoBehaviour
{
    int loadToScene = 1;
    public void ChangeScene(int sceneLevel)
    {
        loadToScene = sceneLevel;
        Invoke("loadScene", 2f);
    }

    private void loadScene()
    {
        SceneManager.LoadScene(loadToScene);
    }
}

将下面的脚本添加到您问题中的脚本中:

代码语言:javascript
复制
 SceneLoader sceneLoader;

 void Start()
 {
     sceneLoader = GameObject.Find("SceneLdObj").GetComponent<SceneLoader>();
 }

现在,您可以从您的模具功能加载功能,它将仍然工作,即使GameObject已经被破坏。

代码语言:javascript
复制
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脚本:

代码语言:javascript
复制
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);
    }
}
票数 1
EN

Stack Overflow用户

发布于 2017-04-26 12:34:01

问题是,Invoke实际上正在被调用,但在调用方法执行之前,您的对象就被销毁了。

要解决这个问题,请将Destroy(gameObject)移动到ChangeScene方法:

代码语言:javascript
复制
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秒后销毁对象)。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43634239

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档