Итак, я реализовал метод расширения для единства, чтобы сделать использование 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);
}
}