‫你好, 欢迎回来｡
‫现在, 我们准备开始处理用户输入｡
‫这意味着我们要按键盘键, 移动鼠标, 点击鼠标, 看看我们的坦克对输入的反应｡
‫现在, 为了做到这一点, 我们首先需要实际获得输入,
‫我们首先要开始使用轴映射来做这件事｡
‫我们来谈谈这个吧｡
‫现在, 在项目中, 让我们转到编辑和项目设置｡
‫如果我们向下滚动并选择input, 则会在此处看到绑定｡
‫在绑定下有动作映射和轴映射｡
‫我们首先要学习轴映射｡
‫现在, 您可能对这些产品有一些经验, 但我们将更深入地了解它们的功能和工作原理｡
‫所以我们有三个｡
‫如果我单击下拉箭头, 我会在这里看到W和SW, 这是键盘上的W和SW键｡
‫这些将指定给此特定轴映射, 称为“向前移动”｡
‫我们来讨论一下轴映射的工作原理｡
‫我们在虚幻编辑器中看到, 我们有一个称为“向前移动”的轴映射, 它将W和SCS分配给了这个轴映射｡
‫那么这到底意味着什么呢？
‫在Unreal Engine中, 我们有一个叫做轴映射的东西｡
‫而轴映射是处理游戏中每一帧的东西｡
‫可以为轴映射指定关键点｡
‫在本例中, 我们指定了W和S｡
‫现在看一下W键旁边｡
‫在我右边的小截图示例中, 它显示了比例｡
‫在刻度旁边是数字1｡ 0.
‫你们可能已经注意到, 在SQ旁边的刻度是-1｡ 0.
‫这些值将影响输入信息｡
‫以下是轴映射的工作原理｡
‫我们的轴映射前移有能力与C++中的一个函数相关联｡
‫现在, 当涉及到轴映射时,
‫如果我们将函数与轴映射相关联, 则它需要接受浮点类型的输入参数, 以便我们可以在池塘上创建一个名为MOVE的函数, 该函数接受浮点｡
‫我们只调用这个输入参数值｡
‫现在有一种方法可以把这个函数和我们的向前移动轴映射联系起来｡
‫它表示我们将移动函数绑定到轴映射｡
‫所以游戏的每一帧虚幻引擎的输入系统都要检查我们是按W键还是键｡
‫它会根据我们是否按下这些键和每一帧来计算轴的值｡
‫它会调用这个函数, 我们已经绑定了这个函数来向前移动, 并传递轴的值｡
‫函数内部发生的任何事情都取决于我们作为C++开发人员｡
‫下面是它的工作原理｡
‫如果我们没有按W或键, 这个轴的值为零｡
‫因此绑定到向前移动轴映射的move函数在每一帧都被调用, 传入的浮点值为零｡
‫现在, 假设我们按下W键｡
‫W键的比例设定为1｡ 0.
‫这意味着我们的坐标轴值将为1｡ 0, 这就是传递给MOV函数的内容｡
‫因此, 每一帧, move函数的调用值为1｡ 0已传入｡
‫现在, 假设我们按下SRC, 其比例值为-1｡ 0.
‫这意味着每一帧move函数都将被调用, 并且-1｡ 将传入0｡
‫现在我们同时按下W和S键, 这两个值会加在一起｡
‫所以我们得到1｡ 按W键得到0, 得到-1｡ 按下SRC时为0｡
‫现在这两个互相抵消了｡
‫所以如果我们同时按下两个键, 调用move函数时会传入0｡
‫所以根据我们按下的按键组合,
‫我们会得到一个不同的值传递给MOVE函数, 我们可以对这个值做任何我们喜欢的事情, 比如用它来移动棋子｡
‫我们很快就会讨论如何移动棋子｡
‫现在, 让我们先进行实际设置, 以便能够处理来自Axis映射系统的信息｡
‫好了, 现在我们知道了Axis映射的工作原理, 接下来是时候创建一个回调函数了, 我们可以将它绑定到move
‫forward轴映射｡
‫因此, 我将关闭项目设置, 并跳回到VS代码｡
‫在这里的VS代码中, 我们想要创建一个函数, 它可以绑定到move forward轴映射｡
‫所以在池H中, 我们可以创建一个私有函数｡
‫现在它就要有了｡
‫void返回类型, 我想调用这个move｡
‫现在它需要一个浮点输入参数, 我们将调用这个值.
‫让我们在Tank中定义移动函数.
‫我会把它放在构造函数下面, 我们需要一个函数名前面有作用域解析操作符的tank｡
‫所以我们有了这个移动函数, 我们准备把它绑定到向前移动轴映射上｡
‫这是在一个名为setup player input component的函数中完成的｡
‫这听起来应该很熟悉｡
‫事实上, 如果我们打开浏览器并返回Base蓬特H, 我们可以向下滚动并在public部分看到function setup
‫player input组件｡
‫我们将看到这是一个继承的虚函数的重写｡
‫现在, 基本spawn类实际上不需要设置任何输入, 这就是这个函数处理来自播放器的输入的目的｡
‫现在, 我们的bond基类不需要处理输入, 但我们的tank类需要｡
‫所以我们可以把这个函数从基池h中取出来, 但我要复制它, 因为tank中需要它｡
‫复制这个函数, 我将把它粘贴到H罐的公共部分｡
‫因为我们不需要它在基础池, 我只是要删除它从基础池类｡
‫事实上, 我将进入基础池CP, 并将其从这里移除｡
‫因此, 让我们继续从Base Pond中删除设置玩家输入组件｡
‫现在它不再属于基本池塘类｡
‫因此, 让我们继续并保存更改, 然后关闭基础池塘H和CP｡
‫现在, 我们已经在Tank H中声明了setup播放器输入组件, 但我们还想定义它和tank｡
‫所以在坦克指挥部
‫我将在move函数的上面添加一个定义｡
‫所以这是一个空的, 它是一个坦克设置玩家输入组件｡
‫现在, 让我们回到坦克H, 看看它的输入参数类型是什么｡
‫你会看到它在括号里是正向声明的｡
‫如果你想在头文件中声明一个类类型, 你可以这样做｡
‫所以这里是正向声明的, 我们需要这个输入组件指针类型, 这个参数叫做播放器输入组件.
‫因此, 我们需要在tank中输入这个参数｡
‫在括号中的设置播放器输入组件, 我们将有一个U输入组件, 它是一个指针,
‫它被称为播放器输入组件｡
‫所以现在函数签名与函数声明中的签名匹配｡
‫现在回到CP文件, 我们给予这个函数一个函数体, 我们要覆盖这个函数,
‫调用超级设置播放器输入组件是个好主意｡
‫现在, 由于我们要调用setupplayer输入组件的父版本, 因此必须传入一个类型为you
‫input组件的输入｡
‫我们要把输入参数传递给这个函数.
‫所以这样父类将调用它的版本｡
‫现在基塘的水箱还没有实现这个功能｡
‫我们刚把它移走了｡
‫但是基类的父类——将调用它的版本｡
‫无论何时重写这样的虚函数, 调用超级版本都是一个好主意｡
‫因此, 我们不会错过父版本中实现的任何功能｡
‫那我们为什么要这么做？
‫设置播放器输入组件的好处是什么？
‫它的优点之一是绑定函数来访问映射｡
‫我们希望将移动函数绑定到向前移动轴映射｡
‫而我们在这里就是这么做的｡
‫我们使用这个输入参数播放器输入组件来完成此操作｡
‫这就是这个物体的设计目的｡
‫我们使用播放器输入组件, 并在此指针上使用箭头操作符访问一个名为bind axis的函数｡
‫现在“绑定轴”需要一些输入参数｡
‫第一个是字符串文字, 这意味着我们将使用文本宏｡
‫现在我们在引号里写什么呢？
‫我们把轴的名称映射出来｡
‫我们在编辑器中看到, 这个轴映射称为向前移动｡
‫因此, 我们选择该轴映射绑定到第二个输入参数｡
‫这将是一个指向对象的指针,
‫而绑定函数的对象是一个指向特定类的实例的指针, 因为我们在坦克类中, 这将指向游戏中坦克兵的实例.
‫现在第三个参数是我们要绑定的函数的地址｡
‫所以我们有一个坦克移动｡
‫非常重要的是, 我们需要充分｡
‫用类名限定函数名｡
‫在函数名的前面, 我们需要运算符的地址｡
‫现在, 如果你不熟悉这样做, 这只是取一个函数的地址｡
‫函数可以像变量一样有地址｡
‫因此使用运算符的地址是一种将函数传递到其他函数的方法｡
‫所以我们需要接线员的地址｡
‫因此, 我们有函数调用来绑定访问｡
‫现在, 您可能注意到IntelliSense错误指针指向不完整的类类型, 您输入的组件是不允许的｡
‫现在我们知道是什么导致了这个｡
‫首先, 这可能意味着我们需要包含一个头文件｡
‫另一种可能性是, 这是一个虚假的错误｡
‫你可以通过编译很容易地找到答案, 所以让我们试着编译一下｡
‫我们将看到编译成功｡
‫所以我们知道这是一个虚假的错误｡
‫但同样, 如果需要, 您可以添加include来删除它｡
‫所以你不介意｡
‫现在我们知道它所抱怨的类类型是输入组件｡
‫这是文档中的输入组件, 这是包含组件｡
‫如果我们把这个加到坦克CP文件的顶部, 我们就可以去掉那个讨厌的假错误｡
‫同样, 因为这些pragya想要包含guard, 我们知道输入组件不会被包含超过一次,
‫所以它们消失了｡
‫现在我们知道, 每一帧都会调用这个move函数, value会有一个特定的浮点值,
‫这取决于我们是按W还是问｡
‫现在, 仅仅知道move函数一定会向前移动是不够的｡
‫作为开发人员, 能够确认一切正常是件好事｡
‫所以我希望你们在挑战中使用MOV函数中的YUI log,
‫打印传递给move的float调用值.
‫所以在uiy log中使用percent f, 把浮点数的值记录到输出日志中, 然后测试一下这个游戏,
‫按下这些键, 看看你会打印出什么｡
‫暂停视频, 现在将其添加到移动功能中｡
‫好吧, 我会的
‫所以在mov函数中, 我将添加一个uii日志｡
‫这可能是日志临时警告｡
‫而对于文本宏｡
‫我只需要把值, %, F和值｡
‫现在没事了｡
‫如果您使用了不同的详细程度或警告类型, 如果您知道如何执行这些操作｡
‫没关系的
‫我在这里只使用一个警告, 我知道您已经使用了percent se之类的东西, 并使用字符串值格式化了日志｡
‫Percent F（如果您不知道的话）是使用浮点值格式化UI日志的方法｡
‫让我们编译它, 然后回到编辑器中, 我将打开输出日志并按“播放”, 然后检查它,
‫在那里用无数的消息向输出日志发送垃圾邮件｡
‫现在, 我将在视口中单击并按W键｡
‫这是我的值1, 我要释放它.
‫一切都归零了｡
‫我按下这个键, 结果是负1
‫如果我们同时按两个键, 我们得到零｡
‫这和我们预期的完全一样
‫好极了｡
‫好吧, 我会的
‫在本视频中, 我们设置了池塘来处理一些用户输入｡
‫我们讨论了访问映射, 并将move函数绑定到前移访问映射.
‫然后, 我们在MOVE函数中使用YUI日志打印该访问值, 但实际上我们希望移动坦克,
‫而不是仅将一些值打印到输出日志｡
‫在接下来的课上, 我们会把它设置好, 这样我们就可以开始移动水箱了.
‫我很快就会见到你的｡