C# 自定义 Invoke 方法调用各种其他方法
C# Custom Invoke method to invoke various other methods
我有多种工作正常的方法,但我只想在延迟后才调用它们。为了避免为 所有这些 编写不同的方法,我认为以某种方式对 Invoke
它们更有益。我制作了这些方法,以便它们排除 Unity
的 timeScale
,因此它们总是使用自定义构建的短函数等待 Real seconds
。
WaitForRealSeconds
:
public class WaitForRealSecondsClass
{
#region Wait for real seconds
public Coroutine WaitForRealSeconds(float aTime, MonoBehaviour mono)
{
return mono.StartCoroutine(_WaitForRealSeconds(aTime));
}
private IEnumerator _WaitForRealSeconds(float aTime)
{
while (aTime > 0.0f)
{
aTime -= Mathf.Clamp(Time.unscaledDeltaTime, 0, 0.2f);
yield return null;
}
}
#endregion
}
我希望 Invoke
我的 Move function
的方式:
public void InvokeAnim(float timeBeforeStart, Action<MonoBehaviour> MoveFunction, MonoBehaviour mono)
{
if (moveRoutine != null)
{
mono.StopCoroutine(moveRoutine);
}
moveRoutine = _InvokeAnim(timeBeforeStart, MoveFunction, mono);
}
IEnumerator _InvokeAnim(float timeBeforeStart, Action<MonoBehaviour> MoveFunction, MonoBehaviour mono)
{
yield return new WaitForRealSecondsClass().WaitForRealSeconds(timeBeforeStart, mono);
MoveFunction(mono);
}
以及 Move(MonoBehaviour mono)
本身:
public void Move(MonoBehaviour mono)
{
if (moveRoutine != null)
{
mono.StopCoroutine(moveRoutine);
}
moveRoutine = _Move(from, to, overTime, mono);
mono.StartCoroutine(moveRoutine);
}
我测试和工作的是Move
本身,我在另一个项目中用于UI等待游戏停止时的WaitForRealSeconds
,然后就可以了。
正如我所说,我有很多方法可以调用,所有方法都 return void
并且有一个参数 MonoBehaviour
。目前它没有做任何事情,我不知道为什么。
Sod it,我太笨了以至于忘记了实际启动那个协程。
在我的 Invoke
:
public void InvokeAnim(float timeBeforeStart, Action<MonoBehaviour> MoveFunction,
MonoBehaviour mono)
{
if (moveRoutine != null)
{
mono.StopCoroutine(moveRoutine);
}
moveRoutine = _InvokeAnim(timeBeforeStart, MoveFunction, mono);
mono.StartCoroutine(moveRoutine); //one line was missing
}
IEnumerator _InvokeAnim(float timeBeforeStart, Action<MonoBehaviour> MoveFunction,
MonoBehaviour mono)
{
yield return new WaitForRealSecondsClass().WaitForRealSeconds(timeBeforeStart, mono);
MoveFunction(mono);
}
我有多种工作正常的方法,但我只想在延迟后才调用它们。为了避免为 所有这些 编写不同的方法,我认为以某种方式对 Invoke
它们更有益。我制作了这些方法,以便它们排除 Unity
的 timeScale
,因此它们总是使用自定义构建的短函数等待 Real seconds
。
WaitForRealSeconds
:
public class WaitForRealSecondsClass
{
#region Wait for real seconds
public Coroutine WaitForRealSeconds(float aTime, MonoBehaviour mono)
{
return mono.StartCoroutine(_WaitForRealSeconds(aTime));
}
private IEnumerator _WaitForRealSeconds(float aTime)
{
while (aTime > 0.0f)
{
aTime -= Mathf.Clamp(Time.unscaledDeltaTime, 0, 0.2f);
yield return null;
}
}
#endregion
}
我希望 Invoke
我的 Move function
的方式:
public void InvokeAnim(float timeBeforeStart, Action<MonoBehaviour> MoveFunction, MonoBehaviour mono)
{
if (moveRoutine != null)
{
mono.StopCoroutine(moveRoutine);
}
moveRoutine = _InvokeAnim(timeBeforeStart, MoveFunction, mono);
}
IEnumerator _InvokeAnim(float timeBeforeStart, Action<MonoBehaviour> MoveFunction, MonoBehaviour mono)
{
yield return new WaitForRealSecondsClass().WaitForRealSeconds(timeBeforeStart, mono);
MoveFunction(mono);
}
以及 Move(MonoBehaviour mono)
本身:
public void Move(MonoBehaviour mono)
{
if (moveRoutine != null)
{
mono.StopCoroutine(moveRoutine);
}
moveRoutine = _Move(from, to, overTime, mono);
mono.StartCoroutine(moveRoutine);
}
我测试和工作的是Move
本身,我在另一个项目中用于UI等待游戏停止时的WaitForRealSeconds
,然后就可以了。
正如我所说,我有很多方法可以调用,所有方法都 return void
并且有一个参数 MonoBehaviour
。目前它没有做任何事情,我不知道为什么。
Sod it,我太笨了以至于忘记了实际启动那个协程。
在我的 Invoke
:
public void InvokeAnim(float timeBeforeStart, Action<MonoBehaviour> MoveFunction,
MonoBehaviour mono)
{
if (moveRoutine != null)
{
mono.StopCoroutine(moveRoutine);
}
moveRoutine = _InvokeAnim(timeBeforeStart, MoveFunction, mono);
mono.StartCoroutine(moveRoutine); //one line was missing
}
IEnumerator _InvokeAnim(float timeBeforeStart, Action<MonoBehaviour> MoveFunction,
MonoBehaviour mono)
{
yield return new WaitForRealSecondsClass().WaitForRealSeconds(timeBeforeStart, mono);
MoveFunction(mono);
}