【Unity插件】Super Invoke 超级调用插件 官方文档翻译
比如,延迟多少秒调用这个方法体。
比如,重复调用这个方法体多少次,每次的间隔时间是多少秒。
而且他还可以像协程一样,中断正在运行的工作(应该就是封装了Unity的协程)。
还可以判断这个工作是否运行完、是否被中断、是否正在运行中。
就像评论里说的:
“这是一个简单而不可思议的资产(Unity商店中的所有东西,都被称为资产)。
很简单,这是我购买过的最有用的资产之一。 没有它,我无法想象我是如何做游戏的! ”
而且值得一提的是,这个插件的官方文档,是我目前读过的所有官方文档(大概20多个)中,最最最最易读的!!!!
疯狂为作者打Call!
Super Invoke 插件 官方文档翻译
Time-control your code- 时间控制你的代码
Super Invoke超级调用 由 handcrafted by Jacob Games Stay 制作保持联系以获取新闻和更新
https://twitter.com/JacobGameshq
1 - Introduction 介绍
1.1 - How to use Super Invoke 如何使用超级调用
超级调用是一种允许您轻松地控制任何代码的工具。
您可以延迟无参数方法以及参数化方法。 您还可以使用方法之间的方法和自定义延迟创建高可读序列等等。
要使用超级调用,您需要将以下using语句添加到源文件中:
using JacobGames.SuperInvoke;
所有API都通过SuperInvoke类提供。
1.2 - Initialization (optional) 初始化(可选)
Super Invoke将在您第一次使用时自动初始化其内部结构。 如果您喜欢控制此操作,请使用:
SuperInvoke .Init ();
一个可选的bool参数用于在SuperInvoke游戏对象管理器上设置DontDestroyOnLoad标志。(bool参数用于选择是否在切换场景时销毁SuperInvoke)
1.3 - Beware of C# limitations 小心C#限制
请参阅本文档的第8部分,了解如何在使用Super Invoke时克服C#限制。
1.4 - Online version 在线版
本文档的实时版本可在线获取:https://drive.google.com/open?id=1mAM_70_lGEL5ZSWsw5seM-z7a26Ij08kCnsGPfH2WxY
2 - Delays 延迟
2.1 - Delay a parameterless method 延迟无参数的方法
要延迟无参数方法,只需使用 S uperInvoke.Run , 指定
- The method 方法
- The delay 延时的时间
- An optional tag (discussed later) 可选标签(稍后讨论)
SuperInvoke .Run ( ()=> PlaySound(), 1f);
您也可以使用(合约形式):
SuperInvoke .Run (PlaySound, 1f);
并且您还可以在方法之前指定延迟:
SuperInvoke .Run (1f, PlaySound);
2.2 - Delay a method with parameters 延迟具有参数的方法
要使用参数使用与无参数方法完全相同的语法来延迟方法。 合约形式不能使用。
SuperInvoke .Run ( ()=> PlaySound(VictoryJingle), 1f);
2.3 - Delay any block of code 延迟任何代码块
如果需要,您可能会延迟任何代码块。 下列代码块中的任何行将在5秒后执行:
SuperInvoke .Run ( ()=> {
Debug .Log( "Prefab instantiation." );
Instantiate( prefab );
},
5f);
3 - Sequences 序列
3.1 - Create sequences 创建序列
要使用序列,您必须首先创建一个类型为 I SuperInvokeSequence 的对象 :
ISuperInvokeSequence sequence = SuperInvoke. CreateSequence ();
CreateSequence 方法是一个工厂:每次调用它将返回一个不同的序列对象。(把序列中的对象一个一个取出来,每次调用,都取一个出来,下次调用取下一个)
3.2 - Compose sequences 撰写序列
创建序列对象后,您可以编写序列添加方法和延迟:
sequence. AddMethod (RemovePinAndThrowGrenade)//添加方法
. AddDelay (5f) //添加延迟
. AddMethod (ExplodeGrenade);
3.3 - Run sequences 运行序列
组合序列后,可以如下所示运行:
sequence. Run ();
Equivalent way to compose the previous sequence 和上一个序列方法等效的方法:
以前的序列也可以用以下方式写:
sequence. AddMethod (RemovePinAndThrowGrenade)
. AddMethod (5f, ExplodeGrenade)
根据您的喜好,您可以互换使用这两种方式。
当您使用多种方法和延迟创建序列时,使用AddDelay可能更易读。
3.4 - Add a delay to the entire sequence 向整个序列添加延迟
有时,您可能需要在组合完成后延迟整个序列的执行。 您可以通过三种不同的方式完成此任务。
Method 1 - Add a starting delay 方法1 - 添加启动延迟
sequence. AddDelay(2f)
. AddMethod(RemovePinAndThrowGrenade)
.AddDelay(5f)
.AddMethod(ExplodeGrenade)
.Run();
Method 2 - Add a delay to the first method 方法2 - 向第一种方法添加延迟
sequence.AddMethod(RemovePinAndThrowGrenade, 2f )
.AddDelay(5f)
.AddMethod(ExplodeGrenade)
.Run();
Method 3 - Pass the delay to R un 方法3 - 将延迟传递给运行
sequence . AddMethod(RemovePinAndThrowGrenade)
.AddDelay(5f)
.AddMethod(ExplodeGrenade)
. Run(2f) ;
方法3可能是最可读的,因为您在Run中添加了一个不会干扰编译序列延迟的全局延迟。
(感觉:这里的添加延迟应该是修改延迟的意思吧)
4 - RunRepeat 重复运行
4.1 - Repeats 重复
要重复执行方法或任何代码,请使用 S uperInvoke.RunRepeat 和以下参数:
SuperInvoke .RunRepeat (Delay, RepeatRate, Repeats, Method);
- Delay: 初始延迟(以秒为单位),之后重复开始
- RepeatRate : 每次重复之间的时间,以秒为单位
- Repeats : 重复次数(固定次数或无限次)
- Method: 要重复的代码/方法
4.2 - RunRepeat - Example 1 - Specific number of repeats示例1 - 具体的重复次数
每秒播放一次声音5次,没有初始延迟:
SuperInvoke .RunRepeat (0f, 1f, 5, PlaySound);
4.3 - RunRepeat - Example 2 - Infinite repeats 示例2 - 无限重复
要无限重复,您可以使用SuperInvoke.INFINITY 或直接写入“-1”作为 R epeats 参数 。
SuperInvoke .RunRepeat (0f, 1f, SuperInvoke.INFINITY, PlaySound);
N. B.: RunRepeat works for sequences too. RunRepeat也适用于序列。
5 - Job and JobRepeat 工作和JobRepeat工作重复
5.1 - What is a Job 什么是工作
任何执行Run,通过 SuperInvoke.Run 或s equence.Run 返回一个 IJob 对象。
任何执行 RunRepeat ,通过SuperInvoke.RunRepeat或sequence.RunRepeat返回一个IJobRepeat对象。
工作job(和重复工作job-repeat)是由其延迟及其延迟动作构成的概念对象。 除非另有说明,以下几点与Jobs和JobRepeats有关。
5.2 - Job states 工作状态
工作和工作重复可以在以下状态之一:
● Scheduled 计划(已安排)
● Paused 已暂停
● Killed 已杀害
● Completed 已完成
Scheduled Job 计划工作:这是工作最初运行时的默认状态。 在这种状态下,工作的延迟已经过去了。 当延迟时间过去时,如果当前正在执行该方法并且尚未完成,该作业仍被视为已安排。
Paused Job 暂停工作:当其方法Pause被调用时,作业暂停。停顿基本上冻结延迟。 如果Resume被调用,则作业将返回到“计划scheduled”状态。
Killed Job 杀死工作:当它的方法Kill被调用时,一个工作被杀死。这意味着它不会在所有执行。 如果在序列作业中被调用,则序列将被突然中断。
Completed Job 完成工作:当其延迟已经过去并且所有相关代码已经被完全执行时,作业完成。
5.3 - Job - OnComplete 工作 - 完成
OnComplete是一个回调函数,您可以在作业完成后通知您,即其延迟已经过去,并且操作已经完全执行。 当您无法预测执行延迟操作需要多少时间时,这是特别有用的。
例如:
SuperInvoke .Run (2f, CallServer).OnComplete(PlaySound);
5.4 - Job - Pause & Resume 工作 - 暂停和恢复
您可能需要暂停一个特定的工作,并在外部事件发生后恢复。 使用暂停方法暂停工作的延迟,使其进入暂停状态,使用恢复恢复其恢复到计划状态。
如果工作的延迟已过,其方法正在执行,则调用暂停不会产生任何影响。
在通过调用sequence.Run创建的工作中调用暂停将具有在序列中任何延迟的中间冻结序列的效果。
5.5 - Job - Kill 工作 - 杀死
Kills the job. 杀死工作。
5.6 - Job - KillOnDestroy 工作 - KillOnDestroy
当您在连接到游戏对象的MonoBehaviour中运行作业时,KillOnDestroy非常有用,该对象可能在工作发生延迟之前被破坏。
将游戏对象传递给KillOnDestroy可以确保您的工作不会被完成并且游戏对象被破坏。
例如:
SuperInvoke .Run (2f, CallServer).KillOnDestroy(this);
5.8 - Job - PauseOnDisable 工作 - 暂停不可用
当游戏对象被禁用时,PauseOnDisable会自动暂停该作业,并且默认情况下,当游戏对象随后启用时,它将自动恢复该作业。
5.9 - JobRepeat-only features 仅限JobRepeat功能
IJobRepeat提供了所有的IJob方法,因为它扩展了IJob。 IJobRepeat的其他方法有:
● GetCompletedRepeats 获得完成重复
● GetRemainingRepeats 获得剩余重复
● GetTotalRepeats 获取总重复
6 - Tags 标签
6.1 - What are Tags 什么是标签
标签是用于将多个工作分组的字符串。 当您执行Run或RunRepeat时,您可以选择使用所选字符串对工作进行标记。
6.2 - SuperInvoke.CreateTag() 创建标签
SuperInvoke.CreateTag()是一个有用的工厂方法,它可以在任何时间调用时返回不同的字符串。在运行时需要多个不同的标签时,这是非常有用的。
为了进一步降低自定义使用与SuperInvoke.CreateTag()创建的字符串相同的字符串的概率,SuperInvoke.CreateTag()创建的所有字符串都以大写西格玛符号“Σ”开头。
6.3 - Important note for versions compatibility 版本兼容性的重要说明
在3.0版本中,我们简化了标签功能。 以前,有两种方式来标记作业:通过使用字符串或使用ISuperInvokeTag对象。我们已经消除了ISuperInvokeTag界面降低复杂度。
如果您在项目中使用ISuperInvokeTag,只需搜索并替换该字符串即可“ISuperInvokeTag”与字符串“string”,一切都会一样。
7 - Additional global features of S uperInvoke 其他全局功能
7.1 - Global Killing 全局杀戮
杀死一个单独的工作前面已讨论过。
您可以使用标签杀死一组工作。
或者您可以杀死项目中的所有当前工作,除非你选择哪些作业必须活着,否则您将杀死所有:
● SuperInvoke.Kill(tags)
● SuperInvoke.KillAll()
● SuperInvoke.KillAllExcept(tags)
7.2 - Global Pause & Resume 全局暂停&恢复
以前已经讨论过暂停和恢复单一工作。
使用标签,您可以使用以下方式暂停和恢复工作组:
● SuperInvoke.Pause(tags)
● SuperInvoke.Resume(tags)
7.3 - Skip Frames 跳帧
功能SkipFrames允许您通过指定要等待的帧数来轻松延迟执行任何方法:
SuperInvoke .SkipFrames (100, rotateCube);
8 - C# Limitations that affect Super Invoke C#限制
注意
由于关于操作和范围的c#内部结构,当您使用参数化方法使用SuperInvoke时,必须采取安全步骤。
以下示例显示了以下问题:
int amount = 100;
SuperInvoke .Run(()=> withdraw(amount), 1f);
amount = 500;
实际撤回多少?
答案是500, 因为可变数量在延迟方法提交实际执行之前已更改。
基本上,方法withdraw(提取)只能知道变量的最后一个amount(值)。
对于循环也受c#限制的影响:
for(int i = 1; i <= 3; i++) {
SuperInvoke .Run(()=> Debug .Log(i), 1f);
}
日志输出为:
3
3
3
它总是记录“3”,因为延迟的方法(登录在这种情况下)只能知道最后的值i,当SuperInvoke.Run被实际执行时(在这种情况下为1秒之后)为3。
为了克服c#限制,您需要在循环体内指定一个新变量,您可以在其中分配变量i的当前循环值:
for(int i = 1; i <= 3; i++) {
int k = i;
SuperInvoke .Run(()=> Debug .Log( k ), 1f);
}
日志输出为:
1
2
3
絮酱翻译