unreal4 动作 添加

2017-09-12 10:45:00 OnafioO 阅读数 189

unreal4特性介绍


原文地址:   https://www.unrealengine.com/products/unreal-engine-4     unreal enginer介绍


我的UE4学习(一)


你曾想过用连线的形式来编写程序么;
你曾想过通过编辑工具就可以来创建类,并在vs中自动生成类和函数,头文件和cpp文件么;
你曾想过粒子效果可以成千上万的渲染,并且牛逼的粒子还可以反射光线么;
你做的效果可以能会超越电影画质的游戏;
你曾想象和意淫一下,C++不用编译可以实时的在编辑图形界面上调试和添加断点么;

我看了UE4代码的一个小小的角落,就觉得自己来到了一个无知的世界。你的想象,别人已经实现了。
自惭形秽的同时,希望能学到人家的一二。

Welcome To  The Future! 牛逼闪闪的UE4 来了!

ue4需要的基本电脑配置:
Win7 64位系统或Mac OSX10.9.2以上版本
Intel 或AMD处理器 2.5GHZ以上。
兼容DX11 的GPU。
8G内存,不够的请自动升级!
 

一、特性说明

特性

Ue4是一款专业开发高质量游戏的平台开发工具。Ue4的渲染加快可以满足开发者完成出色的画面,同时也可以匹配低端系统。

全新工作流的特性和深度的工具箱可让开发者快速的实现想法,并可以看到效果,同时c++开源带来了全新的体验。

Ue技术支持几百种游戏,实时3D电影,训练仿真,可视化等。在过去的15年中,成千上万的个人和团体围绕者ue开发技术建立了公司,成为了一种职业。

二、 具体特性

(一)

UE4支持更高级的DX11的渲染特性,比如:全屏的HDR映像,每个场景上千种动态光照,artis-可编程镶嵌技术和disPlacement(位移)技术,基于物理特性的阴影和材质,IES光照轮廓等等。

(二)

颗粒特效·

颗粒特效编辑器VFX为我们提供了创建精细的火、烟、血、尘土、污垢、碎石等的工具。颗粒管线包括的了快速低成本GPU粒子仿真,可与深度缓冲交互的碰撞系统。场景中数百万的动态粒子可以接受和反射光线,你可以控制各种粒子效果参数,包括有大小,颜色,密度,下降散开和反弹。

 

(三)

新材质管道

UE4通过使用基于物理模型的shading,提供了前所未有的控制方式,你可以观察和感受角色和对象。快速创建一个宽阔场景面,它是经得起对细节的考验。在像素级别上,层材质和微调值,可以满足你的任何想象。

  

(四) 

蓝图

蓝图可视脚本带把你有创造力的想法,展示到可视化的游戏中。使用蓝图,任何人不需要写一行代码,可以快速原型和建立玩家内容。蓝图可以在创建级别、对象和玩家行为,修改用户界面,调整输入控制等操作中发挥作用。

 

(五) 

实时的蓝图调试debugging

在游戏测试的中,通过蓝图可视化脚本内置了一个debugger,你可以与可视化的游戏流程交互并检查属性值。通过在蓝图的可视节点上设置断点,来随意的暂停游戏,查看游戏的各种状态。逐步的通过事件和功能,随意的变化,优化你的游戏。

你之前有想象过,不通过代码来调试程序么?你想过你能在编辑工具的界面上设置断点和调试么?

 

(六) 

内容浏览

使用UE4内容浏览器,用来导入,组织,搜索,标记,过滤,修改在unreal编辑器中的游戏的对象。实时动态预览图使用截屏功能,可以被修改保存。创建任何的对象集合,都可以被个人或共享给其他开发者。

 

(七) 

角色动画

使用角色动画工具集,可以来编辑骨骼动画,骨骼网格,sockets,动画蓝图等。这个是多用途工具,你可以预览动画序列,变形目标体,也可以设置动画混合空间和蒙太奇剪切。当然,也可以使用PHAT(物理编辑工具集)用来修改骨骼网格的物理和碰撞属性。

 

(八) 

过场动画

UE4的过场动画工具集提供了在场景级别的直接的级别控制,动态玩家镜头和电影。通过一个类似的非线性编辑器,能够是你在场景中设置精细的动作细节和动画场景属性,产生很棒的电影片段。

 

 

(九) 

地形和枝叶

我们使用景观系统可以创建大型开放的环境,然而平铺地形的方法的命令条数是巨大的,多亏了强大的LOD系统和高效的内存使用。使用枝叶工具,快速绘制或删除所有排序的地形组件,从而达到修改大型室外场景的目的。


(十)

后处理效果

UE4的后处理特性可以使你完美的体验对于场景的观感。电影般的效果,举几个例子:环境立方贴图,环境遮挡,bloom,颜色分级,景深,眼适应,镜头耀斑,光轴,抗锯齿,色调映射等。

 

 (十一) 

完全源码接入

UE4带有全部的C++代码,你可以修改和扩展UE编辑工具和UE的子系统,包括物理系统,声音系统,在线系统,动画系统,渲染系统和slate 界面系统。全部控制引擎和角色代码,你可以干任何事情。

 

(十二) 

专业的源码控制

UE4委托GitHub来源码开源,这样由很清晰的版本控制文档和版本跟踪。另,Perforce的版本控制和ApacheSubversion支持,对开发者而言都是用户条款的。不管,你的团队规模,均享有在UE基础版本上开发和设计的权利。

 

(十三) 

C++代码可视

在游戏角色和对象,UE4代码允许直接浏览c++函数功能,直接跳转到在vs的源代码行来做更改,从而节约了时间。

 

(十四)  

热重载功能

使用UE很受欢迎的热重载特性,你可以在你游戏运行的过程中,更新你的角色代码。这个工具你开业用C++编写代码,并且可以不用暂停游戏来观看代码的运行效果。

 

  

(十五) 

模拟和仿真

使用模拟仿真模式,可以快速调试和更新角色行为,这样你在编辑视口中,可以运行一下程序的逻辑,观察角色的表现。在模拟仿真的编辑环境下,全屏化运行游戏,你可以忽略UI,全身心的关注角色的变化。

 

(十六) 

即时游戏预演

更新游戏和使用即时预演系统可以立即在游戏中任意地方产生一格玩家,并且不用等待文件保存。

 

(十七) 

获取和丢失特性

获取和丢失特性,允许你在编辑的游戏中,可以在任何时间来以玩家视角来编辑和控制相机以便观察那些行为不正确。

 

(十八) 

人工智能

UE4的角色框架和AI系统,可以使角色拥有世界周围的空间意识,从而使他们更智能的行为。当你的运行对象在总是在优化路径,动态导航实时的更新网格

 

(十九) 

音频

使用UE4的音频编辑可以建立音频管线,定义游戏的重复音效。

 

(二十) 

 领先的中间件集成

UE4的主要的配件程序提供了很多的引领工业级的中间件技术,包括英伟达的PhysX,Autodesk的Gameware,Enlighten,暗影,Oculus VR等软件库。

 

三、 

样例使用说明

虚幻4的样例展示了引擎使用高要求粒子效果的能力。在运行样例之前,你需要安装vs2013runtimes.

使用批处理文件可以进行设置,比如:分辨率x=1920,分辨率y=1080等。

 

-------------------------------------

posted @ 2017-09-12 10:45 00000000O 阅读(...) 评论(...) 编辑 收藏
2015-07-16 10:16:38 pizi0475 阅读数 12731

http://blog.sina.com.cn/s/blog_7c5fd2e90101ku0j.html

使用Unreal4引擎前需要安装 或者编译引擎。 下面就为同学们介绍下 Unreal4 安装配置。


一. 在Win7下安装Unreal4

在Win7下安装Unreal4需要以下几个步骤:

1. 打开控制面板程序和功能 检查是否已安装 Microsoft Visual C++ 2010 Redistributable ,请同学们先卸载掉,否则下面安装DXSDK_Jun10时会出现Error Code:S1023错误。(卸载完成一定要重启电脑 不然还会出现Error Code:S1023的错误 如果没有安装的同学请继续下一步Unreal4 <wbr>入门(安装) 

Unreal4 <wbr>入门(安装)


2. 安装DXSDK_Jun10 如果出现下图所示错误Error Code:S1023 请先完成第一步。

Unreal4 <wbr>入门(安装)


3. Win7下还需要安装 Windows 7 SP1(Service Pack 1) KB976932 补丁(windows6.1-KB976932-X64.exe)补丁可以从微软上下载(大概903MB)
附下载地址(http://windows.microsoft.com/zh-cn/windows7/learn-how-to-install-windows-7-service-pack-1-sp1


4. 安装完Windows 7 SP1(Service Pack 1) KB976932 补丁后就接下需要安装10以上版本的InternetExplorer浏览器。大概就是ie11_windows6_1_x64_zh_cn.exe 的一个安装程序。
附下载地址 Internet Explorer 11(http://windows.microsoft.com/zh-cn/internet-explorer/ie-11-worldwide-languages


5. 以上4步完成后就可以安装高端大气上档次的VisualStudio2013,也可以选择安装VisualStudio2012看个人喜好但是VisualStudio2013是Unreal4Engine引擎开发IDE所以UE4对VS2013支持的最好,还有很多插件呦。


6. 最后一步就是安装UE4了,直接安装UnrealEngineInstaller-1.0.0-2039063.msi文件。桌面或者安装路径的Unreal Engine\Launcher\Engine\Binaries\Win64\UnrealEngineLauncher.exe 可以直接运行啦。

Unreal4 <wbr>入门(安装)


7. UnrealEngineLauncher是一个引擎用户验证登陆器,使用了增量更新机制(哈哈 做游戏的更新机制已经给大家展现出来,具体能有多强大还需要好好研究一下Unreal4 <wbr>入门(安装))。在(https://www.unrealengine.com/blog/welcome-to-unreal-engine-4)Unreal4官网注册一个账号就可以登录。
我在淘宝花了120大洋找人代付了1个月的会员,还购买了一个月的GreenVPN。准备好好研究下喽Unreal4 <wbr>入门(安装) 
会员登陆后还需要更新一个4.0.2的包大概7个G左右(嘿嘿 知道为什么买VPN了吗 - -!)

Unreal4 <wbr>入门(安装)


二. 在Win8/Win8.1 下安装Unreal4

1. 依然首要问题安装DXSDK_Jun10时会出现Error Code:S1023错误。只要按照Win7下安装的第一步解决就OK了,一定不要忘记卸载完要重新启动计算机呦。

2. 安装Visual Studio 2013或者Visual Studio 2012,个人建议选择VS2013许多新特性很适合Unreal4,而且UE4对Visual Studio 2013支持的比较好。
 
2. 就可以直接安装UnrealEngineInstaller-1.0.0-2039063.msi文件了。


三. 其他方式安装Unreal4 Engine

算是小福利喽,不想付费又对UE4感兴趣的同学可以看下面方法,但是不确保链接总是会有效喔。
Unreal4源码包下载链接(http://pan.baidu.com/s/1qWCYkz
引擎资源包(一)下载链接(http://pan.baidu.com/s/1eQzfwo
引擎资源包(二)下载链接(http://pan.baidu.com/s/1dD5Tcn

1. 下载好Unreal4源码后先将压缩包解压缩,得到UnrealEngine-4.0.1-release文件夹,然后需要把引擎资源包(一)和引擎资源包(二)下载后解压到UnrealEngine-4.0.1-release文件夹下覆盖相应目录文件。

2. 安装DXSDK_Jun10.exe,如果出现下图所示错误Error Code:S1023 请同学们看一下上面Win7安装Unreal4的第一步骤。

3. 安装完DXSDK后,双击UnrealEngine-4.0.1-release目录下的GenerateProjectFiles.bat文件,等待差不多1分钟后点击目录下的Ue4.SLN(VisualStudio2013的工程文件

4. 然后就可以用VisualStudio2013打开工程文件可以进行编译了,编译时间会很长根据每位同学机器配置会有差异基本上15分钟就可以搞定,请同学们耐心等待。编译完成后就可以在 \UnrealEngine\Engine\Binaries\Win64目录找到UE4Editor.exe等运行文件啦。


小结:官方说现在还是未优化版本,稳定版请等待几个月会推出4.1版本(版本更新说明已经在我博客上贴出来 感兴趣的可以去看下Unreal4 <wbr>入门(安装)),虚幻4运行配置较高,大家赶紧去体验吧。


这次主要是简单介绍下Unreal4引擎使用前的配置 和 VisualStudio2013调试插件的配置


1. 在Unreal4安装目录下找到路径为 Unreal Engine\4.0\Engine\Extras 的文件夹。如下图:
 
Unreal4 <wbr>入门(配置)

可以很清晰的看到有 Android ,FX_tools , Maya_AnimationRiggingTools , MayaVelocityGridExporter , UnrealVS 与 VisualStuaioDebugging 这6个插件。

Android: 这个文件夹里主要是 安装AndroidSDK AndroidNDK 和 JDK 安装这些主要是为了在Win7平台下用Unreal4引擎直接打Android的apk包使用。

FX_tools: 这个文件夹里主要是3DMax2012的插件。

Maya_AnimationRiggingTools和MayaVelocityGridExporter: 这两个文件夹是Maya导出插件和编辑器工具

UnrealVS: 这个文件中有VS2012和VS2013两个版本的UnrealVS.vsix插件,只需要双击就可以安装了。 附图:
Unreal4 <wbr>入门(配置)
VisualStudioDebugging: 文件夹下有一个UE4.natvis文件(.natvis 文件是带 .natvis 扩展名的 .xml 文件),同学们需要把这个文件拷贝到 安装VisualStudio2013的按照目录下,路径为Microsoft Visual Studio 12.0\Common7\Packages\Debugger\Visualizers的文件夹中。 这样同学们就可以再VisualStudio2013中的调试栏的监控里看到 Unreal4引擎自定义的特殊类型的值啦Unreal4 <wbr>入门(配置)      附图:

Unreal4 <wbr>入门(配置)


2. 为什么建议各位同学使用Visual Studio 2013呢,不仅仅是因为Unreal4引擎对VS2013支持的最好。在Unreal4中还有比较特殊的用途就是,当你想为你的项目添加C++代码的时候你需要点击File菜单中的Add Code to Project按钮。 下面附张图:


Unreal4 <wbr>入门(配置)


下面这张图 警告同学们啦,必须需要使用Visual Studio 2013才能创建新的Class。 Unreal4 <wbr>入门(配置)

Unreal4 <wbr>入门(配置)

大概就介绍到这里啦。

  对于大型游戏MMORPG游戏或是3D街景(虚拟现实)还有大型无缝地图都需要地图啊,关卡动态加载的机制来达到让用户感觉自己一直是在漫游,而不会出现Loading(读条),卡界面等情况。当然除非是垮区域无法依靠关卡和关卡中之间的关系做处理。


     UnrealEngine4 作为一个多年处于世界前矛的商业引擎,自然而然也为大家考虑到这个这种硬性需求。UnrealEngine4 中的动态加载大概分为3种。

     首先需要明确下几点概念。因为再同学们信息会等的前提下才会更有利于理解和相互交流。好了,不瞎扯了进入正题。

     1.地图(Map):地图这个概念在UnrealEngine4中基本上所示虚拟出来。当然我们编译完一个场景后会保存到自己的工程目录下 如:XXXX\Content\Maps\  保存的文件名叫做.umap。一个工程下可以有很多很多.umap文件,但是我们需要注意到,我们在单独保存场景时编辑器都是基于Level操作的。代码中只有一个函数是关于地图[UEngine::LoadMap]。  如下图:

Unreal4 <wbr>入门(关卡动态加载)


    2.关卡(Level):关卡这个概念应该是在UnrealEngine4最常用使用的,在UE4编辑器中还有一个单独Levels编辑器。  如下图:

Unreal4 <wbr>入门(关卡动态加载)


    3.世界(World):World这个概念之前在UnrealEngine3中一直跟地图的概念差不多,World下面会有很多的Levels还有八叉树场景管理器,以及一些寻路啊,对Level和Actor的管理函数。当然现在也差不多,不过没有看见八叉树,多了一种LevelActor的类,SpawnActor中创建对象为"ConstructObject"之前创建对象另一个函数需要Outer和Owner的"DuplicationObject"。


言回正传:UnrealEngine4引擎提了我们有三种动态加载的方法,下面一一介绍。

一. 通过使用LevelStreamingVolume的方法:

    通过Modes窗口下的Volumes找到LevelStreamingVolume,拖动到编辑器中让它覆盖住同学们两个Level,调节LevelStreamingVolume的StreamingUsage属性(比如有加载后锁定,加载,加载后显示等)。
    当我们的Pawn进入到这个LevelStreamingVolume后关卡就会对应的加载啦。  如图:

Unreal4 <wbr>入门(关卡动态加载)

 加载类型设置属性图例

Unreal4 <wbr>入门(关卡动态加载)

二. 通过使用BluePrint的方法:

    通过打开关卡的Blueprints使用蓝图完成动态加载。那么在Blueprints中完成动态加载我们需要用到几个节点分别为 LoadStreamLevel和UnloadStreamLevel。 如图:

LoadStreamLevel节点
Unreal4 <wbr>入门(关卡动态加载)
UnloadStreamLevel节点
Unreal4 <wbr>入门(关卡动态加载)
    
    特别要注意的是LoadStreamLevel节点需要在MakeVisibleAfterLoad打勾,不然不会显示的呦。第二个暴露变量ShouldBlockonLoad打上勾会,不会被UnloadStreamLevel节点卸载(同学们自行按照需求选择呦)。还有一定要在Leves编辑器中把修改动态加载方法中的[总是加载]改成[蓝图]喔,不然通过Blueprints无法控制动态加载的。


三. 通过写代码的方式加载

    在需要切换动态加载关卡的时候,调用[UGameplayStatics::LoadStreamLevel]函数来加载想要使用的关卡。
    大概流程是创建一个FStreamLevelAction,这个Action回去读暴露参数的包遍历所有Level关系找到指定关卡,然后ActivateLevel这个关卡激活的时候会有加载或者卸载关卡。

PS:
    这几天一直在回忆之前使用UnrealEngine4学过的知识,也同时在看UnrealEngine4的新代码,如果出现概念混淆的情况或者叙述错误的情况,请各位同学指出并与我交流Unreal4 <wbr>入门(关卡动态加载)。  有机会请你们吃饭,喝咖啡。

C++和蓝图

概述

蓝图可以继承C++类,从而使得程序员可以在代码中创建新的游戏性类,而关卡设计人员可以使用蓝图来继承该类并对其进行修改。 有很多种修饰符可以改变C++类和蓝图系统间交互方式,其中某些修饰符会在本示例中突出介绍。

类设置

在类设置的第一部分中,使用C++类向导创建一个名称为LightSwitchBoth 的类。

LightSwitchBoth类中的大部分代码设置都和仅使用C++LightSwitch示例类似。尽管您可以让一个蓝图继承LightSwitchCodeOnly类,
但蓝图图表并不能访问该类中创建的组件、属性及函数。该示例将使用 UPROPERTY() 和 UFUNCTION() 修饰符,这两个修饰符使得LightSwitchBoth作为继承它的蓝图的模板。

您会发现首先参考下 仅使用C++LightSwitch示例是有用的,这样您可以看下如何设置头文件及源文件 来创建LightSwitchComponentSphereComponentDesiredBrightness属性及OnOverlap函数。

这个头文件是从 仅使用C++LightSwitch示例 改编而来,添加了以下功能:

PointLightComponentSphereComponentBlueprintReadOnly(仅蓝图可读的),并且将显示在 我的蓝图 选卡中的 Switch Components(切换组件) 类目中。

OnOverlap现在是一个BlueprintNativeEvent,将会显示在 我的蓝图 选卡中的 Switch Functions(切换函数) 类目中。

DesiredBrightnessBlueprintReadWrite(蓝图可读写的),将显示在 我的蓝图 选卡中的 Switch Properties(切换属性) 类目中。

DesiredBrightness现在是EditAnywhere(随处可编辑的),而不是VisibleAnywhere(随处可见的)

UCLASS() 宏有个 Blueprintable 修饰符。在这个示例中,该修饰符不是必须的,因为LightSwitchBoth直接继承Actor,而ActorBlueprintable(可蓝图化的),所以LightSwitchBoth会继承该修饰符。

加上 UPROPERTY() 和 UFUNCTION() 宏中的额外修饰符,LightSwitchBoth类的头文件如下所示:

LightSwitchBoth.h

// Copyright 1998-2013 Epic Games, Inc. All Rights Reserved.

 

#pragma once

 

#include "LightSwitchBoth.generated.h"

 

UCLASS()

class ALightSwitchBoth public AActor

{

    GENERATED_UCLASS_BODY()

 

   

    UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category="Switch Components")

    TSubobjectPtr PointLight1;

 

   

    UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category="Switch Components")

    TSubobjectPtr Sphere1;

 

   

    UFUNCTION(BlueprintNativeEvent, Category="Switch Functions")

    void OnOverlap(class AActor* OtherActor, class UPrimitiveComponent* OtherComp, int32 OtherBodyIndex);

 

   

    UPROPERTY(EditAnywhere, BlueprintReadWrite, Category="Switch Properties")

    float DesiredBrightness;

};

 

在LightSwitchBoth的源文件中,构造器仍然是一样的。但是,需要对 OnOverlap 函数做一点修改。这个函数现在是一个BlueprintNativeEvent。这意味着 在继承这个类的蓝图中,可以放置一个覆盖 OnOverlap 的事件,当正常调用该函数时会执行此事件。如果该事件不存在,那么则是执行那个函数的 C++实现。要想使这个设置正常工作,该C++函数需要重命名为 OnOverlap_Implementation 。稍后在本示例中将介绍这个蓝图设置。对 OnOverlap 函数 进行了修改后,LightSwitchBoth 的源文件如下所示:

LightSwitchBoth.cpp

// Copyright 1998-2013 Epic Games, Inc. All Rights Reserved.

 

#include "BasicClasses.h"

#include "LightSwitchBoth.h"

 

ALightSwitchBoth::ALightSwitchBoth(const class FPostConstructInitializeProperties& PCIP)

    Super(PCIP)

{

 

    DesiredBrightness 15.0f;

 

    PointLight1 PCIP.CreateDefaultSubobject(this, "PointLight1");

    PointLight1->Brightness DesiredBrightness;

    PointLight1->bVisible true;

    RootComponent PointLight1;

    Components.Add(PointLight1);

 

    Sphere1 PCIP.CreateDefaultSubobject(this, TEXT("Sphere1"));

    Sphere1->InitSphereRadius(250.0f);

    Sphere1->OnComponentBeginOverlap.AddDynamic(this, &ALightSwitchBoth::OnOverlap);        // set up notification for when this component overlaps something

    Sphere1->OnComponentEndOverlap.AddDynamic(this, &ALightSwitchBoth::OnOverlap);      // set up notification for when this component overlaps something

    Sphere1->AttachParent RootComponent;

    Components.Add(Sphere1);

}

 

void ALightSwitchBoth::OnOverlap_Implementation(AActor* OtherActor, UPrimitiveComponent* OtherComp, int32 OtherBodyIndex)

{

    if OtherActor && (OtherActor != this) && OtherComp )

    {

        PointLight1->ToggleVisibility();

    }

}

当创建类时,新的 UCLASS() UFUNCTION() /或 UPROPERTY() 宏意味着该代码必须在Visual Studio Xcode中进行编译,然后使用虚幻编辑器重新加载它们。 关闭虚幻编辑器,在Visual Studio Xcode中编译该项目,然后打开编辑器并重新加载该项目,以确保正确地重新加载该游戏模块。同时,需要注意的一点是, 要确保 Build Configuration(版本配置) 和您打开该项目使用的虚幻编辑器可执行文件的版本一致。 请在 编译游戏项目文档中阅读关于编译配置及编译项目的更多信息。

当重新打开虚幻编辑器并重新打开您的项目后,便可以创建一个新的类蓝图了。 在本示例中,选择LightSwitchBoth作为该蓝图的父类,蓝图名称为LightSwitchBoth_BP 


Unreal4 <wbr>入门 <wbr>使用C++和Blueprints

在 C++代码中添加的PointLightComponentSphereComponent 也会显示在 Blueprint Editor(蓝图编辑器) 的 组件模式中的 Components(组件) 选卡内。 它们的图标是深蓝色,表示它们是从父类LightSwitchBoth类继承而来的原生组件。而刚刚添加到 LightSwitchBoth_BP 蓝图中的新组件的图标 是浅蓝色的。关于使用 Components(组件) 选卡添加及排列组件的更多信息,请参照 组件选卡文档。

Blueprint Editor(蓝图编辑器) 的 图表模式是蓝图编辑的核心。在 Graph Mode(图表) 模式中,您可以在我的蓝图选卡中添加新变量、 函数。您也可以访问该类蓝图中包含的 所有 图表。在这些图表中,各种节点连接到一起,来创建由类属性、游戏事件、甚至Actor的周边环境 驱动的设计及游戏功能。

在 Graph Mode(图标模式) 中, My Blueprint(我的蓝图) 选卡显示了在C++中添加到LightSwitchBoth类中的 PointLightComponent SphereComponent 。这是因为 BlueprintReadOnly 修饰符存在的缘故。 通过在 我的蓝图 选卡中点击并拖拽这些组件的名称到图表中,可以将这些组件的节点添加到图表中。然后,您可以把这些节点连接到改变像可见性 或光源颜色这样属性的节点上。DesiredBrightness 属性也会出现在 我的蓝图 选卡中。因为它是一个属性,而不是一个组件,所以可以使用 BlueprintReadWrite 修饰符。这意味着在蓝图图表中可以创建节点来获取及设置 DesiredBrightness 的值。请参照 我的蓝图文档来获得一般的应用信息。

默认情况下,可能不会显示父类LightSwitchBoth的组件和属性。因为当选中 我的蓝图 选卡底部的 Show user-created variables only(仅显示用户创建的变量) 复选框时, 会隐藏从父类继承的属性。

                     显示所有变量

Unreal4 <wbr>入门 <wbr>使用C++和Blueprints

             仅显示用户创建的变量

Unreal4 <wbr>入门 <wbr>使用C++和Blueprints

有两个图表用于设置 LightSwitchBoth_BP 类的行为。第一个是构造脚本图表,它包含了一个专用的 Construction Script(构建脚本)
事件。如果没有该 Construction Script 设置,那么新的 LightSwitchBoth_BP Actor 将仅使用LightSwitchBoth的构造函数。然而,当Actor在关卡中移动时,及当 Desired Brightness 发生改变时,都会执行 Construction Script 。使用 Construction Script 意味着,可以轻松地改变暴露给蓝图的Actor属性, 并且可以快速地看到这些修改的效果。

在 LightSwitchBoth_BP 类中, Construction Script 事件连接到了 Set Brightness 节点上,以便当在关卡中添加或移动Actor时或者 Desired Brightness 发生改变时,将 Point Light 1 (PointLightComponent) 的亮度设置为 Desired Brightness 的值。


Unreal4 <wbr>入门 <wbr>使用C++和Blueprints


LightSwitch_BPOnly 类中设置的另一个图表是 事件图表 EventGraph的执行是由事件触发的。在这个示例中, 任何时候当调用C++函数 OnOverlap 时,OnOverlap 就会执行。在LightSwitchBoth的源文件中,设置了代理,以便当一个Actor进入或离开SphereComponent时会执行 OnOverlap 

Sphere1->OnComponentBeginOverlap.AddDynamic(this, &ALightSwitchBoth::OnOverlap); // set up notification for when this component overlaps something Sphere1->OnComponentEndOverlap.AddDynamic(this, &ALightSwitchBoth::OnOverlap); // set up notification for when this component overlaps something

OnOverlap 事件节点连接到了 Set Light Color 节点上。任何时候当执行该事件时,它都将会把PointLightComponent的光源颜色设置为一个随机颜色。这覆盖了 源码文件中用于切换的PointLightComponent可见性的 OnOverlap_Implementation 函数。

关于事件及处理图表的更多信息,请参照事件、 事件图表事件模式 文档。


Unreal4 <wbr>入门 <wbr>使用C++和Blueprints

在变量的设置中, DesiredBrightness 变量设置为 EditAnywhere (随处可编辑) ,所以在 蓝图编辑器 默认模式中它是可见的,并且可以进行编辑。 这意味着对于类的每个实例,这个变量是可以变化的,所以每个Actor可以有其自己的 DesiredBrightness 。因为 DesiredBrightness 也是 BlueprintReadWrite(蓝图可读写) 的,且 Construction Script 中使用了它,所以更新它还会导致再次执行 Construction Script 

其他Class Blueprints(类蓝图)可以继承由蓝图创建的类,通过以下两种方式实现:使用 Class Viewer(类别查看器) 中的类附近的下拉列表按钮来创建一个新蓝图, 或者通过右击该蓝图并选择 Create New Blueprint Based on This(基于此蓝图创建一个新蓝图) 

类蓝图 LightSwitchBoth_BP 位于 内容浏览器中,您可以从那里将其拖拽到关卡内。它也存在于 类别查看器中。 关于使用 内容浏览器 或 类别查看器 在关卡放置Actor的更多信息,请参照放置Actors 文档。

 

 


虚幻引擎4设置Visual Studio

设置Visual Studio和虚幻引擎4协同工作有利于提高开发人员使用UE4 的效率和整体用户体验。

推荐设置

以下是为结合使用Visual Studio和虚幻引擎4的开发人员推荐的设置。

  • 关闭 Show Inactive Blocks(显示不活动的代码块) 。如果您不关闭此项,在文本编辑器中,很多代码块会呈现出灰掉 状态。(Options(选项) > Text Editor(文本编辑器) > C/C++ > Formatting(格式)) 

  • 打开IntelliSense(智能编码)和"squiggles(波浪线提示)"功能,让它们正常运行。(请参照Intellisense(智能编码), Live Errors(实时错误)和Squiggles(波浪线提示)部分)

  • 在Visual Assist X (VAX)中关闭 Format After Paste(粘帖后格式化) 功能。这个功能有时候会导致格式变得混乱。(VAX Options(VAX选项) > Advanced(高级) > Corrections(校正))

  • 在解决方案浏览器中停用 External(外部) 文件夹, 它们会扰乱视图。( 在 Options(选项) > Text Editor(文本编辑器) > C/C++ > Advanced(高级) Disable External Dependencies Folder(禁用外部依赖文件夹) )

  • 如果不需要 Edit & Continue(编辑&继续) 功能,请关闭它们。(Options(选项) > Debugging(调试) > Edit and Continue(编辑并继续))

  • 关闭 Error List(错误列表) 窗口。如果启用该功能,当您的代码中出现合法错误时 Error List(错误列表) 窗口会自动弹出 。但是,当和虚幻引擎结合应用时, Error List(错误列表) 会显示不正确的错误信息。建议您最好 禁用该窗口,并使用 Output(输出) 窗口来查看您的代码错误。这个窗口将仅显示 真正的错误。要想禁用Error List(错误列表)窗口:

    • 如果 Error List(错误列表) 窗口处于打开状态,请关闭它。

    • 从 Tools(工具) 菜单中, 打开 Options(选项) 对话框。

    • 选择 Projects and Solutions(项目和解决方案) 并取消选中 Always show error list if build finishes with error(如果编译中出现错误总是显示错误列表) 选项。

Intellisense(智能编码)、Live Errors(实时错误)和Squiggles(波浪线提示)

虚幻引擎4项目现在可以正常支持 IntelliSense(智能编码)功能,包括实时Error List(错误列表) 和 "squiggles(波浪线提示)"! (请参照以下介绍获得如何启用它的信息。)

VC10的IntelliSense功能可以在您编写代码的过程中重新编译C++。这比仅检查 VAX的语法强大很多: VC10使用完整的C++编译器,可以验证每一行代码。这个功能非常强大并且将会 加快您的工作流程!

VC++ Intellisense Squiggles

当其和波浪线提示功能结合使用时,如果您正在查看的文件有任何IntelliSense 错误,都可以在Error List(错误列表)中看到。 您可以通过Error List(错误列表)的右击菜单来打开或关闭该功能。

VS 2010 Error List

由于Squiggles(波浪线提示)功能不能和虚幻引擎4项目协同工作,您可能已经禁用了它们。请确保点击 C/C++ Advanced(高级)选卡,并使用以下设置。

VC++ Advanced Options

当您打开一个C++文件时,您可以通过查找这个图标来判断IntelliSense编译器是否正在“工作”:

Intellisense Progress Indicator


实现细节

  • 当编写代码时显示波浪线提示有时候要花几秒钟的时间。

    • 这是因为我们有很多包含文件,且IntelliSense目前不使用预编译头文件。

  • 有时候您会看到“误报的”IntelliSense 错误。以下是几种可能的原因。

    • IntelliSense编译器(EDG)比MSVC编译器更严格。

    • 某些针对IntelliSense的#defines设置和正常编译时的设置不同。

    • IntelliSense编译的C++总是被当做32位对待。

  • 如果绝对需要,您可以把代码封装到 #ifdef __INTELLISENSE__ 中,以消除波浪线提示。

  • IntelliSense的错误的表达方式和VC++ 编译器的错误的表达方式略有不同。他们只是表达不同而已。

  • 头文件中的Squiggles(波浪线提示)功能通过编译包含它的已知 .cpp 对应的头文件来进行工作。

    • 有时候IntelliSense把这个功能搞乱了,导致您会在头文件中看到波浪线提示。

  • 如果需要,您可以增大 Max Cached Translation Units(最大缓存变换单元) 设置。

    • 它会使用更多的内存,但可能会提高一点反应速度。

  • 有少量C++文件还不能和IntelliSense相兼容。

  • Unreal Build Tool有一个新的 -IntelliSense 选项。

    • 这将为我们的所有项目文件产生IntelliSense属性表。

    • 当添加了新的模块或者项目包含发生改变时仅需要重新运行它即可。

UnrealVS 插件

Visual Studio的UnrealVS插件使您可以在使用虚幻引擎开发时轻松地访问常用操作。

unrealvs_toolbar_cmd.png

功能包括:

  • 设置启动项目

  • 编译启动项目的可绑定命令

  • 设置命令行参数

UnrealVS插件不能和Visual Studio 2012精简版协同工作。它仅能和Visual Studio 2012 专业版相兼容。

请参照UnrealVS插件页面 获得设置及使用该插件的信息。


调试

Visual Studio支持通过‘可视化查看器’来扩展调试器,从而轻松地查看常见的虚幻数据类型, 比如对象FNames 和动态数组。根据您所使用的Visual Studio 2010或Visual Studio 2012的不同, 这个功能的设置也有所区别。

针对Visual Studio 2012的可视化查看器设置

您会发现您的安装文件中包含了具备该可视化查看器逻辑的文件:

[ROCKETINSTALL]/Engine/Extras/VisualStudioDebugging/UE4.natvis

复制该文件到以下位置:

[VSINSTALLDIR]/Common7/Packages/Debugger/Visualizers/UE4.natvis [USERPROFILE]/My Documents/Visual Studio 2012/Visualizers/UE4.natvis

继续研究Blueprint,这次主要看看C++和Blueprint的结合方法。官方文档依然没有太大用处,但在wiki上还是有很多值得学习的文章的。当中有个叫Rama的家伙贡献了相当多的教程,他还写了一个很不错的插件,而且将源代码和实现的思路都写在了一个wiki页面里,对社区的帮助很大,MVP应该是没得跑了,要是多一些这样的人UE4就能更快地成熟并推广了。

不过在动手写代码之前,我首先把那个忍无可忍的VS2013自带的Intellisense给关掉了,我是完全按照官方文档的指引配置了所有的参数,但实际用起来却奇慢无比,再小的工程敲几行代码后要等二十几秒自动完成才能蹦出来,右下角那个处理提示符就几乎没消失过。而且代码帮助还非常不稳定,时有时无,另外还经常给出一些错误的提示。忍不了了,还是装了Visual Assist,瞬间一切都那么顺手又顺眼了。

工具搞定后,先来看看如何在C++中创建可以在Blueprint中使用的全局函数:

  • 创建一个继承自UBlueprintFunctionLibrary的C++类即可。不知道为什么在Editor中不能直接创建基于UBlueprintFunctionLibrary的C++类,但我们可以在VS中自己修改一下基类
  • 继承自UBlueprintFunctionLibrary类中,凡是具备BlueprintCallable属性的UFUNTION即可在Blueprint中被调用
  • 如果UFUNCTION还带有BlueprintPure属性,那么意味着这个函数不会修改任何游戏状态,因此无需exec链的触发(在Blueprint中体现为没有白线输入),可以在任何时刻被调用获取其结果
  • 作为随时可被调用的全局函数,都需要被声明成static函数

下面是具体代码:

MyBPLibrary.h:

复制代码
 1 // Copyright 1998-2014 Epic Games, Inc. All Rights Reserved.
 2 
 3 #pragma once
 4 
 5 #include "MyBPLibrary.generated.h"
 6 
 7 
10 UCLASS()
11 class UMyBPLibrary : public UBlueprintFunctionLibrary
12 {
13     GENERATED_UCLASS_BODY()
14         
15     UFUNCTION(BlueprintCallable, BlueprintPure, Category = "Test")
16         static FString GetHappyMessage();
17 
18     UFUNCTION(BlueprintCallable, Category = "Test")
19         static bool SaveToFile(FString Dir, FString Name, FString Text, bool Overwrite = false);
20 
21     UFUNCTION(BlueprintCallable, Category = "Test")
22         static bool MakeDir(FString Dir);
23 };
复制代码

MyBPLibrary.cpp:

复制代码
 1 // Copyright 1998-2014 Epic Games, Inc. All Rights Reserved.
 2 
 3 #include "HelloWorld.h"
 4 #include "MyBPLibrary.h"
 5 
 6 
 7 UMyBPLibrary::UMyBPLibrary(const class FPostConstructInitializeProperties& PCIP)
 8     : Super(PCIP)
 9 {
10 
11 }
12 
13 FString UMyBPLibrary::GetHappyMessage() {
14     return FString("Hello, I'm Happy!");
15 }
16 
17 bool UMyBPLibrary::MakeDir(FString Dir) {
18     return FPlatformFileManager::Get().GetPlatformFile().CreateDirectory(*Dir);
19 }
20 
21 bool UMyBPLibrary::SaveToFile(
22     FString Dir,
23     FString Name,
24     FString Text,
25     bool Overwrite 
26 ) {
27     IPlatformFile& F = FPlatformFileManager::Get().GetPlatformFile();
28     if (!F.DirectoryExists(*Dir))
29     {
30         F.CreateDirectoryTree(*Dir);
31         if (!F.DirectoryExists(*Dir))
32         {
33             return false;
34         }
35     }
36 
37     Dir += "\\";
38     Dir += Name;
39 
40     if (!Overwrite)
41     {
42         if (F.FileExists(*Dir))
43         {
44             return false;
45         }
46     }
47 
48     return FFileHelper::SaveStringToFile(Text, *Dir);
49 }
复制代码

这个例子中实现了3个全局函数:GetHappyMessage,MakeDir以及SaveToFile,其中GetHappyMessage为无副作用的函数。它们在Blueprint中就可以这么用了:

在调试的过程中遇到的一些问题在这里说一下:

  • 在Rama的例子中,对文件的操作都是基于GFileManager,但在实际写代码时发现这个全局变量不存在,只能通过FPlatformFileManager来实现相关操作,可能是Rama写教程之后UE4的代码又发生过变化
  • 在Blueprint中,那些紫色的节点代表一个String类型的输入,但是这里需要注意:在输入框里不要将字符串包围在双引号之间了,也不要对特殊字符转义,系统会帮你处理。一开始不清楚在这里卡了好久
  • 如果你自己的类是继承自PlayerController,那么可以使用ClientMessage来输出一些调试信息;但如果不是(比如上面的这个例子),则可以使用UE_LOG宏,宏的用法和Rama教程里的用法也不太一样了,需要自己去研究一下

通过在C++中实现供Blueprint调用的全局函数,就实现了Blueprint和C++交互的一种常用途径。后面再写一些其他交互方式的实现方法。


C++触发Blueprints事件

如果想实现只供某一个类使用的Blueprint函数,方式是类似的,只是不要再继承UBlueprintFunctionLibrary类,同时函数也无需再声明成static即可。

虽然能够在Blueprint中调用一个C++实现的方法是很不错,但在实际中我们还会需要其他的交互方式,比如由C++代码去触发一系列的Blueprint动作,以及让Blueprint能够和C++类的某些属性变量直接进行交互。

我们先来看看如何将C++类中的某些属性变量暴露出去,让Blueprint(或Editor)能够看见、读或写这些变量,从而实现和C++的通信。

其实非常简单:只需要在C++类的头文件中这样声明一下就可以了:

1 
2     UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "PlayerMusicSkill")
3     int32 MusicSkillLevel;

只需要使用UPROPERTY宏,在加上一些枚举属性,就可以让一个变量以开发者希望的方式暴露给Blueprint,其中:

  • EditAnywhere表示该变量可以在Editor中任意进行修改,而VisibleAnywhere则表示Editor中只能看、但无法修改这个变量,还有几个其他的可选项供选择,可以自行研究代码
  • BlueprintReadWrite表示该变量可以在Blueprint中读或写,BlueprintReadOnly则表示在Blueprint中只能读
  • Category表示在Editor和Blueprint列表中这个变量归到那一分类,这主要是一个方便开发者寻找的功能,没有其他特别作用
  • 头部的注释不仅仅是代码中的注释,它也会作为这个参数的帮助提示显示在Editor的界面上

上面的代码在编译后,只需要在Editor中基于这个类创建一个Blueprint,然后就能够在它的Default属性界面看到下面的内容:

相当不错,而且简单。下面再来看看关键的:如何让C++去触发Blueprint,同时给Blueprint传递信息?

其实也非常简单,主要是使用UFUNTION+BlueprintImplementableEvent属性:

1 UFUNCTION(BlueprintImplementableEvent, meta = (FriendlyName = "Music skill is GOOD"))
2         virtual void MusicSkillGood(int32 CurrentSkill);

其中:

  • BlueprintImplementableEvent表示下面定义的函数会触发Blueprint里的一个事件,但事件触发后如何处理则由Blueprint自行实现,C++代码不负责,它只负责在适当的时候调用下面的函数并传递参数数据而已
  • meta相关内容和Category类似,主要是给用户提供一个更容易分辨的信息。在这里这个自定义事件在Blueprint中就会被显示为“Music skill is GOOD”,没有其他作用
  • MusicSkillGood就是用来在C++中触发Blueprint事件的函数,它一定要被定义为虚函数,而且返回值一定要为void,因为这个函数的实现不由C++来做,它只是提供一个触发的手段,且所有的数据都通过其参数传递给Blueprint

完整的类代码如下:

MyPlayerController.h:

复制代码
 1 // Copyright 1998-2014 Epic Games, Inc. All Rights Reserved.
 2 
 3 #pragma once
 4 
 5 #include "GameFramework/PlayerController.h"
 6 #include "MyPlayerController.generated.h"
 7 
 8 
11 UCLASS()
12 class AMyPlayerController : public APlayerController
13 {
14     GENERATED_UCLASS_BODY()
15     
16     
17     UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "PlayerMusicSkill")
18     int32 MusicSkillLevel;
19 
20     UFUNCTION(BlueprintImplementableEvent, meta = (FriendlyName = "Music skill is GOOD"))
21         virtual void MusicSkillGood(int32 CurrentSkill);
22 
23     virtual void PlayerTick(float DeltaTime) OVERRIDE;
24 };
复制代码

MyPlayerController.cpp:

复制代码
 1 // Copyright 1998-2014 Epic Games, Inc. All Rights Reserved.
 2 
 3 #include "HelloWorld.h"
 4 #include "MyPlayerController.h"
 5 
 6 
 7 AMyPlayerController::AMyPlayerController(const class FPostConstructInitializeProperties& PCIP)
 8     : Super(PCIP)
 9 {
10 
11 }
12 
13 void AMyPlayerController::PlayerTick(float DeltaTime) {
14     Super::PlayerTick(DeltaTime);
15 
16     if (MusicSkillLevel > 50)
17     {
18         MusicSkillGood(MusicSkillLevel);
19     }
20 }
复制代码

上面代码的主要逻辑就是在每个Tick检查当前类实例的MusicSkillLevel变量值是否大于50,如果是,则对Blueprint触发MusicSkillGood事件,并将MusicSkillLevel的值传递过去。最终在Blueprint中可以这样用:

这个Blueprint的逻辑就是:

  • 每当用户按M键,就将MusicSkillLevel变量的值加1
  • 而如前所述,C++代码会在每个Tick检查MusicSkillLevel的值是否大于50,如果大于50了,那么就会在每个Tick都触发一次MusicSkillGood事件(由于meta的设置,这个事件被显示成“Music Skill is GOOD”)
  • 当用户按了足够多的M键导致MusicSkillLevel变量的值超过50时,在游戏中就能看到MusicSkillLevel的当前值在刷屏了

到此为止,Blueprint已经和C++代码实现了完全的交互:Blueprint能够主动调用C++中的函数,C++也能主动触发Blueprint的事件,而且双方还能通过暴露的变量进行交互。这样一来,整个游戏的底层平台模块完全可以用C++实现,然后给上层的Blueprint提供调用接口,由Blueprint来利用、组织这些模块来实现上层的完整游戏逻辑。这种结合方式既保留了C++的性能优势,又充分利用了Blueprint的易用性和灵活性来让游戏开发保持快速地迭代。这应该就是UE4所推崇的最佳开发模式。

   接触UnrealEngine4大概有快两周了,从安装配置到编辑器的熟悉,再到官方实例的学习以及Blueprint的应用。从UE3的UnrealScript和各种classes到UE4现在的发开方式,昨天大概拟定了一个UE4引擎探究的计划,下周会围绕计划展开研究。

    这几天再看UnrealEngine4的代码,在写代码的过程中有些注意事项跟大家分享一下,也算给自己做个记录Unreal4 <wbr>C++使用注意事项

一. 最好不要自己在UnrealEngine4的工程中添加代码文件,尤其是.h文件。因为UE4的UnrealHeaderTool会根据UnrealEngine4的反射机制自动生成一个.generated.h文件(应该是UnrealBuildTool需要注册并做反射用)。添加代码最好是通过编辑器的创建类向导创建。  如图例:

Unreal4 <wbr>C++使用注意事项
    如果想用更多的类作为父类的话,可以点击“右上角”显示所有类。这样的话比如我们想做一个管理器类不需要其他逻辑业务功能我们就可以在 显示所有类 中选择一个UObject作为父类喽,配图如下:

Unreal4 <wbr>C++使用注意事项
点击"显示所有类"后,如图:

Unreal4 <wbr>C++使用注意事项

二. UnrealEngine4的C++代码有套自己的浅规则,如同Unity3D的限制版C#一样。请各位同学们不要忙着抱怨Unreal4 <wbr>C++使用注意事项,经过了13多年承载和UnrealScript的经验想必Epic不会自找苦吃把自己开发饭碗搞的很糟糕。目前笔者看到的优点是拥有GC机制,支持Blueprint和编辑器的反射机制,UnrealBuildTool的运行时编译,还有一些自动化生成功能。闲话不多说,来点干货先。

  1. 声明类时需要添加UCLASS()宏,可以带参数用来标示在编辑器中的名称,暴露类别,显示类别,类别构造,API类型,Blueprint类型,配置文件=名称。
例如:

Unreal4 <wbr>C++使用注意事项
  2. 声明变量时需要添加UPROPERTY()宏,可以带参数用来标示 在哪里时可见,高级显示类型,属于哪个类别,标签[类似注释]。
例如:
Unreal4 <wbr>C++使用注意事项
 3. 在XXXX.h文件中引用其他头文件,请各位同学一定要在把#include "xxx.h" 放到这个XXXX.h文件#include "XXXX.generated.h" 前,不然会报错呦。
例如:
Unreal4 <wbr>C++使用注意事项

4. 下周UnrealEngine4就要更新4.1版本了,最近UE4还属于公测版有不少不稳定的地方,当然官方的更新的速度也很快。在目前这个情况下笔者比较建议采用Unity3D脚本开发的程序结构。做一个自己的逻辑模块聚合到自己的GameMode或者WordSettings下。再由自己的逻辑模块去驱动游戏逻辑调用或者驱动UnrealEngine4的其他模块,开发者把大部分精力放在逻辑模块的架构上和引擎功能模块的调度上,不要上来就想去从GamePlay的入口去改引擎底层的逻辑架构。

原因如下:
1). UnrealEngine4引擎目前还不是很健壮,可能会在开发流程和开发模式上做出变动。
2). UnrealEngine4试图把很多精力放在把大家想Blueprints上去引导,大力推动开发者用Blueprints完成游戏开发。游戏逻辑和Blueprints关联很紧密,如果处理不好久有点得不偿失了会浪费大量时间和精力。


预祝大家开发顺利,欢迎随时沟通 互相学习和进步Unreal4 <wbr>C++使用注意事项


2016-11-22 13:35:34 u013131744 阅读数 14204

201049jbyub1g2jlnz2dyz

现在我们已经有了一个场景并且运行了,我们需要添加一个角色到场景中。要这样做,我们必须从UE4的GameFramework类继承它。

一. 打开上次创建的关卡

如果你已经关闭了项目,并且保存了上次创建的关卡(假设命名为Untitled),然后你现在打开上次我们的项目,你会发现我们打开的只是Minimal_Default关卡。现在,让我们在内容浏览器中选择过滤器,然后选择关卡,再双击下面的Untitled就可以打开以前创建的关卡了。(其默认保存的位置是StarterContent\Maps文件夹下。)

二. 项目设置

如果你不想每次打开这个项目的时候,都要选择Untitled关卡的话,可以这样设置:

1) 点击编辑 -> 项目设置。


2) 选择地图&模式,在右侧有个Default Maps,这里的Game Default Map是游戏运行的默认关卡,然后Editor Startup Map是编辑器启动也有个默认关卡,你可以点击右边的三角形来选择关卡。


3) 点击右上角关闭窗口就会自动保存设置了。

三. 创建一个从Character类继承的类

从基本框架类继承是很简单的:
1) 在项目中打开你的UE4编辑器。

2) 在文件,选择“新建C++类”。


3) 这里你可以选择从Pawn类(Pawn类从控制器接收输入)继承或从Actor类继承。不过我们可以这里选择从Character类(角色)继承。


4) 点击继续,然后你可以命名这个类。这里我们将其命名为Avatar。

5) 最后点击创建类来使用代码创建这个类。

6) 然后UE4会自动运行你的VS项目。我们在项目解决方案中打开Avatar.h文件:


Avatar.h大致上看起来是这样的:
  1. #pragma once
  2. // Avatar.h code file
  3. #include "GameFramework/Character.h"
  4. #include "Avatar.generated.h"
  5. UCLASS()
  6. class MYPROJECT_API AAvatar : public ACharacter
  7. {
  8. GENERATED_UCLASS_BODY()
  9. };
UCLASS()和GENERATED_UCLASS_BODY()都是UE4定义好的宏,UCLASS()宏使得你的C++代码在UE4编辑器中可用。GENERATED_UCLASS_BODY()会适当处理你的类函数成为一个UE4类。现在你不需要彻彻底底地搞清楚它们的工作原理,你只需要确保它们在正确的位置出现。

四. 为角色创建一个模型

现在我们avatar是继承了角色类,但是还需要给角色赋予一个模型。我们可以从UE4的商城找免费的模型,步骤如下:

1) 点击工具栏的市场,进入UE4的商城。


2) 在类别中选择角色&动画。


3) 找到一个名字叫Animation Starter Pack的免费资源包,点击进去。


4) 点击下图中的免费按钮添加到库里面。


5) 下载完后点击库,点击“添加到工程”。


6) 在新窗口中,选择Demo1,然后点击添加到项目。


7) 现在,我们可以找到刚才添加的资源,在内容浏览器点击选择路径:


8) 选择StarterContent文件夹:

五. 载入网格

通常情况下,如果使用C++代码来指定要载入的资源,这是一种硬编码的坏习惯。在运行程序的时候,如果资源发生了改变,则程序不会做出改变。更好的做法是,可以在运行时改变载入的资源。

下面我们从C++类中创建一个蓝图:
1) 在菜单栏中的窗口-开发者工具-类别查看器。

2) 在类别查看器中,右击Avatar,选择创建蓝图类。(如果找不到Avatar,请关闭UE4编辑器,再重新打开)


3) 在下方输入蓝图类名称(我这里是BP_Avatar),点击保存。然后会来到蓝图编辑器:


4) 在左上角的组件窗口中,选择Mesh:


5) 在右侧的细节面板中,在Mesh选项卡中,选择下拉按钮,然后点击视图选项,点击显示引擎内容,再选择TutorialTPP。


6) 这时候碰撞体看起来是这样的,模型和碰撞体是对不上的:


7) 然后我们通过W、E、R快捷键变换模型,使之近似地包围在碰撞体里面。如果碰撞胶囊体不够大,你可以点击组件的CapsuleComponent,然后在细节面板的Shape调节胶囊体大小:


8) 然后我们可以关闭窗口。在内容浏览器中将BP_Avatar拖放到场景中。

六. 添加动画

你可以看到人物模型是呈T型的,3D建模/动画师通常都会让人物默认状态下摆T型,因为此时这可以使得人物做出各种各样的动作。

1) 双击内容浏览器的BP_Avatar,重新打开蓝图编辑器。


2) 在上方选项卡中点击视口,然后选择Mesh,在右侧的细节面板中的Animation选项中的Anim Blueprint Generated Class中选择UE4ASP_Hero_AnimBlueprint。


这样就完成了一个模型的动画添加了,关于动画的更多细节,我们在后面的教程中会深入探讨。

七. 添加摄像机

为了使得我们有一个第三人称视角,我们给该角色添加上摄像机以追随该角色。

1) 在组件中进行如下的步骤:


2) 移动摄像机并旋转角色到如下状态(注意角色的蓝色箭头是角色的前进方向,所以要使得摄像机和角色自身的朝向都要面对着蓝色箭头):


3) 点击工具栏的保存。

现在的角色还不能被控制,我们下一节继续讲如何编写C++代码来控制角色。


转自:http://www.52vr.com/article-561-1.html

2018-06-14 16:10:44 kmyhy 阅读数 35066

原文:Unreal Engine 4 Tutorial for Beginners: Getting Started
作者:Tommy Tran
译者:kmyhy

Unreal Engine 4 是一个游戏开发工具集,能够开发从 2D 手机游戏到 3A 级主机游戏的一切。“方舟:生存进化”、“泰克肯7”和“王国之心 III”这些游戏背后使用的引擎就是它。

对于初学者来首,用 Unreal Engine 4 开发是很简单的。通过蓝图可视化脚本系统,你可以不写一行代码就创建出整个游戏。再加上一个易于使用的界面,你就可以获得一个可以运行的游戏原型。

本教程主要是让初学者入门。它涉及以下几个知识点:

  • 安装引擎
  • 导入资源
  • 创建材质
  • 用蓝图(Blueprint)创建具有基本功能的对象

为了学习这些知识,你会创建一个用于展示一只香蕉的旋转转盘。

注:本教程属于 Unreal Engine 教程系列,这个系列共 10 个部分:

安装 Unreal Engin 4

Unreal Engine 4 使用 Epic Games Launcher 进行安装。进入 Unreal Engine 网站 并点击 Get Unreal 按钮(右上角)。

下载这个安装器需要创建一个账号。创建账号之后,选择下载和你的操作系统对应的版本。

下载并安装完安装器之后,运行安装器。会显示一个窗口:

输入 email 和密码,点击 sign in。登录之后会显示这个窗口:

在左上角,点击 Install Engine,安装器会让你选择要安装的组件:

注:Epic Games 经常升级 Unreal Engine,因此你的引擎版本会与此不同。例如我写第一稿时,版本已经升级到 4.14.3! 只要你的版本不低于 4.14, 你就可以使用本教程。

默认选中的是 Starter Content、Templates and Feature Packs 和 Engine Source。就保持这样的选择不变。它们分别是:

  • Starter Content: 这是你可以在自己项目中免费使用的资源集。它包含了一些模型和材质。你可以在你的游戏中临时使用它们。
  • Templates and Feature Packs: 模板可以根据你的选择来创建基本功能。例如,Side Scroller 模板会创建一个项目,项目中包含一个角色、基本动作和一个固定的水平相机。
  • Engine Source: Epic 提供了源码,这样任何人都可以修改这个引擎。例如,如果你想为编辑器添加自定义功能,你可以通过修改源码来实现。

拖动这个列表,还有几种不同的平台。如果你不打算支持某个平台,请让它反选。

选好组件之后,点击 Install。安装完成后,引擎会在 library 中显示。接下来我们创建项目。

创建项目

点击 Launch 按钮打开项目浏览器。在项目浏览器中,点击 New Project 标签页。

点击 Blueprint 标签页。这里,你可以选择一个模板。但是,因为我们想从空白开始,所以选择了 Blank template。

在下面,你会发现有更多的设置。

分别有这几个选项:

  • Target Hardware: 选择 Mobile/Tablet 会关闭一些后期处理效果。还会用鼠标模拟触摸。设置为 Desktop/Console。
  • Graphical Target: 选择 Scalable 3D or 2D 会关闭一些后期处理特效。请设置为 Maximum Quality。
  • Starter Content: 使用这个选项可以包含一些开始内容。为了简单起见,这里将它设为 No Starter Content。

最后一部分设置是指定项目文件夹地址和项目名称。

点击 Folder 栏右边的 3 个小点,可以改变项目文件夹地址。

项目名称不代表游戏名称,因此不用担心后期可以修改这个名称。选择 Name 栏的文本框,输入 BananaTurntable。

最后,点击 Create Project.

认识界面

创建完项目,编辑器会打开。编辑器分成了几个区域:

  1. 内容浏览器: 这里显示所有项目文件。用它创建文件夹并组织文件。可以在搜索栏中查找文件或者过滤文件。
  2. Modes: 这里可以选用各种工具比如 Landscape 工具和 Foliage 工具。默认工具是 Place 工具。它允许将各种对象比如灯光和相机放到游戏关卡中。
  3. 世界大纲编辑器: 显示当前关卡中的所有对象。你可以通过将相关的对象放入文件夹中来组织整个列表。它也可以搜索或者通过类型来过滤。
  4. 详情: 你选中的对象会在这里显示出属性。这里可以编辑对象的设置。这里进行的修改只会影响这个对象的实例。例如,如果你有两个球体,如果你改变了其中一个的大小,那么只会对你选中的对象有效。
  5. 工具栏: 包含各种功能。你用得最多的一个就是 Play。
  6. 视口: 关卡视图。按下右键拖动鼠标可以查看四周。按下右键,用 WASD 键进行移动。

导入 Assets

光有一个圆桌却没有要陈列的东西有什么用?请下载香蕉模型。里面有两个文件 Banana_Model.fbx 和 Banana_Texture.jpg。当然,你可以用自己的模型。但你怎么来使用这个该死的香蕉呢?

在 Unreal 能够使用一个文件之前,你必须导入它。在内容浏览器,点击 Import。

通过文件浏览器,找到 Banana_Model.fbx 和 Banana_Texture.jpg。框选住两个文件,然后点击 Open。

对于 .fbx 文件,Unreal 会提供几个导入选项。确保 Import Materials 未选中,因为你会创建自己的材质。其它设置保持不变。

点击 Import。这两个文件就显示到内容浏览器中了。

在导入文件时,实际上它是不会保存到项目中的,除非你明确地这样做。你可以用右键点击这个文件,选择 Save 就可以保存它们了。还可以选择 File\Save All 来一次性保存所有文件。确保经常使用保存功能。

注意在 Unreal 中模型被称为网格。选择你已经有一个香蕉的网格了,可以将它放到关卡中了。

添加网格到关卡

选择关卡看起来空空的,让我们放点东西。
要添加网格,左键将 Banana_Model 从内容浏览器中拖到视口。放开鼠标左键,就可以将网格放下。

关卡中的对象是可以移动、旋转和缩放的。它们的快捷键分别是 W、E 和 R。然后使用操纵杆:

材质

如果你近距离查看香蕉,你会发现它根本不是黄的。事实上,它是灰色的。要给香蕉一些颜色和细节,你必须创建材质。

材质是什么?

材质决定了某件东西的表面外观。在一个基本的关卡中,材质定义了 4 个方面:

  • 基本色: 一个表面的颜色或纹理。常用于添加细节和色彩的变化。
  • 金属化:表面和金属的相似度。通常,纯粹的金属拥有的金属化值是最大的,而织物的金属化值为 0。
  • 高光:控制非金属表面的发光。例如,陶瓷拥有较高的高光值,而黏土则相反。
  • 粗糙度:粗糙度最大时,没有任何高光。用于岩石或木头的表面。

下面是 3 种材质的例子。它们颜色相同但属性不同。每种材质都有在对应的属性上设置为较高值。另外的属性则设为 0。

创建材质

要创建材质,请进入内容浏览器,点击绿色的 Add New 按钮。会弹出一个菜单显示你可以创建的 assets。点击 Material。

将材质取名为 Banana_Material 然后双击文件打开材质编辑器。

材质编辑器

材质编辑器由 5 部分组成:

  1. 图(graph): 这个区域包含所有节点和结果节点。按下鼠标右键并移动鼠标可以平移。滚动鼠标滚轮可以进行缩放。
  2. 详情: 这里显示选中节点的属性。如果没有选择任何节点,这里会显示材质的属性。
  3. 视口: 包含一个预览的网格,显示你的材质。要转动相机可以按住鼠标左键并移动鼠标。要缩放可以用鼠标滚轮。
  4. 调色板:一个列表,列出材质所有节点变量。

什么是节点?

在开始编辑材质前,你必须知道节点是什么。

节点构成了材质的主体。有许多不同的节点,提供了不同的功能。

节点可以有输入和输出,用一个圆圈+一个箭头来表示。输入位于左边,输出位于右边。

材质有一个特殊的节点,就是结果节点,在 Banana_Material 中它是现成的。它是所有节点的终点。一旦你接通这个节点,就可以决定材质的最终显示。

添加材质

要为一个模型添加颜色和细节,你需要一个纹理。一个纹理就是一张 2D 图片。通常,它们会投射到 3D 模型上,让它具有颜色和细节。

为了给香蕉贴图,你需要使用到 Banana_Texture.jpg。TextureSample 节点允许你在材质上使用贴图。

找到调色板,找到 TextureSample。按下鼠标左键,将它拖到“graph”窗口。

要选择纹理,首先需要选中这个 TextureSample 节点。找到详情面板,点击 Texture 右边的下拉按钮。

列表中列出项目中所有纹理。选择 Banana_Texture.

要在预览网格上查看贴图,需要将它插进结果节点中。左键点击 TextureSample 节点的白色输出按钮上,将它拖到结果节点的 Base Color 输入按钮上。

回到视口,在预览网格上查看纹理。旋转它(按下鼠标左键并拖动)查看其它细节。

点击工具栏上的 Apply 按钮,应用你的材质。然后关闭材质编辑器——这部分的工作结束了。

使用材质

要将材质应用到香蕉上,你需要指定它。回到内容浏览器,双击 Banana_Model 打开它。这会显示一个编辑器:

找到详情面板 Materials 一节。点击 Element 0 右边的下拉按钮,选择Banana_Material.

关闭网格编辑器,回到主编辑器,看一下视口。你将看到香蕉现在已经贴图了。恭喜,你已经成为了一个关卡设计师了!

注:如果光线太暗,你可以在世界大纲编辑器中点击 Light Source 来改变它。在详情面板中,找到 Intensity,设置为更高的值。

蓝图

香蕉看起来很好,但如果将它放到圆桌上旋转就更好了。用蓝图来创建一个圆桌很轻松。

简单讲,一个蓝图(Blueprint)表示一件”东西“。蓝图允许你为对象创建自定义行为。对象可以是某种物体(比如圆桌),也可以是某些抽象的东西比如生命系统。

想制作一辆会动的车吗?构建一个蓝图。一只会飞的猪呢?使用蓝图。一只在碰撞中爆炸的小猫?还是蓝图。

就像材质一样,蓝图使用了节点系统。这意味着你只需要创建节点然后将它们连接起来,不需要编写代码!

注:如果你更喜欢写代码,你可以用 C++。蓝图易于使用,但它们无法做到和 c++ 代码一样快。如果你不得不用到大量计算的东西,比如复杂算法,你应当使用 c++。
当然虽然你喜欢 c++,但很多时候用蓝图其实是个好主意。蓝图有这些优点:

  • 通常,蓝图比 c++ 的开发速度更快。
  • 易于组织。你可以将节点分成不同的模块,比如功能和图形。
  • 如果你和非编程人员一起工作,修改蓝图更容易,因为它的可视化和直观性。

将对象用蓝图来创建是一种好办法。当需要提升性能时,将它们转换成 c++。

创建蓝图

在内容浏览器,点击 Add New。在列表中选择 Blueprint Class。

弹出一个窗口,让你选择父类。你的蓝图会从父类继承所有的变量、函数和组件。花点时间了解每个类能做什么。

注:Pawn 和 Character 也是 Actor 类,因为你可以放置和生成它们。

因为圆桌只会待在一个地方不动,Actor 类最适合。选择 Actor 然后给文件命名为 Banana_Blueprint。

最后,双击 Banana_Blueprint 打开它。当窗口弹出时,点击 Open Full Blueprint Editor :

蓝图编辑器

首先,在蓝图编辑器中,选择 Event Graph 标签页。

蓝图编辑器有 5 个主要的窗口:

  1. 组件窗口:当前组件的列表。
  2. 我的蓝图:用于管理你的图形、功能和变量。
  3. 详情窗口:显示当前选中对象的属性。
  4. 图形窗口:这是关键。所有节点和逻辑都在这里。按下右键并拖动鼠标进行平移。滚动鼠标滚轮进行缩放。
  5. 视口:任何拥有可视化元素的组件都在这里显示。你可以用主编辑器一样的方式移动和旋转。

创建圆桌

要创建圆桌,需要两个东西:一个基座和一个陈列品。你可以通过组件来创建这两个东西。

什么是组件?

如果一个蓝图是一辆车,那么组件就是组成车辆的构件。例如,车门、轮胎、引擎都是组件。

但是,组件不仅仅限于物理对象。

例如,要让车动起来,你需要添加一个移动组件,你甚至可以为它添加一个飞行组件让它飞起来。

添加组件

在你看到任何组件之前,你需要切换到视口视图。点击 Viewport 标签页即可切换到它。它看起来像这个样子:

注:DefaultSceneRoot 组件在玩游戏时不会显示。它只在编辑器中显示。

这个圆桌用到了两个组件:

  • Cylinder: 一个简单的白色圆柱体。这是放置香蕉的底座。
  • Static Mesh: 这个组件用于显示香蕉网格。

要添加底座,找到组件面板。点击 Add Component 并选择 Cylindar。

最好让底座变得更短一点。按下 R 键,显示缩放操作杆,然后将它缩短(不要管真实大小,你可以在后面修改它)。

然后来添加网格。回到组件面板,在空白地方点击左键,清除对圆柱体的选中状态。这能保证接下来的组件不会附加在圆柱体组件上。

注:如果不这样做,接下来的组件会附加在圆柱体上。这意味着它会继承圆柱体的 scale 属性。因为你缩短了圆柱体,那么接下来的组件也会被缩短。

然后。点击 Add Component,选择 Static Mesh。

要显示香蕉,选择这个静态网格组件,然后点击 Details 标签页。点击 Static Mesh 右边的下拉按钮,选择 Banana_Model。

如果它的位置不对,请移动香蕉。按 W 激活操作杆,移动它的位置。

蓝图节点

接下来让圆桌旋转。这就要用到蓝图节点了。

和材质节点不同,蓝图节点拥有特殊的 pin 叫做 Execution pin。位于左边的 pin 是输入,位于右边的则是输出。所有节点至少有一个输入/输出。

如果节点有一个输入 pin,它前边必定有一个连接才能执行。如果有一个节点没连接,那么后续的任何节点都不会执行。

举一个例子:

节点 A 和节点 B 会执行,因为他们的输入 pin 已经有连接。节点 C 和节点 D 不会执行,因为节点 C 的输入 pin 是断开的。

转动圆桌

在开始之前,看一眼组件面板。你会看到 Cylindar 和 Static Mesh 有缩进而 DefaultSceneRoot 没有缩进。这是因为前者是附加到 DefaultSceneRoot 上的。

如果你移动、旋转或缩放 root 组件,那么它包含的组件也会有同样动作。通过这种方式,你可以让 Cylinder 和 Static Mesh 一起旋转,而不是分别旋转。

创建节点

要开始编写脚本,需要进入 Event Graph 标签页。

让某个对象旋转非常简单,只需要创建一个节点。在 graph 视图空白地方右键,打开有效的节点菜单。搜索 AddLocalRotation。因为你需要旋转底座和香蕉,你只需要旋转 root 组件即可。选择 AddLocalRotation(DefaultSceneRoot)。

注:如果没有列出这个节点,请反选菜单右上角的 Context Sensitive 选项。

在 graph 窗口中会多出一个 AddLocalRotation 节点。Target 输入会自动连接到你选择的组件。

要设置旋转角度,找到 Delta Rotation 输入,然后修改 Z 值为 1.0。这将导致蓝图沿 Z 轴旋转。值越大,转速越快。

要不断地旋转,你必须逐帧调用 AddLocalRotation。要逐帧调用,需要使用 Event Tick 节点。它已经在你的 graph 视图中了。如果没有,用前面一样的方法创建一个。

将 Event Tick 节点的输出 pin 拖到 AddLocalRotation 节点的输入 pin。

注:用这种方法,旋转速度取决于帧率。这意味着机器越慢圆桌的转速越慢,反之亦然。这对于本教程来说是可以的,因为我让事情简单化了,但在后面的教程中我会介绍如何解决这个问题。

最后,点击工具栏上的 Compile 按钮,更新你的蓝图,然后关闭蓝图编辑器。

将蓝图添加到关卡

在添加蓝图之前,在主编辑器的视口中,删除香蕉的模型。选择该模型,点击 Edit\Delete 菜单或者按 Delete 键。

添加蓝图和添加网格一样。在文件上按住左键,将它拖到视口中。

点击工具栏上 的 Play 按钮,看看效果!

注:如果你没有删除原有的香蕉模型,你可能会被警告”灯光需要重建“。如果删掉模型,则错误不再显示。

接下来去哪里?

在这里下载完成后的项目。

你已经学完这篇教程,但那只是 Unreal 中极小的一部分。如果你想继续学习,请阅读本系列的下一篇教程,我将介绍 Unreal 引擎更多关于蓝图的内容。

2015-11-21 11:23:21 xi_niuniu 阅读数 1231

Unreal Engine 4 蓝图脚本学习,根据《Blueprints Visual Scripting for Unreal Engine》学习整理

为了方便学习,通过以下设置将UE4调整为英语语言显示界面。



为了实现角色控制,找到 FirstPersonCharacter蓝图脚本并打开



模板自带的一些脚本node






添加输入映射





在Event Graph中空白处右键,这时就可搜索到我们刚在项目设置中添加的两个动作映射事件



角色的移动数据是在CharacterMovement组件中定义的



为了获取和设置角色移动数据需要把组件引入到事件图表中







这样就实现了按下左shift键盘角色冲刺的效果,类似穿越火线中的冲刺效果


添加望眼镜效果

FOV(field of view)的数据是在FirstPersonCamara组件中定义的所以将此组件拖拽到事件图表中

以设置Field Of View的值, 默认值为90


设置完成运行游戏查看效果

鼠标右键按下前



鼠标右键按下后