Unity文本框拒绝使用C#脚本更新



我的场景上有一个文本框。在问题上,文本框已经有几行文本行。

脚本如下:

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;
}

最新更新