我的场景上有一个文本框。在问题上,文本框已经有几行文本行。
脚本如下:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using System;
public class GameEngine : MonoBehaviour {
//Game level variables:
public bool TutorialDone = false;
public int TutorialCount = 0;
bool isticking = false;
Text outputtext;
// Use this for initialization
void Start () {
outputtext = GameObject.Find("ConsoleOutputScroll/Viewport/Output").GetComponent<Text>();
}
// Update is called once per frame
void Update () {
}
//Process inputted text and splits into commands, validation etc.
public void processtext(string inputstring)
{
if(inputstring == "")
{
commandin("blank");
return;
}
commandin("something");
return;
}
//Process any commands supplied, apply these to game stages
public void commandin(string commandtype)
{
if(TutorialDone == false)
{
tutorialrun();
return;
}
}
//Tutorial procedure
public void tutorialrun()
{
switch (TutorialCount)
{
case 0:
TutorialCount++;
outputnewline("***CRITICAL SYSTEM FAILURE*** Press any key to exit...");
break;
case 1:
TutorialCount++;
outputnewline("***CRITICAL SYSTEM FAILURE*** Press any key to exit...");
break;
case 2:
TutorialCount++;
outputnewline("***CRITICAL SYSTEM FAILURE*** Press any key to exit...");
break;
case 3:
TutorialCount++;
outputnewline("***CRITICAL SYSTEM FAILURE*** Press any key to exit...");
break;
case 4:
TutorialCount++;
outputnewline("***CRITICAL SYSTEM FAILURE*** Press any key to exit...");
break;
case 5:
TutorialCount++;
outputnewline("***CRITICAL SYSTEM FAILURE*** Press any key to exit...");
break;
case 6:
TutorialCount++;
tickertypenewline("ESTABLISHING CONNECTION...");
break;
}
}
//Appends to the console output on a new line
public void outputnewline(string inputstring)
{
string Temp;
Temp = outputtext.text + inputstring + Environment.NewLine;
outputtext.text = Temp;
}
//Clears output and adds new text
public void outputclear(string inputstring)
{
outputtext.text = inputstring + Environment.NewLine;
}
//Typewriter style text addition on a new line
public void tickertypenewline(string inputstring)
{
//Exit if we are already ticking
if (isticking)
{
return;
}
isticking = true;
StartCoroutine(tickertypeco(inputstring));
}
//Typewriter style text after clearing output
public void tickertypeclear(string inputstring)
{
outputtext.text = "";
StartCoroutine(tickertypeco(inputstring));
}
//Typewriter generator
IEnumerator tickertypeco(string inputstring)
{
//outputtext.text = "sugar";
WaitForSeconds waitTime = new WaitForSeconds(0.125f);
foreach (char c in inputstring)
{
string temp = outputtext.text + c.ToString();
outputtext.text = temp;
yield return waitTime;
}
isticking = false;
}
这似乎没有做任何事情。如果我事先清除文本框,它似乎没有做任何事情。但是,如果我清除,然后添加一个随机字符串而没有任何新的线或空格,则行为正确。结果应该是进入文本框时对字符串的打字效果。
似乎无法确定错误的位置。
有人可以帮忙吗?:)
程序员:):您的重新设计代码在其中,我只将名称从tickertext更改为outputText。它仍然不起作用,我现在包含了整个GameEngine脚本,希望您在那里发现了一些明显的东西。:)。非常感谢您继续寻找我。
即使清除了Text
框,您的代码仍然可以正常运行。
我怀疑在tickertypeco()
功能仍在运行时,tickertypestr
变量正在从另一个函数中修改。这是可能的,因为tickertypestr
是一个全局变量。由于 WaitForSeconds(0.125f)
。
fix :
1 .make tickertypeco
coroutine函数以 string
作为参数,就像 tickertypenewline
函数一样。将字符串从tickertypenewline
函数传递到tickertypeco
功能。
为了将参数传递到无拳击/拳击的情况下,您必须使用
Coroutine StartCoroutine(IEnumerator routine);
超负荷而不是
Coroutine StartCoroutine(string methodName);
您还可以用它来停止该统治。
2 。另外,添加一个标志以确保一次只运行该Coroutine的实例。这将防止奇怪的问题,例如显示怪异文本的文本框,因为它是从不同位置进行了修改的。
3 。GameObject.Find
不应在SAME游戏对象上的循环中使用。这样做一次然后缓存。对于您的情况,缓存Text
组件更好。由于您知道等待时间(0.125F),因此应在for循环外声明WaitForSeconds
,然后在其中使用它。
#1 和#2 组合应解决您的问题。#3 只是可选的。
以下是代码应该的样子:
Text tickerText;
bool isTicking = false;
void Start()
{
tickerText = GameObject.Find("ConsoleOutputScroll/Viewport/Output").GetComponent<Text>();
tickertypenewline("ESTABLISHING CONNECTION...");
}
public void tickertypenewline(string inputstring)
{
//Exit if we are already ticking
if (isTicking)
{
return;
}
//Not ticking so start ticking now
isTicking = true;
StartCoroutine(tickertypeco(inputstring));
}
IEnumerator tickertypeco(string tickerString)
{
WaitForSeconds waitTime = new WaitForSeconds(0.125f);
foreach (char c in tickerString)
{
string temp = tickerText.text + c.ToString();
tickerText.text = temp;
yield return waitTime;
}
//Done ticking, set to false
isTicking = false;
}