如何在一定时间后显示3D文本,然后在一定时间后隐藏
我的尝试
public Text text_tap;
GameObject.Find("3dtext").active = true; // first try but it dosnt work
if (Time.time > 5) {
// second try but it I cant attach my 3d text to my script
text_tap.gameObject.SetActive(true);
}
我无法在3D documentation
中找到任何内容答案 0 :(得分:3)
我不知道确切的问题,但你有一些提示:
如果您在场景中搜索已停用的游戏对象,则无法找到它。 Gameobject必须是活动的,GameObject.Find()函数才能工作。你可以做的最简单的事情是保持GameObject激活,如果初始状态是隐藏它,只需将它隐藏在Awake()中。
其次,您似乎正在尝试访问TextMesh对象 但是你在代码中引用了一个Text对象。 如果找到GameObject并请求GO不包含的Component,则返回null。
最后激活/取消激活游戏对象(GO)的API是
myGameobject.SetActive(真)
您正在使用的那个(myGameobject.active = true)已弃用
试试这个例子,它应该有效:
public YourMonoBehaviour : MonoBehaviour
{
public TextMesh text_tap;
float awakeTime;
void Awake()
{
// Remember to activate the GO 3dtext in the scene!
text_tap = GameObject.Find("3dtext").GetComponent<TextMesh>():
awakeTime = Time.time
}
void Update()
{
if ((Time.time - awakeTime) > 5)
{
// second try but it I cant attach my 3d text to my script
text_tap.gameObject.SetActive(true);
}
}
}
答案 1 :(得分:1)
如果您需要“在延迟后做某事”,那么您正在谈论Coroutines。
检查Time.time
只会检查游戏是否已运行x时间,并且在Unity中使用Thread.Sleep
会导致它延迟,因为您导致Update
或类似锁定而不是返回。
相反,请使用
yield return WaitForSeconds(5);
text_tap.gameObject.SetActive(false);
作为另一个警告,此代码假定目标对象与托管此脚本的目标对象不同gameObject
,因为协同程序不在非活动对象上执行。同样,禁用transofrm.parent
的祖先(通过场景层次结构或gameObject
)会禁用gameObject
本身。
如果是这种情况,请通过gameObject
字段获取呈现3d文本的组件并将其禁用,而不是整个enabled
。
答案 2 :(得分:1)
你也可以使用Invoke()来实现。如上所述,注意文本必须通过其他方式设置,而不是查找原因,如果它不活动,它将无法找到它。
void Start() //or any event
{
Invoke("ShowTextTap", 5f);//invoke after 5 seconds
}
void ShowTextTap()
{
text_tap.gameObject.SetActive(true);
//then remove it
Invoke("DisableTextTap", 5f);
}
void DisableTextTap()
{
text_tap.gameObject.SetActive(false);
}