<product>
我正在研究一个团队项目的代码,我正试图让它变得如此,以便当玩家进入触发器盒时,它会每秒降低生命值并且每秒都会恢复相同的数量。框。我的小组只由设计师组成,所以编码对我来说是一种挣扎,但我不得不观看教程来学习这个项目的一些内容。附:我将此代码附加到播放器上,因此它会调用标签&#34; storm&#34;这是触发器盒。
答案 0 :(得分:2)
首先,从“开始”功能中删除InvokeRepeating ("OnTriggerEnter", 0.0f, 1.0f);
。 Unity会自动调用OnTriggerEnter
函数。
OnTriggerEnter
和OnTriggerExit
函数仅调用一次。请注意,OnTriggerStay
因无效sometimes而闻名,您应避免使用它。在这个网站上有无数关于此的帖子,here就是一个例子。
由于您将回调函数设为IEnumerator
,因此您可以在while
循环中实际执行此操作而不冻结游戏,如果您不想使用Update
函数在协程功能中按顺序执行操作。调用OnTriggerEnter
时,将标志设置为true
,然后跳转到带有该标志的while
循环。调用OnTriggerExit
时,将该标志设置为false
,while
循环应退出。
bool triggerEntered = false;
IEnumerator OnTriggerEnter(Collider col)
{
if (col.gameObject.tag == "storm")
{
triggerEntered = true;
//Decrease while triggerEntered is true
while (triggerEntered)
{
playerVitals.healthSlider.value -= value;
yield return new WaitForSeconds(1);
//Exit if we hit the min value?
if (playerVitals.healthSlider.value <= 0)
{
yield break;
}
}
}
}
IEnumerator OnTriggerExit(Collider col)
{
if (col.gameObject.tag == "storm")
{
triggerEntered = false;
//Increase while triggerEntered is false
while (!triggerEntered)
{
playerVitals.healthSlider.value += value;
yield return new WaitForSeconds(1);
//Exit if we hit the max value?
if (playerVitals.healthSlider.value >= 100)
{
yield break;
}
}
}
}