public class Storm : MonoBehaviour {
[SerializeField] private PlayerVitals playerVitals;
[SerializeField] private bool health;
[SerializeField] private float value;
public float waitTime = 1f;
float timer;
void Start () {
InvokeRepeating ("OnTriggerEnter", 0.0f, 1.0f);
}
// Update is called once per frame
void Update () {
}
IEnumerator OnTriggerEnter (Collider col)
{
if (col.gameObject.tag == "storm") {
playerVitals.healthSlider.value -= value;
yield return new WaitForSeconds (1);
}
}
IEnumerator OnTriggerExit (Collider col){
if (col.gameObject.tag == "storm") {
playerVitals.healthSlider.value += value;
yield return new WaitForSeconds (1);
}
}
}
我正在为一个小组项目编写代码,并试图获取该代码,以便当播放器位于触发器框中时,它每秒减少一次运行状况,并且每隔一秒它们就会跳出相同的数量。我的小组仅由设计师组成,因此编码对我来说有点困难,但是我必须看教程才能在此项目中学习其中的一些内容。 ps。我将此代码附加到播放器上,因此将其称为触发盒标签“ storm”。
最佳答案
首先,从启动功能中删除InvokeRepeating ("OnTriggerEnter", 0.0f, 1.0f);
。 OnTriggerEnter
函数由Unity自动调用。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;
}
}
}
}