注意构造脚本(UE4)

如果您使用虚幻引擎4进行开发,则肯定使用了构造脚本。 可能不知道这会毁了您的项目。

可在蓝图编辑器中访问构造脚本:

或者,如果您愿意,在C ++中,它可以通过OnConstruction方法表示:

virtual void OnConstruction( const FTransform& Transform) {} 

更详细的信息可以在这里找到:https://docs.unrealengine.com/en-us/Resources/ContentExamples/Blueprints/1_4

这个方便的工具对于定义演员的构造方式非常有用。 一个典型的用例是当您希望能够设置actor的属性并根据编辑器中的这些参数自动看到正在更新时。 例如,我们可以使用它来构建一个具有数作为属性的多边形 actor,并且每次编辑边数时,我们都可以看到在编辑器中(而不是在运行时)正在重建和更新多边形。

但是,尽管它确实很有用,但如果使用不当,也会非常危险, 最终会导致编辑器崩溃

为了避免任何潜在的问题,我们需要:

  • 知道何时调用构造脚本
  • 了解它如何导致编辑器崩溃,使您的项目无法编辑
  • 学习适当地使用它(构造脚本并不总是答案)

如何以及何时调用构造脚本

这是构造脚本最有趣的一点:它在编辑器中调用,而不是在运行时调用。

在编辑器中,可以多次调用它:

  • 当演员产生时
  • 移动actor时PostEditMove事件):在这种情况下,将在移动对象时调用多次
  • 当actor的属性更改时PostEditChangeProperty事件)

正如我们所看到的,它可以经常被调用。 同时,它确实很有用(如果我更改任何属性,我都可以直接看到由构建脚本重新构建的对象),那么就会出现一些缺点。

滥用的主要威胁

使用构造脚本时有两个主要威胁。 第一个很明显,第二个比较棘手。

第一个是对项目性能的影响 :即使仅在编辑器中调用了构造脚本,但如果构造脚本太重,您将无法再在编辑器中移动角色。 假设需要花费一秒钟的时间来运行您的ConstructionScript,如果您尝试移动actor,则在替换它时会调用数十次构建脚本,因此它将在数十秒内冻结。 您可能会认为这不是什么大问题,演员仅需要产生一次就可以移动,但是之后不会移动,但是对于要使用您的演员的设计师来说,记住不要移动这个特定的对象将是非常痛苦的事情。如果他/她不想冻结他/她的编辑。

正如我所说,第二个威胁更加棘手。 它涉及构造脚本的循环调用: 如果属性的更改导致构造脚本的循环调用,则编辑器将崩溃 。 原理如下:假设我们在一个演员上有一个属性A和一个属性B,构造脚本指出如果A改变,那么B等于A + 1,如果B改变,那么A是等于B + 1。 从理论上讲,这可能会导致无限循环崩溃。 幸运的是,此特定情况由编辑器管理:构造脚本无法触发自身(即使它更改了其参与者的属性)。 但是,如果您有一个具有ChildActorComponent的actor,并且该actor与孩子之间存在循环关系,那么编辑器将无法保存您。 它只会崩溃(根据我的经验,并不是每次都这样,这使得诊断更加困难)。 确实,如果父代的构造脚本更改了子代的属性,并且如果子代的构造脚本更改了父代的属性,我们将进行循环调用(在两个不同的代写脚本之间)。

模式和反模式

话虽如此,以下是我对构建脚本用法的建议:

  • 避免在不必要的情况下使用它们 :它是一种自动化工具,仅当您有重复的任务要自动化时才使用它
  • 保持构造脚本简单,快速 ,这只是一种方便的工具,而不是制作完整的程序游戏
  • 避免在构造脚本中更改其他角色(甚至是子角色)的属性 ,如果必须这样做,请记住,循环调用构造脚本可能会使编辑器崩溃