Вопрос о типе данных Coroutine в Unity C# - PullRequest
0 голосов
/ 15 апреля 2020

Итак, я реализовал метод расширения для единства, чтобы сделать использование Coroutines более безопасным и избежать избыточного кода.

Вот мой код:

  public static class UtilExtensionClass
{

    public static void EnsafeCoroutine(this MonoBehaviour pScript, ref Coroutine pCoroutine, IEnumerator pRoutine)
      {

           if(pCoroutine != null)
           {
            pScript.StopCoroutine(pCoroutine);
            pCoroutine = null;
           }


           pCoroutine = pScript.StartCoroutine(pRoutine);
      }

}

Реализация сценария так, как я хочу чтобы использовать его ..

public void TestScript : MonoBehaviour
{
Coroutine mTestRoutine;
    WaitForSeconds mValue;
    void Activator()
    { 
        mValue = new WaitForSeconds(0.5f);
        this.EnsafeCoroutine(ref mTestRoutine, Testing(1));
    }


    IEnumerator Testing(int pVal)
    {

        while (true)
        {
            yield return mValue;
        }
    }
}

Когда я использую это расширение без ключевого слова ref перед переменной Coroutine, оно на самом деле не проверяет ссылку на переменную Coroutine. В результате фактическая сопрограмма не проверяется и не останавливается, а это не совсем то, что я намереваюсь. Но когда я проверил документацию, он заявил, что тип данных Coroutine является ссылочным типом. Я уверен, что это что-то из базового c, которое я пропустил, но я хотел бы получить разъяснения по этому основному c сомнению, если бы кто-то мог быть достаточно хорошим, чтобы сделать это.

Вот как это было раньше. pCoroutine всегда был нулевым в этом сценарии ..

    public static class UtilExtensionClass
{

    public static void EnsafeCoroutine(this MonoBehaviour pScript, Coroutine pCoroutine, IEnumerator pRoutine)
      {
          //Doesn't enter the if statement at all to check the original variable
           if(pCoroutine != null)
           {
            pScript.StopCoroutine(pCoroutine);
            pCoroutine = null;
           }


           pCoroutine = pScript.StartCoroutine(pRoutine);
      }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...