虚幻中的C++!
本文主要介绍如何在幻像引擎4(UE4 )中编写c代码。 幻想引擎中的c编程很有趣,入门也很简单! 幻想中的c经常被认为是“辅助性的c”,但由于幻想有很多功能,所以所有人都可以更容易地使用c。
在开始之前,你必须已经对c或其他编程语言有所了解。 我假设你已经有一些c经验,但如果你知道C#、Java或JavaScrip,就会发现有很多相似之处。
如果完全没有编程经验的话,尽情地囫囵吞枣看看就行了。 不要追求任何东西就ok了。
在UE4中,可以编写标准的c代码。 接下来详细说明。
C++与蓝图
UE4提供了两种创建新Gameplay元素的方法。 c和蓝图视觉脚本。 程序员可以使用c添加基本的游戏系统。 设计师可以建立在这些系统的基础上,也可以使用这些系统制作特定水平和游戏本身的定制游戏。 在这种情况下,c程序员在文本编辑器(如Notepad )和IDE中工作,通常在Microsoft Visual Studio和Apple Xcode中工作,而设计师在UE4的蓝图编辑器中工作。
Gameplay API和框架类可以在这两个系统中使用,也可以单独使用,但如果结合使用,互补的长度会起到真正的作用。 那么到底有什么意义呢? 也就是说,当程序员使用c创建Gameplay构建块,设计师使用这些块创建有趣的Gameplay时,引擎将发挥最大作用。
让我们来看一下c程序员为设计师创建构造块的典型工作流程。 在这种情况下,您将创建一个类,以后设计师或程序员可以使用路线图进行扩展。 在这个类中,我们将创建一些可以由设计师设置的属性,然后根据这些属性导出新值。 整个过程只要使用我们提供的工具和c宏就可以完成。 很简单。
类向导
首先,使用编辑器中的“添加c类”生成将来在路线图中扩展的基本c类。 下图显示了向导的第一步,即创建新的Actor。
选择基类
此过程的第二步是向向导通知已经生成的类的名称。 这是使用默认名称的第二步。
设置类名
如果选择创建类,向导将生成文件,打开开发环境,以便于开始编辑。 以下是生成的类的定义。
头文件
类生成你的类,提供BeginPlay和Tick两种重载方法。 BeginPlay事件表明,Actor以可执行状态进入了游戏。 这是启动Gameplay逻辑的好地方。 Tick将逐帧调用,并使用自上次调用以来经过的时间。 可以在这里执行重复逻辑。 但是,如果不需要此功能,请将其删除。 这有助于表演。 如果要删除,请务必删除构造函数的适当性,该构造函数指示必须启动tick事件的发生。 以下构造函数包含所提到的行。
源文件
创建
让属性出现在编辑器中
类之后,让我们来创建可以由设计师在幻想编辑器中设置的属性。 在编辑器中公开属性很容易,只需要使用说明符UPROPERTY就可以实现。 只需在属性声明的前一行中添加uproperty(editanywhere ),如下面的类所示。
在编辑器中公开属性
只需执行上述操作,即可在编辑器中编辑值。 还有其他方法可以编辑和控制该值的位置。 方法是将更多的信息传递给UPROPERTY说明符。 例如,如果要在包含相关属性的部分中显示m_totalDamage属性,请使用分类功能。 具体来说,请参见以下属性声明
当用户想要编辑该属性时,它现在会出现在”伤害(Damage)”标题下面,与你已经标记为此类别名称的任何其他属性在一起。这是将常用设置放在一起以供设计师编辑的好方法。
现在,让我们将同一个属性公开给蓝图。
如你所见,有一个说明符可以让属性在蓝图图表中可供读写。有一个单独的说明符 BlueprintReadOnly,如果你希望属性在蓝图中被视为 常量,可以使用这个选项。
再继续以下部分前,我们来向该样本类添加几个属性。已经有一个属性可以控制该Actor将释放出的总伤害量,但让我们更进一步,让这个伤害随着时间而逐渐释放出来。下面的代码添加了一个可以由设计师设置的属性,以及一个对设计师可见但不能更改的属性。
m_damageTimeInSeconds 是设计师可以修改的属性。m_damagePerSecond 属性的值使用设计师的设置计算得出(请参见下一节)。VisibleAnywhere 说明符将该属性标记为可见,但不可编辑。Transient 说明符意味着,它不会保存或从磁盘加载;它就是一个派生的非持久值,所以没有必要存储它。下图显示作为类默认值一部分的属性。
为了按实例支持设计师设置属性,还会从给定对象的实例数据加载值。该数据在构造函数之后应用。你可以根据设计师设置值创建默认值,方法是钩入 PostInitProperties() 调用链中。下面示例展示了 m_totalDamage 和 m_damageTimeInSeconds 为设计师指定值的流程。尽管它们是设计师指定的,但你仍可以为它们提供合理的默认值,就像下述示例一样
这里是添加了上述 PostInitProperties() 代码后的属性视图。
到目前为止,我们已经了解了c++对象初始化以及每一帧的接口,还有成员变量如何公开到虚幻编辑器,通过以上学习可以说已经成功入门虚幻c++了,加油!