‫欢迎回来｡
‫现在我们有了一个游戏模式, 我们想使用游戏模式来确定何时可以开始游戏｡
‫现在, 一些游戏有一个延迟或倒计时计时器, 当游戏开始时开始｡
‫在一段时间后, 玩家可以移动角色, 或者在我们的例子中,
‫在世界上移动坦克｡
‫所以我们将在这段视频中实现它｡
‫这将涉及到首先禁用输入, 这样我们就不能在游戏开始时四处走动, 然后我们将设置一个计时器,
‫在设定的时间后, 我们可以启用输入｡
‫所以让我们回到调整坦克游戏模式, 并在这里添加一些东西｡
‫首先, 我想添加一个浮点数, 表示在游戏开始后我们开始移动之前应该经过的时间｡
‫所以这个浮点数叫做开始延迟, 我把它初始化为3点F, 这样我们在开始游戏之前要等3秒.
‫游戏一开始, 我就想启动这个计时器, 也就是说我想用一个函数来启动这个计时器,
‫我也要把它设为私有函数.
‫我把它设为void函数, 叫做handle game start.
‫现在我可以实现处理游戏开始在调坦克游戏模式｡
‫下一步就在这里开始打｡
‫现在我不会忘记在这里添加调坦克游戏模式类名, 现在我有了一个处理游戏启动功能｡
‫现在, 调用此函数的地方应该是开始播放”｡
‫因为开始Play在游戏开始时被调用｡
‫所以我要调用手柄游戏, 从这里开始玩｡
‫因为我们在游戏开始的时候要做一些事情, 比如设置坦克,
‫调音坦克, 玩家, 控制器变量, 我想把这些都移到游戏开始的时候.
‫我把它们移到handle game start, 这样tank和tune tank玩家控制器就被设置好了,
‫因为我们在这里调用handle game start, 然后开始游戏｡
‫因此, 我想在这里启动一个倒计时计时器, 之后我们可以启用用户输入｡
‫现在, 在启动计时器之前, 我将禁用输入, 这样我们就不能移动坦克了｡
‫这就需要我们的函数｡
‫我们在这里放置了调音坦克, 播放器控制器叫设置播放器使能状态｡
‫这意味着我将使用调音器, 播放器控制器｡
‫如果我打算使用调音台的播放器控制器, 最好确保它是有效的｡
‫所以我会说, 如果调整坦克, 播放器,
‫控制器, 如果我们到达这个if语句的内部, 那么我可以调整坦克, 播放器控制器, 并调用设置播放器启用状态, 并传入false｡
‫这样我们的坦克就无法移动了｡
‫我看到了红色的曲线, 那是因为我说的是坦克坦克, 玩家控制器, 而不是调音坦克｡
‫所以拼写正确了, 现在我没有错误了｡
‫所以接下来我们需要启动一个计时器｡
‫现在我们知道计时器涉及到使用F计时器句柄, 我们实际上可以创建一个F计时器句柄,
‫而不是拥有一个属于该类的成员变量｡
‫我将继续执行此操作, 并将此播放器称为启用计时器句柄｡
‫接下来, 我们需要为回调函数设置一个计时器, 我想使用set player
‫enabled state, 但set player enabled state是一个需要输入布尔类型的函数｡
‫现在, 我们还没有看到如何使用需要输入参数的回调来设置计时器｡
‫这将涉及一个新的概念, 称为计时器委托｡
‫所以让我们来看看虚幻引擎的计时器系统｡
‫同样, 我们知道有一个世界定时器管理器来管理我们的定时器, 它有一个设置定时器的功能｡
‫现在, set timer函数有多个重载｡
‫我们已经见过一个了｡
‫现在我来谈谈这个函数的另一个版本｡
‫这个版本需要一个计时器句柄, 一个计时器速率或者一个延迟时间, 在此期间我们必须等待回调函数被调用｡
‫它不直接获取回调函数的地址, 而是可以获取一个称为计时器委托的东西｡
‫这是一个F类型的结构体计时器委托, 它允许我们创建一个可以直接绑定函数的对象｡
‫和计时器委托可以绑定需要输入参数的函数｡
‫现在我们可以创建一个EF计时器委托变量, 并使用来自f计时器委托的create you对象函数对其进行初始化｡
‫这将创建一个新的计时器委托, 并根据传入括号中的内容对其进行初始化｡
‫这会采用的使用者物件｡
‫当然, 我们的回调函数所在的类｡
‫接下来, 它获取回调函数本身的地址, 后跟任何输入值, 一旦调用回调函数,
‫我们就将这些值传递给回调函数｡
‫从那里我们可以从世界计时器管理器调用set timer, 并使用接受计时器委托的重载｡
‫这个多载需要计时器控制代码本身､ 计时器委派､
‫播放速率或浮点数（决定呼叫回呼之前的延迟）, 然后是布林值（决定计时器是否应该循环）,
‫让我们知道如何建立F计时器委派｡
‫所以我希望你在新的if语句中的handle game start函数中创建一个｡
‫因此, 创建一个本地f计时器委托并使用f计时器委托｡
‫创建对象｡
‫现在我们需要传入一个用户对象, 通常我们使用它作为用户对象,
‫但是我们要调用的函数存在于播放器控制器上.
‫因此, 传入变量tune
‫tank播放器控制器作为第一个输入, 该输入将成为用户对象, 回调函数将设置播放器启用状态, 该函数已添加到自定义播放器控制器中｡
‫别忘了运算符的地址, 作为第三个输入, 我们将传入值｡
‫这是在计时器结束时调用回调时将传递到set player enabled状态的内容｡
‫所以暂停视频, 现在就试给予这个｡
‫在我们的计时器句柄下, 我将创建一个本地F计时器委托,
‫我将调用这个播放器使能计时器委托.
‫没关系, 我会的
‫如果你给它起个别的名字｡
‫现在我将使用f计时器初始化它, 委托, 创建您对象
‫这将首先使用一个用户对象, 这将是我们的tune tank播放器控制器｡
‫所以我会把tune tanks播放器控制器作为第一个输入｡
‫对于第二个函数, 我们需要回调函数, 它是一个tune tank播放器,
‫控制器设置播放器启用状态.
‫我不能忘记, 我需要这个函数的运算符的地址, 我想传递给这个回调函数的值,
‫就是这样的｡
‫在延迟时间结束时, 当这个回调函数被调用时, true将是传递给回调函数的值｡
‫现在我准备好调用set timer, 这意味着我需要调用get world timer管理器｡
‫然后我可以从那里调用set timer｡
‫我们首先要使用的函数重载有一个计时器句柄, 它是播放器使能计时器句柄.
‫下一个要传递的输入是委托｡
‫这就是玩家使能, 计时器委托｡
‫下一个
‫我们需要延迟时间, 这就是开始延迟, 也就是我们刚刚创建的浮点数｡
‫接下来我将传递启动延迟｡
‫最后, 我不希望这个计时器循环, 所以我将传入false, 这样我们就不会有循环行为｡
‫现在, 我将对这些输入进行缩进处理, 使其看起来更美观｡
‫现在我们使用新的计时器委托调用set timer｡
‫在此延迟时间结束时, 我们应该调用回调函数set player enabled state,
‫此时传入的值为true, 因为开始延迟为3秒, 并且在设置计时器之前, 我们调用set player
‫enabled state时传入的值为false｡
‫当我们按下播放键时, 我们应该在三秒延迟结束前无法移动｡
‫让我们编译一下, 看看它是如何工作的｡
‫所以我要继续按播放键, 我试着四处走动, 但我做不到｡
‫3秒后我就能突然动了｡
‫再看看这个
‫请注意, 我的光标是十字光标｡
‫它可能很难在屏幕上看到, 但你应该可以在屏幕上看到它就好了｡
‫而这让我更容易瞄准和控制我的坦克｡
‫炮塔旋转｡
‫好极了｡
‫总之, 我们为游戏模式创建了一个句柄game start函数, 我们调用它并开始游戏｡
‫我们还使用一个计时器委托设置了一个计时器, 我们将播放器控制器上的set player enabled state函数绑定到了该委托上｡
‫这允许我们为计时器提供一个函数回调, 它接受输入参数,
‫我们使用它在游戏开始时的三秒延迟后启用用户输入｡
‫现在, 如果玩家没有某种视觉提示, 让他们知道输入没有启用,
‫这可能会让他们感到沮丧｡
‫屏幕上出现了倒计时｡
‫我们将在以后的视频中介绍这一点｡
‫但现在, 恭喜你｡
‫您现在知道如何将接受输入参数的函数绑定到计时器委托｡
‫下一个视频里见｡