Contents

UE4 一些实践建议

Contents
  1. Interfaces优先于Cast。通常,我们将Actor或组件强制转换为能够访问其方法所需的Class类型,但是强制转换不仅在性能方面比Interfaces昂贵,而且实现起来也很烦人。尝试一下Interfaces。 https://papalqiblog.oss-cn-beijing.aliyuncs.com/blog/picture20210210132323.png
  2. 使用组件共享行为。很多时候我们过多地依赖继承,以便在参与者之间共享行为。继承不一定全是错误的,但是比如游戏有两种类型的施加伤害的Actor:炮塔和角色。在这种情况下,您可以创建一个名为Damager的组件,并将其添加到两个Actor中。两个Actor都能够施加伤害,而不必担心他们是谁继承的。
  3. 隐藏对象的不可自定义属性。当Actor或Components具有变量时,您可以将它们从“详细信息窗格”中隐藏。只需单击要隐藏的变量,然后查找它们公开的“Advanced Display”属性并进行检查。之后,调整该Actor或Component或任何其他对象时,您将不再在“详细信息”窗格中看到此变量。https://papalqiblog.oss-cn-beijing.aliyuncs.com/blog/picture20210210132708.png
  4. 自动对齐连线。您创建了一个很棒的蓝图,里面到处都是节点。但是由于连线,它看起来像一团糟。快速改善这种情况的一件事是选择两个连接的节点并按“ Q”。

按Q前:

https://papalqiblog.oss-cn-beijing.aliyuncs.com/blog/picture20210210132931.png

按Q后:

https://papalqiblog.oss-cn-beijing.aliyuncs.com/blog/picture20210210132943.png

  1. 避免将持久状态存储在组件(Component)中。这更多地与有存档的游戏有关。无论使用哪种插件,还是想出自己的保存方法/解决方案,持久存储组件的变量都可能成为负担,因为大多数时候您必须在加载游戏之前重新创建组件并重新添加保存的组件。相反,应该将持久化变量(如HP、Money等)存储在Actors中。

  2. 尽可能使用球体而不是“胶囊和Box”。您有99%的时间希望在Actor中使用碰撞,而不必将它们设为Capsule或者Box。请改用Sphere,因为球的物理计算最简单。

  3. 使用数学表达式来描述您的数学公式。你可以像在论文中描述的那样描述它们!只需右键单击“蓝图”的网格,然后键入“添加数学表达式” 然后单击显示的选项。然后,像在纸上一样写下公式,并连接点! https://papalqiblog.oss-cn-beijing.aliyuncs.com/blog/picture20210210134928.png

https://papalqiblog.oss-cn-beijing.aliyuncs.com/blog/picture20210210135015.png

https://papalqiblog.oss-cn-beijing.aliyuncs.com/blog/picture20210210135028.png 8. 使用标签(Tags)!UE4为游戏中几乎每个对象都提供了一个被低估的内置功能,称为“Tags”。只需转到“对象详细信息/默认值”并搜索“标签”,就会显示一个数组。单击“加号”按钮并开始对其进行标记。这将很清楚的区分所有物体属性。当然,大型项目手动输入这些几乎是噩梦,小范围使用吧。 https://papalqiblog.oss-cn-beijing.aliyuncs.com/blog/picture20210210135234.png

https://papalqiblog.oss-cn-beijing.aliyuncs.com/blog/picture20210210135244.png 9. 不要滥用Event Tick。我知道这是陈词滥调,但这是严肃的事情。Event Tick是大多数问题的懒惰解决方案。假设您想在角色跳跃时做点什么。与其在事件Tick中放置“ if”以检查变量“ Is Jumping”是否为真,不如在按下按钮进行跳跃时创建一个名为“ OnCharacterJumpStart”(或任何您喜欢的事件)的事件分派器。然后,在对象处对跳转做一些事情。

  1. 你可能需要SetTimerByEvent而不是Event Tick。Event Tick在CPU的每一帧上运行。如果你需要以大于0.01s的时间间隔运行某项内容,则最好使用SetTimerByEvent。

  2. 在Replicated 事件(或RPC)中传递Actor是可行的。因为没办法传递一个Actor指针到服务器,Actor通过NetUID在RPC中传输,只有4个字节。然后,使用NetPackageMap将NetUID转换为指针,然后将其传递给对象。整个Actor仅发送一次。Actor的各个属性通过该Actor的ActorChannel更新。但是其他的指针,你最好想清楚。

  3. 使用SetGlobalTimeDilation。你是否知道在玩游戏时死亡或杀死某物时一切都会慢动作如何做到的?好吧,这是您执行此操作的方法之一。

  4. 经常打包游戏。“我希望我早点知道”这件事。你在打包时可能会面临噩梦,这是构建时在开发时看不到的一大堆错误。您等待的打包时间越长,发生错误的机会就越大。因此,请经常打包,经常解决问题,并保持整洁和安全。

  5. 在蓝图里使用Ctrl + Shift + F查找所需内容。