Delegate coroutine in another coroutine,Delagate generic coroutine in another coroutine
Hi everyone !
I'm trying to make a kind of "Super Method" who can be as flexible as possible. In the following exemple, the method rotates a gameobject and than write a text in log (its just for the example of course).
This one works :
void Start()
{
StartCoroutine(DoSomething(Rotate(this.gameObject, new Vector3(30, 30, 30), 3), "J'exécute Func", Test2));
}
public IEnumerator DoSomething<T>(IEnumerator co, T text, Func<T, T> method1 = null)
{
Debug.Log("Func");
yield return co;
if (method1 != null)
Debug.Log(method1(text));
//finish
}
public virtual IEnumerator Rotate(GameObject GO, Vector3 targetPos, float totalTime)
{
float curTime = totalTime;
var totalDist = (targetPos - GO.transform.localEulerAngles);
while (curTime > 0)
{
var timePassed = Time.deltaTime;
GO.transform.localEulerAngles += timePassed * totalDist / totalTime;
curTime -= timePassed;
yield return null;
}
GO.transform.localEulerAngles = targetPos;
yield return null;
}
string Test2<T>(T text)
{
Debug.Log(text);
return "fini :)";
}
But this one doens't work:
void Start()
{
StartCoroutine(DoSomething(Rotate,this.gameObject, new Vector3(30, 30, 30), 3, "J'exécute Func", Test2));
}
public IEnumerator DoSomething<T>(Func<T, T, T, IEnumerator> action, GameObject GO, Vector3 RotationPos, float totalTime, T text, Func<T, T> method1 = null)
{
Debug.Log("Func func");
yield return action(GO, RotationPos, totalTime);
if (method1 != null)
Debug.Log(method1(text));
//finish
}
public virtual IEnumerator Rotate<T>(T GO, T targetPos, T totalTime)
{
float curTime = totalTime;
var totalDist = (targetPos - GO.transform.localEulerAngles);
while (curTime > 0)
{
var timePassed = Time.deltaTime;
GO.transform.localEulerAngles += timePassed * totalDist / totalTime;
curTime -= timePassed;
yield return null;
}
GO.transform.localEulerAngles = targetPos;
yield return null;
}
string Test2<T>(T text)
{
Debug.Log(text);
return "fini :)";
}
Visual Studio says me it can't convert "UnityEngine.GameObject" in "T", and the same for Vector3 and float. Does anyone can help with this method, i'm not sure what is in cause, maybe the syntax ? Or maybe do you have a better idea to achieve this ?
Have a nice day and thank you for reading!
Your answer
Follow this Question
Related Questions
Create events that fires off a coroutine from another script 0 Answers
How to execute a function after another function has finished its execution? 0 Answers
Array index out of range error with onClick.AddListener(delegate) 1 Answer
How to force IEnumerator methods to be called only with StartCoroutine 2 Answers
Is there a way to check something every frame from within a coroutine? 1 Answer