Unity IENumerator, выдающий неожиданную ошибку и ошибку символа, «не может быть блоком итератора, потому что« void »не является типом интерфейса итератора». - PullRequest
0 голосов
/ 10 января 2019

Я пытаюсь сделать игру для прыжков с платформы в Unity, и когда ты умрешь, игра должна показывать игру поверх текста, а затем ждать 3 секунды. Но я получаю эти ошибки:

error CS1525: Unexpected symbol `(', expecting `,', `;', or `='
error CS1525: Unexpected symbol `IEnumerator'

Мой код :

using UnityEngine;
using System;
using UnityEngine.UI;
using UnityEngine.SceneManagement;
using System.Collections;

public class PlayerController : MonoBehaviour
{

public float speed = 1700.0f;
public GameObject Player;
public Text TheText;

void Start()
{
    TheText.text = "";
}

void FixedUpdate()
{
    float moveHorizontal = Input.GetAxis("Horizontal");
    float moveVertical = Input.GetAxis("Vertical");

    Vector3 movement = new Vector3(moveHorizontal, 0.0f, moveVertical);

    GetComponent<Rigidbody>().AddForce(movement * speed * Time.deltaTime);

    IEnumerator Wait1()
     { 
        if (Player.transform.position.y < -100.59)
        {
            TheText.text = "You Lost. Try Again!!";
            yield return new WaitForSeconds(5);
            SceneManager.LoadScene(SceneManager.GetActiveScene().name);

        }
    }
    IEnumerator Wait2()
    {
        if (Player.transform.position.y > 210)
        {
            TheText.text = "You Lost. Try Again!!";
            yield return new WaitForSeconds(5);
            SceneManager.LoadScene(SceneManager.GetActiveScene().name);
        }
    }

 theres 4 more of those, they're all the same

Я ожидаю, что он подождет, прежде чем перезапустить игру, но я получаю эти ошибки. Оператор void fixedupdate(); выдает следующую ошибку

cannot be an iterator block because 'void' is not an iterator interface type. 

Ответы [ 4 ]

0 голосов
/ 10 января 2019

Ваш код использует локальные функции, то есть функции, которые объявлены в другой функции. Чтобы использовать эту функцию, вы должны выполнить обновление до Unity 2018.3 и убедиться, что ваши Scripting Runtime Version и Api Compatibility Level в Player Settings -> Other Settings установлены на .NET 4.x. Ваш код должен работать тогда.

0 голосов
/ 10 января 2019

В этом коде вы пытаетесь использовать функцию C #, представленную в версии 7, которая называется локальные функции . К сожалению, Unity все еще использует C # v6, что означает, что вам нужно переместить эти функции за пределы метода FixedUpdate. Например:

void FixedUpdate()
{
    //snip
}

IEnumerator Wait1()
{
    //snip
}

IEnumerator Wait2()
{
    //snip
}
0 голосов
/ 10 января 2019

IEnumerators должны быть объявлены в области видимости класса, а не в области функций, а затем запущены с помощью StartCoroutine ()

* 1003 Е.Г. *

public class ExampleClass : MonoBehaviour
{
    // In this example we show how to invoke a coroutine and
    // continue executing the function in parallel.

    private IEnumerator coroutine;

    void Start()
    {
        // - After 0 seconds, prints "Starting 0.0"
        // - After 0 seconds, prints "Before WaitAndPrint Finishes 0.0"
        // - After 2 seconds, prints "WaitAndPrint 2.0"
        print("Starting " + Time.time);

        // Start function WaitAndPrint as a coroutine.

        coroutine = WaitAndPrint(2.0f);
        StartCoroutine(coroutine);

        print("Before WaitAndPrint Finishes " + Time.time);
    }

    // every 2 seconds perform the print()
    private IEnumerator WaitAndPrint(float waitTime)
    {
        while (true)
        {
            yield return new WaitForSeconds(waitTime);
            print("WaitAndPrint " + Time.time);
        }
    }
}

Источник: https://docs.unity3d.com/ScriptReference/MonoBehaviour.StartCoroutine.html

Обратите внимание, что IEnumerator определен в классе, а не внутри функции Update ().

Вы также должны быть осторожны, когда запускаете свои сопрограммы, так как вы можете очень легко запускать несколько сопрограмм одновременно, что здесь не идеально (например, вы можете иметь 3 или 4 сопрограммы, пытающихся загрузить уровень). все в одно и то же время, что приведет к загрузке уровня 3 или 4 раза, что вызовет огромную задержку для игрока вместе с потенциальными нежелательными побочными эффектами)

Справка: IEnumerators - это не то же самое, что сопрограммы, сопрограммы - это функция Unity, позволяющая выполнять код параллельно (но не многопоточно), и для работы они используют функцию IEnumerators (C #).

IEnumerators - это функция C #, которая имеет много возможностей помимо сопрограмм, в первую очередь она используется для перебора пользовательских контейнеров (массивов, списков и т. Д.)

Будьте осторожны с вашей терминологией, поскольку это две очень разные (хотя и связанные) вещи.

0 голосов
/ 10 января 2019

Возможно, вам придется изменить код следующим образом: закройте метод FixedUpdate и используйте IEnumerator Wait () в качестве отдельных методов.

void FixedUpdate()
{
 float moveHorizontal = Input.GetAxis("Horizontal");
 float moveVertical = Input.GetAxis("Vertical");

 Vector3 movement = new Vector3(moveHorizontal, 0.0f, moveVertical);

 GetComponent<Rigidbody>().AddForce(movement * speed * Time.deltaTime);
}

IEnumerator Wait1()
{ 
    if (Player.transform.position.y < -100.59)
    {
        TheText.text = "You Lost. Try Again!!";
        yield return new WaitForSeconds(5);
        SceneManager.LoadScene(SceneManager.GetActiveScene().name);
    }
}
IEnumerator Wait2()
{
    if (Player.transform.position.y > 210)
    {
        TheText.text = "You Lost. Try Again!!";
        yield return new WaitForSeconds(5);
        SceneManager.LoadScene(SceneManager.GetActiveScene().name);
    }
}
...