我想制作可以消失一段时间的游戏对象。我写了这段代码,但它根本不起作用。
这是我的代码:
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);
}
}
谁能帮我解答一下吗?
最佳答案
总的来说,从您的描述来看,您似乎更想先SetActive(false)
,然后在延迟后SetActive(true)
!目前你的情况正好相反。
我不会在这里使用协程,因为它会妨碍您完全停用该对象。由于您停用了该对象,协程不再运行。
而是使用Invoke
这也适用于停用的对象。
顺便说一句,也宁愿使用 CompareTag
而不是使用 ==
直接比较字符串。它的速度稍快一些,但更重要的是,如果给定的标签名称拼写错误或根本不存在,CompareTag
会引发异常。使用 ==
会隐藏这个“bug”并花费您的开发时间和精力;)
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);
}
关于c# - Unity - 让对象消失一段时间然后再次显示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58785119/