Unity3d 使用OnTiggerEnter更改UI文本
嘿,我正在建立一个棒球比赛,我正在使用OnTiggerEnter来检测棒球是否进入攻击区。好球区足够大,因此可以检测到,而且球的移动速度不会太快。一旦触发,我想显示(“打击!),但什么都没有发生。请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
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不应该直接与您的域相关。您应该考虑使用事件驱动的方法,即使您只是初学者。