欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

学习虚幻4的笔记(第一部分)

最编程 2024-01-07 18:48:19
...

目录

  • 蓝图
    • 蓝图的概念
    • 蓝图的工作方式
    • 常用的蓝图类型
      • 关卡蓝图
          • 关卡的概念
        • 默认关卡蓝图
      • 蓝图类
        • 概念
    • 蓝图通信
      • 直接蓝图通信
        • 概念
        • 使用情景
      • 事件分配器
        • 概念
        • 使用情景
      • 蓝图接口
        • 概念
        • 使用情景
      • 蓝图投射
        • 使用情景

蓝图

蓝图的概念

虚幻引擎中的蓝图-可视化脚本系统是一个完整的游戏脚本系统,此系统的基础概念是使用基于节点的界面在虚幻编辑器中创建游戏元素(gameplay elements)。与诸多常用脚本语言相同,它用于在引擎中定义面向对象类(OO)或对象。当您在使用UE4时,您经常会发现使用蓝图定义的对象通俗地称为“蓝图”

蓝图的工作方式

在其基本形式中,蓝图是游戏的可视化脚本附加。使用引线连接节点事件函数变量后即可创建复杂的游戏性元素。
蓝图使用节点图表来达到蓝图每个实例特有的诸多目的(如目标构建、个体函数,以及通用gameplay事件),以便实现行为和其他功能。

常用的蓝图类型

最常使用的蓝图类型是关卡蓝图和蓝图类。他们是诸多蓝图类型中的两类,其他还有蓝图宏蓝图接口

关卡蓝图

关卡蓝图(Level Blueprint)是一种专业类型的 蓝图(Blueprint),用作关卡范围全局事件图。 在默认情况下,项目中的每个关卡都创建了自己的关卡蓝图,您可以在虚幻编辑器中编辑这些关卡蓝图, 但是不能通过编辑器接口创建新的关卡蓝图

关卡的概念

Level” 就是创建的场景,可以理解为容器(比喻来说可以理解成包装袋、包装盒等) 。

默认关卡蓝图

每个游戏都可以在DefaultGame.ini配置文件中指定默认的关卡蓝图类。所有新地图的关卡蓝图都将使用此类创建,以允许特定于游戏的附加内容和功能。

蓝图类

概念

蓝图类又叫蓝图系统是包裹一个游戏对象数据逻辑和各种内容可编辑属性为一体的容器,通常命名以BP_ 开头,图标下带有蓝色条纹。可以展开独立编辑页面,通常由视口事件图表等组成。

蓝图通信

使用蓝图时,如需在蓝图之间传递共享信息,需要使用某一种形式的蓝图通信。可根据需求使用数种不同类型的通信

直接蓝图通信

概念

通过公开的对象变量(Variable)获得对目标蓝图的参考,然后指定要访问该蓝图的哪个实例。

使用情景
  • 关卡中存在两个 Actors,需要进行相互之间的通信。

事件分配器

概念

事件分配器适用于告知其他"正在倾听的"蓝图已发生事件。事件发生时,正在倾听的蓝图便会作出反应,并相互独立地执行预期的操作。(观察者模式)

例如,游戏中有一个 Boss,它被消灭时将会调用"OnDied"事件分配器。可将"OnDied"事件 绑定 在任意数量的其他蓝图中,如角色(作出庆祝动作)、关卡中的门(会打开)或 HUD(显示 UI 信息)。所有这些蓝图均在收到 Boss 被消灭的"OnDied"通知后执行。

使用情景
  • 需要从角色蓝图到关卡蓝图进行通信时。
  • 生成的 Actor 执行某种操作时触发事件时。

蓝图接口

概念

通过蓝图接口(简称 接口)可实现与多种类型对象(均共享特定功能)形成互动的一般方法。 例如汽车和树是完全不同的两种对象,但拥有一个共同点 - 它们均可被武器开火击中并遭到破坏。接口实际上就是制定的统一规范的协议。而蓝图接口就是对蓝图制定的一系列规则的协议。

多个蓝图可应用一个接口,但并非所有蓝图均会形成反应(部分蓝图将无视调用)。回到之前武器开火的例子中,墙壁不需要对破坏作出反应,因此它们不会应用带 OnTakeWeaponFire 函数的接口,并无视调用。

使用情景
  • 数个蓝图中存在一些相似功能,但在调用后执行不同的效果。
    • 玩家拥有一个火焰喷射器,使用时将触发一个名为 ElementalDamage 的事件。树木蓝图接受 ElementalDamage 调用并将树木烧毁,而雪人蓝图将把雪人融化。
    • 玩家拥有一个"use"按钮,按下按钮可执行开门、关灯、拾起道具等操作。
    • 敌人拥有特殊能力,可基于玩家的体力值完成变化,执行不同操作。

蓝图投射

在这里插入图片描述
蓝图通信的另一种常见形式是使用 Cast 节点。使用 Cast 节点时,便是在询问对象"你是否为该对象的特殊版本"。如果是,则进行访问;如否,则忽略请求。

例如,您创建了一个名为"Flying Character 蓝图"的特殊角色蓝图,此蓝图可使玩家角色在游戏中飞行。您可使用 Get Player Character 节点访问玩家角色的移动组件并在通过常规方法对玩家产生影响,如设置其位置、旋转等。您无法获得飞行能力,因为 Character 蓝图并不了解飞行。只有"Flying Character 蓝图"了解飞行。在此例中,您需要获取玩家角色和 Cast To Flying 蓝图,之后才可访问 flying 函数。

如玩家角色未使用 Flying Character 蓝图而完全使用不同类型的 Character 蓝图,则执行 Cast To Flying 蓝图时会失败,因为并未使用 Flying 蓝图,所以无法访问并执行飞行命令。

使用情景
  • 需要访问另一个蓝图的特殊版本。
    • 角色走进火焰中,导致体力值耗尽。
      • 投射到特殊的角色蓝图,以便访问并变更体力值。
    • 角色死亡,需要重新生成。
      • 投射到特殊的游戏模式蓝图,执行重新生成脚本。
  • 需要访问相同类的多个蓝图,并以相同方法进行修改。
    • 场景中拥有数盏灯,事件发生时需将它们开启或关闭。
      • 投射到灯蓝图并执行函数将灯关闭。
  • 需要访问一个特殊的子蓝图。
    • 存在基于一个动物蓝图(猫、狗、鸟)的数个蓝图,需要访问其中一个动物。
      • 投射到猫、狗和鸟,访问其相应的蓝图和特有功能。

推荐阅读