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);
}