代码改变世界

虚幻4蓝图快速入门(一)

2016-09-29 22:01  风恋残雪  阅读(38687)  评论(3编辑  收藏  举报

蓝图快速入门

序言

本文依据官方教程总结而来,只是带你对蓝图有一个快速的认识,如果想对蓝图有一个比较深入的了解,那么可以看官方的视频或者是做一些小项目练手,如果你有编程经验的话,上手还是很容易的。

蓝图快速入门

什么是蓝图

虚幻引擎中的蓝图可视化系统是一个完整的游戏脚本系统,其理念是使用基于节点的界面从虚幻编辑器中创建游戏可玩性元素,该系统非常灵活且非常强大,因为它为设计人员提供了一般仅供程序员使用的所有概念及工具。它是一种特殊类型的资源,为关卡设计师和游戏开发人员提供了一种在编辑器中快速创建及迭代游戏可玩性的工具。

通过使用蓝图,设计人员几乎可以创作任何游戏元素的原型,以及实现或修改这些元素。

  • Games(游戏)创建游戏规则,调整游戏条件等。
  • Players (玩家)使用不同的网格物体、材质或角色自定义来创建变种
  • Cameras (相机)创建新相机视角的原型或者在游戏运行过程中动态地改变相机。
  • Input(输入)修改玩家操作,或允许玩家向道具传入输入
  • Items (道具)武器、法术、掉落物、触发器等。
  • Environments (环境)创建随机的装置或者程序化地生成道具。

 

为了对蓝图有一个基本的印象,你可以查看:

  • 官方快速入门指南
  • 虚幻引擎快速入门视频教程

对于程序员来说,我们可以把它理解为一种可视化的高级语言(C#等),它有基本的变量、函数、类型转换,支持继承、多态等。

蓝图的工作原理

从蓝图的基本形式上讲,蓝图是针对您游戏添加的可视化脚本。通过使用连线把节点、事件、函数及变量连接到一起,这样就可以创建复杂的游戏性元素。蓝图通过各种用途的节点构成图来进行工作,这些节点包括针对蓝图每个实例的对象构建、独立的函数、一般的游戏性事件,从而实现各种行为及其它功能。

对比

UnrealScript vs Blueprints vs C++

UnrealScript (UE3):

  • 一种面向对象的脚本语言
  • 跟C,C++,Java的语法相似,但是也有些不同
  • 编译成虚拟机字节码
  • 添加了一些有趣的功能,比如状态(States),定时器(Timer)委托等(Delegates)

蓝图 (UE4):

  • 一种面向美术人员和设计师友好的可视化脚本系统
  • 跟UnrealScript使用的相同的虚拟机
  • 几乎跟UnrealScript一样强,在某些方面甚至更强

C++:

  • 一直是UE游戏编程中的一部分
  • 跟虚拟机相互紧密地结合在一起
  • 在UE4里面得到巨大的改进用来让编程人员替代UnrealScript

蓝图跟c++对比

  • 蓝图适合快速迭代
  • 蓝图比原生C++消耗更多的CPU性能
    • 运行在虚拟机上
    • 大约比原生C++代码慢8~10倍
    • 对于大多数简单的事件驱动的任务,你可能并不会发现性能有什么大的消耗
    • 许多发行的AAA游戏都在使用蓝图(包括Epic自己)
    • 每帧需要更新的(tick)应用使用原生C++(物理模拟)
  • 但是,蓝图仍然很合适做原型开发
    • 可以让设计师在蓝图快速得创建他们所需的原型,然后让程序员把它转换成代码
    • 这是Epic公司如何使用蓝图的

总结

  • 蓝图可以让设计师快速简单得实现想法
  • 图状结构可以让程序员快速简单得用C++代码实现并优化
  • 代码可以在编辑器中添加到任意工程中
  • 快速协作、畅通沟通,不会出现模糊不清的玩法设计。

个人理解,蓝图系统非常强大,可用于快速原型设计、简单事件驱动玩法的开发,但是如果玩法复杂需要耗费非常多的CPU性能,那么最好把设计师使用蓝图设计的玩法翻译成原生的C++代码,如果本身一些像物理模拟等需要每帧更新又特别耗时的那么需要使用C++来进行开发。

蓝图类型

关卡蓝图(Level Blueprint)

关卡蓝图是一种特殊类型的蓝图,是作用于整个关卡的全局事件图表。关卡事件或者关卡中的Actor的特定实例,用于激活以函数调用或者流程控制操作的形式呈现的动作序列。熟悉虚幻引擎3的人应该非常熟悉这个概念,因为这和虚幻引擎3中的Kismet的工作原理非常相似。

关卡蓝图提供了针对关卡动态载入、Matinee以及给放置到关卡中的Actor绑定事件的机制。

类蓝图 (Blueprint Class)

类蓝图是一种允许内容创建者轻松地基于现有游戏性类添加功能的资源。它是在编辑器中可视化地创建的,不需要书写代码,会被作为类保存在包中。实际上,这种类蓝图定义了一种新类别或类型的Actor,这些Actor可以作为实例放置到地图中,就和其它类型的Actor的行为一样。

父类

你可以创建多种不同类型的蓝图,当然在你做这些之前,你需要指定该蓝图的**Parent Class(父类)** 选择继承父类,允许你在自己的蓝图里面调用父类创建的属性。

下面是你创建蓝图是最常见的父类:

  • Actor    一个可以在世界中摆放,或者生成的Actor。
  • Pawn    Pawn是一个可以从控制器获得输入信息处理的Actor.
  • Character    角色是一个包含了行走,跑步,跳跃以及更多动作的Pawn.
  • PlayerController     角色控制器
  • Game Mode    一个Game Mode 定义了游戏是如何被执行的,游戏规则,如何的分以及其他方面的内容。

仅包含数据的蓝图(Data-Only Blueprint)

仅包含数据的蓝图是指仅包含代码(以节点图表的形式)、变量及从父类继承的组件的类的蓝图。仅包含数据的蓝图允许你调整及修改继承的属性,但是不能添加新元素。从本质上讲,这些蓝图是原型的替代物,设计人员可以使用它们来调整属性或者设置具有变种的项目。可以通过添加代码、变量或者组件来将它转换成完整的类蓝图。

蓝图接口(Blueprint Interface)

蓝图接口是一个函数或多个函数的集合,它相当于C++中的一个纯虚基类,仅有函数名称,没有实现,该接口可以添加到其它蓝图中。使用具有该接口的蓝图,都一定会具备这些函数。在每个添加了接口的蓝图中,都可以提供接口的这些函数功能。从本质上讲这各一般编程中的接口概念一样,允许通过一个公共接口来共享及访问多种不同类型的对象。简单地讲,蓝图接口允许不同的类蓝图间彼此共享及发送数据。

蓝图接口的创建和其他类似,可以通过编辑器中的内容创建器进行创建,但它们有一些局限性,因为它们不能:

  • 添加新变量
  • 编辑图表
  • 添加组件

蓝图宏库(Blueprint Macro Library)

蓝图宏库是一个存放了一组宏的容器,或者是可以像节点那样放置到其他蓝图中的自包含图表。这些蓝图宏库非常节约时间,因为它们存放了常用的节点序列、及针对执行和数据变换的输入和输出。

宏会在所有引用它们的图表间共享,但是如果它们在编译过程中是合并的节点,那么它们会自动地展开为图表。这意味着蓝图宏库不需要进行编译,但是对宏所做的修改,仅当重新编译了包含引用该图表的蓝图时,这些修改才会反应在图表中。

参考:

  1. https://docs.unrealengine.com/latest/CHN/Engine/Blueprints/QuickStart/index.html
  2. http://blog.csdn.net/neil3d/article/details/49070135
  3. http://www.slideshare.net/GerkeMaxPreussner/east-coast-devcon-2014-game-framework
  4. http://www.slideshare.net/GerkeMaxPreussner/gdce-2015-blueprint-components-to-c