当前位置: 首页 > 知识库问答 >
问题:

在单个脚本中同时具有IENumator Start()和无效的Start()

逄嘉禧
2023-03-14

我有一个示例程序从Unity的留档页面,其中包含一个IENumator开始(),如下所示,但我想知道如何也可以有一个正常的无效的开始()在同一个脚本?

我还尝试添加了void Start(),但它抛出了一个错误。然后,我尝试在IEnumerator函数中包含我的代码(只是为了控制应用程序的数据路径而编写),尽管我使用0f作为延迟参数立即执行它,但它不会打印出任何内容。。。

我错过了什么?对于这种情况,通常的解决方案是什么?您必须有一个IEnumerator Start(),但还需要执行起始代码?

/// Saves screenshots as PNG files.
public class PNGers : MonoBehaviour
{

    // Take a shot immediately.
    IEnumerator Start()
    {
        yield return UploadPNG();
        yield return ConsoleMSG();
    }

    IEnumerator UploadPNG()
    {
        // We should only read the screen buffer after frame rendering is complete.
        yield return new WaitForEndOfFrame();

        // Create a texture the size of the screen, with RGB24 format.
        int width = Screen.width;
        int height = Screen.height;
        Texture2D tex = new Texture2D(width, height, TextureFormat.RGB24, false);

        // Read the screen contents into the texture.
        tex.ReadPixels( new Rect(0, 0, width, height), 0, 0 );
        tex.Apply();

        // Encode the texture into PNG format.
        byte[] bytes = tex.EncodeToPNG();
        Object.Destroy(tex);

        // For testing purposes, also write to a file in the project folder:
        File.WriteAllBytes(Application.dataPath + "/../SavedScreen.png", bytes);

    }

    IEnumerator ConsoleMSG()
    {
        yield return new WaitForSeconds(0f);
        Debug.Log(Application.dataPath);
    }
}

共有1个答案

缑永年
2023-03-14

我有一个来自Unity文档页面的示例程序,其中包含一个IEnumerator Start(),如下所示,但我想知道如何在同一个脚本中也包含一个普通的void Start()?

你不能。

这是因为不能有两个同名函数。例外情况是,函数具有不同的参数类型。我知道一个Start函数是void返回类型,而另一个是IEnumerator返回类型。这在C#中无关紧要。重要的是这两个函数的参数。

在这种情况下,他们都不接受任何争论,所以你不能让他们超载。你可以在这里读到更多。

即使您使无效的开始函数接受一个参数,而IENumator开始函数不接受一个参数,它也不会工作。例如,

void Start(int i)
{
    Debug.Log("Hello Log 1");
}

IEnumerator Start()
{
    yield return null;
    Debug.Log("Hello Log 2");
}

Unity将引发编译(编辑器)和运行时异常:

脚本错误(

如果您切换它,并使无效的开始没有任何参数,但有一个参数的IENumator,它将编译,你不会得到任何错误,但在运行/玩你的游戏。

void Start()
{
    Debug.Log("Hello Log 1");
}

IEnumerator Start(int i)
{
    yield return null;
    Debug.Log("Hello Log 2");
}

对于这样的情况,通常的解决方案是什么,您必须有一个IENumator Start(),但您也需要执行启动代码?

在任何其他代码之前,在IENumator Start函数中运行您的起始代码。

IEnumerator Start()
{
    //Run your Starting code
    startingCode();

    //Run Other coroutine functions
    yield return UploadPNG();
    yield return ConsoleMSG();
}

IEnumerator UploadPNG()
{

}

IEnumerator ConsoleMSG()
{
    yield return new WaitForSeconds(0f);
}

void startingCode()
{
    //Yourstarting code
}

您还可以在void away()void Enable()函数中执行启动代码。

 类似资料:
  • 有哪些更改? Photoshop 中的脚本生成 UI 经过增强后现在可以支持 HiDPI/Retina 显示器,并且在外观上与整体应用程序的 UI 保持一致。此外,脚本生成 UI 当前基于新框架而不是 Flex。 受影响的对话框列表 以下是应用程序中受到此更改影响的对话框列表: 对话框 菜单 联系表 II 文件 > 自动 > 联系表 II 条件模式更改 文件 > 自动 > 条件模式更改 限制图像

  • 问题内容: 问题已修订(见下文) 我有一个cpp文件,它定义了一个静态全局变量,例如 该cpp文件被编译为可执行文件和共享库。可执行文件可以在运行时加载共享库。 如果我在Linux上,则此变量似乎有两个副本。我假设一种来自可执行文件,另一种来自共享库。其他平台(HP,Windows)似乎只有一个副本。 什么可以控制Linux上的这种行为,我可以更改它吗?例如,是否有一个编译器或链接器标志会强制共享

  • 我正在编写一个时髦的脚本,以在一个步骤中测试我的所有服务。 我导入了WSDL,然后自动生成所有SOAP请求。 我希望减少逐个测试所有SOAP服务的手动工作。 所以,如果可能的话,我想通过groovy实现。 从addressScript中的这里——我想在以后的所有测试用例中访问所有的SOAP请求。那么有没有可能通过上下文中的一些循环来实现它呢..?下面是我正在尝试的示例代码。 我的主要座右铭是减少逐

  • 问题内容: 如何运行多个python脚本?此刻我像这样跑一个。 我已经尝试过了,但是不起作用:仅运行第一个脚本。另外,我尝试使用这样的单个文件; 但是,这也不起作用。 问题答案: 使用Bash: 这就是整个脚本。它将同时运行两个Python脚本。 Python本身可以做同样的事情,但要花更多的时间输入,对于眼前的问题来说是一个不好的选择。 我认为尽管您采取错误的方法来解决问题很可能,但我想听听您的

  • 问题内容: 我正在尝试创建一个shell脚本来运行docker容器并且正在挣扎。我的脚本是这样的: 当我跑步时: 我得到: 即使我这样做仍然失败(导致)。 如果我从命令行运行,它将起作用… 有人可以帮忙吗? 问题答案: 映像名称应在-it参数后面,因此请重新安排您的运行命令。