Unity3d 使用OnTiggerEnter更改UI文本

Unity3d 使用OnTiggerEnter更改UI文本,unity3d,text,triggers,Unity3d,Text,Triggers,嘿,我正在建立一个棒球比赛,我正在使用OnTiggerEnter来检测棒球是否进入攻击区。好球区足够大,因此可以检测到,而且球的移动速度不会太快。一旦触发,我想显示(“打击!),但什么都没有发生。请 using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; public class Strike : MonoBehaviour { public

嘿,我正在建立一个棒球比赛,我正在使用OnTiggerEnter来检测棒球是否进入攻击区。好球区足够大,因此可以检测到,而且球的移动速度不会太快。一旦触发,我想显示(“打击!),但什么都没有发生。请

using System.Collections;
using System.Collections.Generic;
 using UnityEngine;
 using UnityEngine.UI;
 public class Strike : MonoBehaviour {
 public AudioSource src;
 public ParticleSystem stars;
public Text StrikeText;
 private void Start()
{
 StrikeText.text = " ";
}
public void OnTriggerEnter(Collider other)
{
 if (other.gameObject.tag == "ball")
 {
     src.Play();
     Instantiate(stars, transform.position, transform.rotation);
     StrikeText.text = "STRIKE!";
     Destroy(other.gameObject);
     SecondsWait();
     StrikeText.text = " ";
 }


}
IEnumerator SecondsWait()
{
 yield return new WaitForSeconds(4);
}
协同程序不是这样工作的。 这是您的代码逐行执行的操作:

 src.Play();
 Instantiate(stars, transform.position, transform.rotation);
 StrikeText.text = "STRIKE!";
 Destroy(other.gameObject);
所有这些都正常运行,正如您所期望的那样

 SecondsWait();
这将调用一个函数,该函数随后调用
yield return new WaitForSeconds(4);
由于您的代码没有对该返回值执行任何操作,因此不会发生任何事情,
WaitForSeconds
对象会被垃圾回收

 StrikeText.text = " ";
然后这一行立即运行,清除先前设置的文本

这可能是您真正想要的:

 src.Play();
 Instantiate(stars, transform.position, transform.rotation);
 Destroy(other.gameObject);
 StartCoroutine(SecondsWait());

 //...

IEnumerator SecondsWait()
{
    StrikeText.text = "STRIKE!";
    yield return new WaitForSeconds(4);
    StrikeText.text = "";
}

通过调用
start例程()
并将
SecondsWait()
的返回传递给它,
SecondsWait()
方法本身(而不是
OnTriggerEnter
!)当<代码>收益率<代码>发生时暂停。

这样的代码体系结构非常差。UI不应该直接与您的域相关。您应该考虑使用事件驱动的方法,即使您只是初学者。