Unity 在销毁前一个对象 1 秒后实例化新对象

Posted

技术标签:

【中文标题】Unity 在销毁前一个对象 1 秒后实例化新对象【英文标题】:Unity instantiate new objects after 1 second of destroying previous 【发布时间】:2015-12-23 12:35:32 【问题描述】:

我的代码有问题。我无法让我的立方体对象在销毁前一个立方体后 1 秒自动显示新的。这是我的代码:

void OnTriggerEnter(其他对撞机)

    if (other.gameObject.CompareTag ("cube1"))  
        other.gameObject.SetActive (false);
        makenew ();

    



IEnumerator makenew ()

    yield return new WaitForSeconds (1f);
    GameObject cube = Instantiate (cubePrefab) as GameObject;
    gameObject.SetActive (true);


【问题讨论】:

所以你是在给自己打电话gameObject.SetActive (true);? :) 【参考方案1】:

你也可以这样做:

    if (other.gameObject.CompareTag ("cube1"))  
        other.gameObject.SetActive (false);
        Invoke("makenew", 1.0f);

    



void makenew ()


    GameObject cube = Instantiate (cubePrefab) as GameObject;
    gameObject.SetActive (true);


由于我不知道你在做什么,我的疑惑就在这里:

other.gameObject 是您停用的立方体。 (第一个游戏对象)

GameObject cube 是新的。 (第二个游戏对象)

使用此代码:gameObject.SetActive (true); 您正在使实际的第三个游戏对象(具有此代码的脚本的那个)变为活动状态,我可能猜到它已经是,不是?我想表达的是,使用此代码,您正在调用脚本的所有者。这可以吗?还是您想激活“其他”旧立方体,例如:

other.gameObject.SetActive (true);?

这样你就会有 2 个立方体。旧的(其他)和新的(立方体)。只是一个疑问。

已编辑:我怀疑gameObject.SetActive(true); 这行不是 OP 意图。他的 prefab 默认是停用的,所以 makenew() 方法应该是这样的:

void makenew ()
    

        GameObject cube = Instantiate (cubePrefab) as GameObject;
        cube.SetActive (true);

    

【讨论】:

它可以工作,但我的立方体没有显示在我的屏幕上。我在我的层次立方体(克隆)上看到,但它不是黑色的,它是灰色的。 你的预制件是默认激活的吗?如果在创建多维数据集后没有放置:cube.SetActive(true); 我解决了所有问题。非常感谢你。我改变这条线 gameObject.SetActive (true);到 cube.SetActive (true);一切都很完美。 太棒了。我会用正确的代码更新答案。【参考方案2】:

这是因为你应该使用 StartCoroutine() 方法而不是仅仅调用 makenew()。试试这个:

StartCoroutine(makenew());

这是文档的链接: MonoBehaviour.StartCoroutine

【讨论】:

【参考方案3】:

你忘了StartCoroutine

那就试试吧:

void OnTriggerEnter (Collider other)

if (other.gameObject.CompareTag ("cube1"))  
    other.gameObject.SetActive (false);
    StartCoroutine (makenew ());


【讨论】:

【参考方案4】:

只提一件事——如果游戏对象被禁用,协程也会停止 (See this answer)。所以你可能需要使用 Invoke() 来代替:

    if (other.gameObject.CompareTag ("cube1"))  
        other.gameObject.SetActive (false);
        Invoke("makenew", 1f);

    



void makenew ()

    GameObject cube = Instantiate (cubePrefab) as GameObject;
    gameObject.SetActive (true);

如果您需要更好地了解正在发生的事情,请参阅this quick tutorial of Invoke。

不过,其他答案也很有用。

【讨论】:

以上是关于Unity 在销毁前一个对象 1 秒后实例化新对象的主要内容,如果未能解决你的问题,请参考以下文章

实例化新 VC 后销毁当前 tabbarVC

Unity 3D 假定一个GameObject对象指向一个实例,如果这个实例被销毁了,那么这个对象自动被设置成null吗

依赖注入概念问题:在哪里实例化新对象以保存到数据库?

为每个 TableViewCell 实例化新数组

为什么我不能在没有完整命名空间的情况下从字符串中实例化新对象

在 Unity 中沿光线投射实例化预定义数量的对象