Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/299.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 统一-使对象消失一段时间并再次显示_C#_Unity3d - Fatal编程技术网

C# 统一-使对象消失一段时间并再次显示

C# 统一-使对象消失一段时间并再次显示,c#,unity3d,C#,Unity3d,我想做一个游戏的对象,可以消失一段时间。我写了这段代码,但根本不起作用 这是我的密码: public class Fire : MonoBehaviour { [SerializeField] int decreaseHealth; [SerializeField] GameObject handlerObject; GameHandler handler; void Start() { decreaseHealth = 10;

我想做一个游戏的对象,可以消失一段时间。我写了这段代码,但根本不起作用

这是我的密码:

public class Fire : MonoBehaviour
{
    [SerializeField] int decreaseHealth;

    [SerializeField] GameObject handlerObject;

    GameHandler handler;

    void Start()
    {
        decreaseHealth = 10;

        handler = handlerObject.GetComponent<GameHandler>();
    }

    void OnTriggerEnter2D(Collider2D col)
    {
        if (col.gameObject.tag == "Player")
        {
            StartCoroutine(ShowAndHide(this.gameObject, 2.0f)); // 2 second
            // Decrease Health
            handler.decreaseHealth(decreaseHealth);
        }
    }

    IEnumerator ShowAndHide(GameObject go, float delay)
    {
        go.SetActive(true);
        yield return new WaitForSeconds(delay);
        go.SetActive(false);
    }
}
公共级火灾:单一行为
{
[SerializeField]int降低健康水平;
[SerializeField]游戏对象handlerObject;
游戏处理程序;
void Start()
{
健康指数下降=10;
handler=handlerObject.GetComponent();
}
无效OnTriggerEnter2D(碰撞的R2D列)
{
如果(col.gameObject.tag==“玩家”)
{
start例程(ShowAndHide(this.gameObject,2.0f));//2秒
//减少健康
handler.decreaseHealth(decreaseHealth);
}
}
IEnumerator ShowAndHide(游戏对象运行,浮动延迟)
{
go.SetActive(true);
产生返回新WaitForSeconds(延迟);
go.SetActive(false);
}
}

有人能帮我弄清楚吗

一般来说,从您的描述听起来,您更希望先
设置活动(false)
,然后在延迟后
设置活动(true)
!现在你的情况正好相反

    StartCoroutine(ShowAndHide(this.gameObject, 2.0f)); // 2 second
    //Decrese Health
    handler.decreaseHealth(decreaseHealth);
    Destroy(this.gameObject); // <- this

我不会在这里使用协同程序,因为它会妨碍您完全停用对象。因为您停用了对象,所以协同程序不再运行


相反,它也适用于停用的对象

顺便说一句,使用
=
,而不是直接比较字符串。它的速度稍快,但更重要的是,
CompareTag
会在给定的标记名拼写错误或根本不存在时引发异常。使用
==
会隐藏这个“bug”,并耗费您的开发时间和精力;)


但当我玩游戏时,它不会循环。我希望输出是隐藏的,等一下,unhide@RakaAryaPratama你说它不循环是什么意思?另外,如果您想先隐藏它,请使用
.SetActive(false)首先,然后将其设置为
true
以稍后显示。@如果您这样做,尽管协同程序将停止运行,因此对象永远不会重新激活。
IEnumerator ShowAndHide(GameObject go, float delay)
{
    go.SetActive(true);
    yield return new WaitForSeconds(delay);
    go.SetActive(false);
    Destroy(go); // Destroy after it has hidden itself.
}
private void OnTriggerEnter2D(Collider2D col)
{
    if (col.CompareTag("Player"))
    {
        HideAndShow(2.0f); // 2 second
        // Decrease Health
        handler.decreaseHealth(decreaseHealth);
    }
}

private void HideAndShow(float delay)
{
    gameObject.SetActive(false);

    // Call Show after delay seconds
    Invoke(nameof(Show), delay);
}

private void Show ()
{
    gameObject.SetActive(true);
}