‫你好, 欢迎回来｡
‫现在, 我们已经创建了我们的投射类, 我们准备开始在关卡中繁殖这些东西,
‫这样我们就可以在塔上发射它们, 并最终摧毁它们｡
‫现在, 繁殖演员将涉及到繁殖演员函数｡
‫我们将在这段视频中了解它是如何工作的｡
‫现在, 让我们来谈谈如何生成抛射体｡
‫这是我们想从C++方面做的事情｡
‫我们将调用C++函数来动态地创建新对象｡
‫现在我们从C++的角度来进行派生, 但是我们希望根据projectile类的蓝图来派生一个对象｡
‫原因是因为我们有一个基于A Projectile C++类的蓝图, 其中包含了额外的信息｡
‫具体地说, 它具有网格属性集｡
‫我们为静态网格组件选择了网格｡
‫所以我们不能只生成C++版本｡
‫我们必须生成蓝图版本才能得到网格｡
‫所以问题是我们如何在C++中生成一个基于蓝图的对象？
‫我们将学习PT子类, 这是一个模板.
‫和许多模板一样, 尖括号也需要类型｡
‫因此使用PT子类需要一个类型参数｡
‫这样我们就有了一个变量, 用来存储U类.
‫U类代表一个类类型, 但它也有能力与虚幻引擎的反射系统进行交互｡
‫当我说反射时, 我指的是在C++和蓝图端之间交换信息｡
‫顾名思义, 的PT子类允许我们存储一个变量,
‫该变量表示基于我们传入的类型的类或所选类型的子类｡
‫这意味着我们可以选择一个类型, 并且t的子类可以包含一个u类, 该u类表示该类型或从该类型派生的任何类型｡
‫这包括基于类型的蓝图｡
‫我们来看看这个t子类是怎么工作的｡
‫好吧, 我会的
‫所以我回到了基地, 我在基地的原因是因为我们希望这个炮弹在坦克和塔类｡
‫这两个类都将是产卵抛射体｡
‫所以我想要一个变量的t子类｡
‫所以我会在尖括号里写上t, sub class of, 我们需要传入一个类型.
‫现在我们甚至可以像这样在尖括号内进行forward声明｡
‫我准备做一个发射体｡
‫原因是我们创建了projectory类, 它的类型是projectory｡
‫我将创建一个变量, 并将其命名为projectory类｡
‫现在, 这将允许我们有一个C++变量来表示一个类类型, 并且这个类型可以基于一个投射物,
‫甚至是一个基于这个的蓝图类类型｡
‫现在我要给予它一个U属性｡
‫因为我希望能够编辑此内容, 至少在默认蓝本中, 所以我将此编辑设置为默认值｡
‫只有现在我们才能给予这个一个范畴｡
‫我会把它归为战斗类｡
‫现在让我们继续编译它｡
‫好的, 我回到编辑器, 进入蓝图文件夹, 然后进入脑桥文件夹｡
‫我将打开BP-—油箱, 然后打开完整蓝图编辑器
‫现在, 如果我查看详细信息面板, 我可以查找战斗｡
‫在这里｡
‫这是抛射体类变量｡
‫这是我们称之为抛射体类的子类｡
‫现在请注意, 我们可以在这里设定, 也可以使用下拉式清单来设定｡
‫如果我们单击下拉菜单, 则有三个选项｡
‫我们可以把它设为none, 这是默认值, 也就是说它是一个空指针.
‫或者我们可以将其设置为射弹或BP射弹｡
‫的子类允许我们将projectory类设置为基于projectory的特定类型, 因为这是我们在创建变量时选择的类型｡
‫这里是抛射体｡
‫这是C++中称为projectile的C++类｡
‫它是一个projectile, 但是BP projectile是一个基于C++ projectile类的蓝图, 我们可以选择它｡
‫现在, 弹丸类被设置为BP弹丸类型｡
‫现在, 这不是一个组件, 也不是一个BP投射物体｡
‫不是这样的
‫它存储一个类型, 更具体地说是一个U｡
‫类类型｡
‫就像我说的, 你的类有内置的功能, 允许反射在C++和蓝图之间工作｡
‫信息可以在C++和蓝图之间流动｡
‫所以现在我们有了projectile类, 一个PT子类, 设置为BP projectile蓝图类型｡
‫那么, 为什么要费尽心思创建变量的子类呢？
‫我们需要讨论一下spawn actor函数是如何工作的｡
‫Spawn actor是一个属于新世界类的函数｡
‫所以如果我们掌握了世界, 我们可以叫再生演员｡
‫Spawn actor是另一个模板函数, 它的设计目的是创建新对象, 类似于创建默认子对象｡
‫但创建默认子对象是为创建组件而设计的, 我们只能在特定类的构造函数中使用它,
‫在游戏运行时, 可以在运行时调用派生演员, 它可以创建演员｡
‫现在它是一个模板, 所以它需要一个类型｡
‫如果我们想要生成一个projectile, 那么我们会在C++类中传递projectile类型.
‫这是由C++中的spawn actor函数返回的C++类｡
‫现在括号中有许多参数, 包括一个U类｡
‫现在, 这个函数有多个重载, 它们采用不同的输入参数｡
‫最简单的可能是一个U类, 一个位置和一个旋转的版本｡
‫美国｡
‫类表示要派生的类型｡
‫这是衍生的对象的实际类型｡
‫这可能是一个蓝图类｡
‫位置是一个F向量, 指定在何处生成对象, 旋转将指定对象的旋转｡
‫语法示例如下所示｡
‫我们将调用spawn actor, 指定类类型,
‫然后传入u类信息沿着位置向量和旋转器｡
‫我们来谈谈你的课｡
‫现在, 正如我们所说的, 你的类代表一个类类型｡
‫当我们调用Spawn actor时, 我们传入一个U类, 以便为spawn
‫actor函数提供有关要生成的对象的信息｡
‫是的, 我们在尖括号中传递了一个类型, 但这只是告诉Spawn actor要创建的C++类型｡
‫而你的类包含更多的信息｡
‫假设我们创建了一个基于投射物的蓝图, 并在蓝图中设置了一些属性,
‫例如为静态网格组件选择静态网格｡
‫现在, 如果我们只是生成一个原始的C++类, 那么静态网格将不会设置在新生成的投射物对象上｡
‫本质上, 我们只是在孕育一个看不见的新演员｡
‫但是, 新的类变量可以表示蓝图类｡
‫您的类使我们能够在C++端拥有一个变量, 它表示一个蓝图､ 类类型和衍生｡
‫Actor可以将该类作为输入参数, 这样它就可以根据新类所表示的蓝图生成新对象｡
‫所以一个新的投射物将设置它的静态网格属性, 因为我们是基于蓝图而不是原始的C++类来生成一个新对象的｡
‫这就是我们创建子类的原因, 因为它可以存储一个新的类,
‫并且我们可以将它设置为等于我们的BP坦克蓝图中的BP炮弹｡
‫现在你知道怎么生演员了｡
‫Spawn演员属于新的世界级｡
‫所以如果你调用get world,
‫然后简单地调用Spawn actor, 那么你知道这个函数的输入要求, 你在尖括号中传递C++类型, 你在括号中类了一个位置和一个旋转｡
‫所以对于你的挑战, 你将在fire函数中生成抛射体｡
‫所以调用get world spawn actor并在尖括号中传递一个抛射体｡
‫这意味着您需要包含projectory的头文件｡
‫所以别忘了这一点, 并使用我们新的变量抛射体类作为括号中的U类输入参数｡
‫现在我们需要一个位置和一个轮换｡
‫你将使用抛射体的产卵点来定位和旋转｡
‫从投射物产生点组件｡
‫您可以呼叫取得元件位置和取得元件旋转来存取这些值｡
‫所以暂停视频, 现在调用火函数中的spawn actor｡
‫好吧, 我会的
‫让我们进入定义了激发函数的基础池CP｡
‫现在我们在这里画出了调试球体｡
‫我们真的不需要了｡
‫我将删除这个函数调用, 改为调用Spawn actor.
‫现在我们已经有了抛射体的产卵点位置｡
‫我将把这个局部变量重命名为location, 然后创建一个新的F旋转器｡
‫称为旋转｡
‫这个我也会从投射物的产卵点得到｡
‫所以它是抛射体的产生点, 得到了组件的旋转｡
‫现在我有了产生抛射体的位置和旋转角度｡
‫所以接下来我需要调用spawn actor这样我就可以调用get world了｡
‫从这个函数得到的世界中, 我可以调用spawn actor｡
‫这里有尖括号和圆括号, 对吧？
‫所以在角括号里, 我需要用一个抛射体｡
‫因为我们使用的是抛射体, 所以我们需要包括它的头部｡
‫在这里, 我将删除, 绘制调试助手, 并将其替换为projectile｡
‫所以现在我们把这种类型包括在内了｡
‫现在我们需要U类, 基于H有抛射体类, 我们可以用它作为U类｡
‫所以我们要通过抛射体课｡
‫现在, 最后, 我们可以传入位置和旋转, 这将满足spawn actor函数｡
‫让我们继续编译, 然后回到编辑器, 我们可以测试一下.
‫我将继续单击并查看它｡
‫我们已经产生了一个新的炮弹｡
‫我们在发射筒的顶端发射炮弹, 它们就在空中盘旋, 这看起来不太对劲｡
‫不过没关系
‫这是第一步｡
‫我们首先要繁殖抛射体, 让它像抛射体一样作为下一步｡
‫所以总而言之, 我们现在正在繁殖抛射体｡
‫这是一个伟大的里程碑｡
‫然而, 它们还不完全是抛射体｡
‫他们只是在那里盘旋, 炮弹应该在空中飞行｡
‫所以在下一个视频中, 我们将讨论如何让我们的抛射体在空中飞行, 这样它们就像抛射体一样｡
‫我很快就会见到你的｡