2018-04-25 14:32:06 qq_20201159 阅读数 2010
  • 从这里开始虚幻4-第2辑-蓝图 v4.18

    本课程系列取名英译系列,是录制人员参考国外英文原版经典教程,结合中国人的习惯录制而成。希望能够给大家以帮助。从这里开始虚幻4系列教程,是Unreal的官方发布的入门教学,非常经典,是学习Unreal的佳入口。

    2145 人正在学习 去看看 杨石兴

用虚幻4写入文件的操作

折腾了一天半,翻了很多教程,有的老哥也讲了很多让人获益的知识,但没有一个教程能实实在在的把这个东西讲通透,翻过了不少坑,终于把文件在硬盘里写了进去,也算是功夫不负有心人,下面来讲解一下。

首先虚幻4作为一款用C++写的游戏引擎,并且开源支持C++对代码的重构,对语言的支持也是势在必行,如果要进行重度游戏的架构,肯定会涉及到登陆注册功能,那么文件读写操作,是必不可少的,现行的SaveFile蓝图可以实现,但功能太局限,就让人有了用C++自己写一个文件读写函数的想法。

C++类与蓝图的交互

要想读写文件让蓝图对数据进行操作,就必须要实现蓝图与C++的交互,查阅资料后在下用了继承BlueprintFunctionLibrary类的办法,首先在UE界面创建一个C++类,选择继承为BlueprintFunctionLibrary,点击确定,这时候可能会出现一个小坑,说是在编译之前不能预览视图,当时可把我忙坏了,但不要着急,用Vs打开项目然后重新编译启动一遍,就好了。

在头文件里添加函数

创建好这个继承自BlueprintFunctionLibrary的类以后,我们就要在自己的类的头文件里声明自己要用到的函数了

在.h文件里

UCLASS()
class FPS1_API UMyBlueprintFunctionLibrary : public UBlueprintFunctionLibrary
{
GENERATED_BODY()

UFUNCTION(BlueprintCallable, Category = "Test")
static bool SaveToFile(FString Dir, FString Name, FString Text, bool Overwrite = false);
};

这次主要用到这一个函数,顾名思义,这就是保存信息到指定目录文件的函数,函数声明为static这样做是让所有的蓝图都可以使用该方法。

在.cpp文件里

#include "MyBlueprintFunctionLibrary.h"

bool UMyBlueprintFunctionLibrary::SaveToFile(FString Dir, FString Name, FString Text, bool Overwrite)
{
IPlatformFile& F = FPlatformFileManager::Get().GetPlatformFile();
if (!F.DirectoryExists(*Dir))
{
F.CreateDirectoryTree(*Dir);
if (!F.DirectoryExists(*Dir))
{
return false;
}
}


Dir += "\\";
Dir += Name;


if (!Overwrite)
{
if (F.FileExists(*Dir))
{
return false;
}
}

return FFileHelper::SaveStringToFile(Text, *Dir);

}

记得

IPlatformFile

 FPlatformFileManager

 FFileHelper

这三个类型都要导入相应的.h头文件在自己的头文件里,他们分别是

#include "IPlatformFileCachedWrapper.h"

#include "PlatformFileManager.h"

#include "FileHelper.h"

在下也是查了很久才查到这些东西

编译测试

编译VS工程,在编译出的UE工程里使用函数


点击编译后出现UE4工程


点击进入关卡蓝图


输入关键字以后,就会出现我们的函数


然后放置好参数和测试用的模块,点击编译,运行以后去看D盘

果然有了这个文件,而且输出和想象的一致



2018-07-19 00:17:03 qq_30919603 阅读数 3155
  • 从这里开始虚幻4-第2辑-蓝图 v4.18

    本课程系列取名英译系列,是录制人员参考国外英文原版经典教程,结合中国人的习惯录制而成。希望能够给大家以帮助。从这里开始虚幻4系列教程,是Unreal的官方发布的入门教学,非常经典,是学习Unreal的佳入口。

    2145 人正在学习 去看看 杨石兴

目录

创建蓝图Actor

添加组件

调整碰撞盒子

编写蓝图

触发事件

时间轴

设置旋转

完整蓝图

编译保存

使用Actor

BUG

设置StaticMesh碰撞

总结:


本章开始介绍蓝图,首先实现自动门功能

图比较多,如果懂,可以直接到最后查看最终蓝图

创建蓝图Actor

前面创建的材质我已经放到了文件夹中,并创建了新的蓝图文件夹

打开新创建的蓝图文件夹,右键空白处,点击蓝图类

选择第一个Actor就可以了

命名为BP_Door_Auto(蓝图类的命名一般是BP_打头),命名好后打开

如果是这个界面就点击打开完整蓝图

添加组件

在组件一栏中找到并点击添加组件,搜索mesh并选择最下面的StaticMesh(静态网格模型),命名为Door

再次搜索box,添加一个 Boxcollision

点击Door,Ctrl W复制一个出来,命名为DoorFrame

选中Door,在右边的细节面板中找到Static Mesh,下拉菜单,搜索door,点击SM_Door

对另一个另一个mesh进行同样的操作,选择SM_DoorFrame

在视口中可以看到两个模型,调整两个物体到合适的位置,差不多就行了

调整碰撞盒子

让box包裹住门并向两边有一定的延伸

编写蓝图

触发事件

首先切换到事件图表

首先选中box(点击一下)

在中间空白处右键如图点击“添加On Component Begin Overlap”或者在细节面板事件中点击加号直接添加,也要选中box(当有物体进入这个体积的时候就会触发后续事件)

同样的操作再添加一个“添加On component End Overlap”(相反的,当物体离开这个范围后执行),你会得到如下图的两个模块

时间轴

右键空白处,搜索timeline,点击添加时间轴

双击时间轴,添加一条Float型变化曲线

首先设置长度为2,这个是开门时间的长度

右键插入两个关键帧,也可以按住Shift左键点击添加,点击对应点,调整两个点的时间和值第一个为0,0,第二个为2,1

返回事件图表,按图连接(拖拽点到另外一个点上)

设置旋转

和前面一样的操作,右键点击空白处,搜索lerp,选择Lerp(Rotator),因为这里需要门进行旋转

7.把组件中的Door和DoorFrame拖拽到空白处

拖拽并搜索setrelativerotation

如下图连接

同样搜索Getrelativerotation

搜索Break rotator

从z这个节点引出搜索+,选择浮点型

设置值为90

最后从x引出并搜索makerotator

连接后是这个样子

最后按照图示连接到Lerp上

完整蓝图

编译保存

使用Actor

现在回到我们的场景中,把刚才创建的蓝图类拖拽到场景中

9.运行游戏试一下

完成,玩家靠近门,离开关门

BUG

11.这只是一个超级简单的自动门,BUG是不可避免的,你会发现,不管你在门的哪边,门都是朝一个方向打开,但问题也不大,所有这个问题留到以后再解决。

设置StaticMesh碰撞

角色进不去,是因为门框太小了,调整一下就好了,还有一个问题,角色会穿过门,是因为门没有碰撞体积,也很好解决

回到刚才的蓝图,点击door,在细节中找到Static Mesh,点击加号,就可以在内容浏览器中找到该物体

左键双击内容浏览器中的SM_Door,会弹出该物体的编辑界面,点击菜单栏中的Collision中的simple collision,就可以查看当前物体是否有简单的碰撞体积,很显然,现在是没有的,如图

点击菜单栏上方的碰撞中的Add Box Simplified Collision就可以为当前物体添加一个盒子碰撞体积

保存一下,回到场景,就比较符合逻辑了,这样一个自动门就实现了

 

总结:

本章主要介绍了蓝图的基本使用方法,创建蓝图,添加组件,设置属性,添加节点,连接,编译,运行

以及简单碰撞的创建,都是些最基础的东西,图比较多,但并不是很复杂,自己多尝试,如果对相对坐标和绝对坐标有疑问可以看我后面的文章

另外我觉得学习就是一个从模仿到改造,再到创造的过程,多思考和设计。可以试着设置把门和场景结合起来,做一个小场景,但不要花太多时间

下一章将对这个门进行升级,玩家将可以通过按键来控制门的开启和关闭,并且可以在场景中快速控制开启门的方式

 

2017-07-24 20:07:05 lemenet 阅读数 553
  • 从这里开始虚幻4-第2辑-蓝图 v4.18

    本课程系列取名英译系列,是录制人员参考国外英文原版经典教程,结合中国人的习惯录制而成。希望能够给大家以帮助。从这里开始虚幻4系列教程,是Unreal的官方发布的入门教学,非常经典,是学习Unreal的佳入口。

    2145 人正在学习 去看看 杨石兴

创建独立的蓝图类实现蓝图间的互相通信

CSDN的博客添加图片太麻烦了,而且链接网页图片会出现错误,如果需要看详细文章,请访问我的微信公众号《猎梦虚幻研究社》

在第一篇中,介绍了通过关卡蓝图来实现蓝图间的数据交互和事件通知。

但是从我介绍关卡蓝图开始就表明了我不推荐使用这种方式的态度。当一个场景中有极其多的门或者灯需要控制,或者有更多的场景元素需要我们操控时,使用关卡蓝图明显是一个十分糟糕的决定,这会让你的关卡蓝图变得无比复杂,臃肿,并且让你难以提起兴趣去维护它。

所以从现在开始,与蓝图通信有关的事将会变更到独立的蓝图类之间来实现(独立的蓝图类就是指单独创建的蓝图,比如在内容浏览器点击鼠标右键创建一个Actor蓝图)。

这一篇将通过蓝图中的变量来指定场景中的物体,以此来实现与第一篇中通过关卡蓝图实现“开门”一模一样的功能。

所以第一步需要做的是新建一个Actor蓝图,用它来作为我们的触发器。
这里写图片描述
创建Actor蓝图的方法以后就不赘述了,在内容浏览器右键点击创建蓝图,选择Actor为父类。我在这里将它命名为BP_OpenDoor。

打开这个蓝图,在组件部分添加一个StaticMesh组件用来存放我们的模型(如果你需要使用的话),再创建一个Box Collision组件作为碰撞体。

这个Box Collision和之前使用的Box Trigger相同,不会阻挡玩家移动,不会被看见,又可以触发事件。

如果到这一步没有出错的话,你的组件面板应该有如下图两个物体:
这里写图片描述

给StaticMesh一个你预备好的模型,调整Box的大小来适应模型。我就用一个简单立方体来表示开关,我调整好以后的状态如下图:
这里写图片描述

模型方面的工作就完成了,现在我们来到事件图表。

首先添加一个变量,类型更改为Actor并且将其设置为public。
这里写图片描述
现在这个变量存储的就是一个以Actor类作为基类的对象,所有继承于Actor的类都可以被存放在这个变量里。这么说可能非程序员有些不能理解,那么只要知道,一会儿我们要创建的Actor蓝图或者直接拖放的StaticMesh当做门,可以用这个变量来存储即可。

和关卡蓝图中逻辑相同,我们还需要一个Vector来存储门原本的位置。
这里写图片描述

在组件面板中,选中我们创建的Box Collision,在细节面板的最底下会有BeginOverlap事件
这里写图片描述
与关卡蓝图中的操作相同,点击加号添加这个事件(我的布局是为了截图方面临时调整过,可能与你的页面布局不太相同)。因为我们需要实现的功能是进入范围打开门,然后离开区域,所以这里只添加BeginOverlap事件,而不添加EndOverlap事件。

具体蓝图逻辑的写法:

先在BeginPlay的时候记录一下门的初始坐标:
这里写图片描述
然后将蓝图连接成如下图所示的样子:
这里写图片描述

现在我们来整理一下上述步骤的逻辑:

我们新建了一个Actor类(BP_OpenDoor),在其中创建了一个Box Collision作为我们重叠事件的触发器。将这个类放在场景中,场景中对应位置就会出现我们的模型和触发器Box Collision。当玩家进入触发器时,我们要想办法将“门”打开。

在蓝图里,创建一个变量(AimActor)来代表我们要操作的“门”,在游戏开始时(BeginPlay)获取我们对应“门”(AimActor)的坐标并用变量(Location)记录下来,当玩家进入范围触发重叠事件(BeginOverlap)后,设置“门”的移动,方法和第一篇中使用Timeline相同。

这样BP_OpenDoor的逻辑就完成了,现在要做的就是想办法指定我们场景中的“门”,并且记录在AimActor变量中。这样当我们操作这个AimActor时,实际上就是在操作我们指定的“门”。

指定“门”的方法其实也十分简单。我们已经将BP_OpenDoor蓝图放置到场景中,选中它时,可以在细节面板中看到AimActor这个属性。在这个属性旁边由一个小吸管(或者称为取色管)
这里写图片描述
点击它,再点击场景中我们已经放置好的“门”,这样就成功指定了模型,并且将它的引用和BP_OpenDoor中的变量关联了起来。
这里写图片描述
这样就实现了和之前相同的功能。
这里写图片描述

现在我们完成了对关卡蓝图的简化,释放了关卡蓝图中的空间,降低了逻辑的耦合性。关卡蓝图可以有更多的空间来编写真正需要的逻辑,而这种交互则独立封装起来,仅在BP_OpenDoor和“门”之间相互交互,不再干扰到其他部分。

这是一个很好的思路,在官方案例Content Example中也有大量的类似应用
这里写图片描述
只不过它用到了一些更深的方法(蓝图接口和事件调度器),没有封装的这么简陋而已。

这一篇的主要目的是向功能的封装走出第一步,将功能从关卡蓝图转移到独立的蓝图类中。后续将会介绍其他方法,来提高它的封装程度,进一步降低各个蓝图类之间的耦合性。

这里写图片描述

2018-05-01 23:14:09 qq_34705228 阅读数 53
  • 从这里开始虚幻4-第2辑-蓝图 v4.18

    本课程系列取名英译系列,是录制人员参考国外英文原版经典教程,结合中国人的习惯录制而成。希望能够给大家以帮助。从这里开始虚幻4系列教程,是Unreal的官方发布的入门教学,非常经典,是学习Unreal的佳入口。

    2145 人正在学习 去看看 杨石兴

本周任务:

本周我的任务是完善上周的工作实现基于Unreal Engine的VR交互,并且实现得分栏的设计。下面我将主要介绍我的得分栏的制作过程。


制作过程:
创建HUD:
首先添加一个控件蓝图。在内容浏览器->添加新项->用户界面->控件蓝图中选中控件蓝图。

控制蓝图HUD和Unreal Motion Graphics UI的共同的蓝图类型。

然后确定结构为垂直结构,控件在垂直方向上依次排列。选择了垂直结构即使用VerticalBox,并将它拖到层次结构的canvas pannel下面。

然后Horizontal Box拖到VerticalBox下面。

然后在面板的通用部分,将两个Text文本框拖入到Horizontal Box下面。
更改Anchors:

在层次结构中点击文本框,然后在文本框的详细页面更改'content':

在层次结构中选择Horizontal Box复制,在VerticalBox粘贴两次。
最后编译并保存就完成了HUD制作。


2017-05-02 16:44:00 weixin_33985507 阅读数 16
  • 从这里开始虚幻4-第2辑-蓝图 v4.18

    本课程系列取名英译系列,是录制人员参考国外英文原版经典教程,结合中国人的习惯录制而成。希望能够给大家以帮助。从这里开始虚幻4系列教程,是Unreal的官方发布的入门教学,非常经典,是学习Unreal的佳入口。

    2145 人正在学习 去看看 杨石兴

本节书摘来异步社区《Unreal Engine 4蓝图可视化编程》一书中的第1章,第1.1节,作者: Brenden Sewell 译者: 陈东林 责编: 胡俊英,更多章节内容可以访问云栖社区“异步社区”公众号查看。

第1章 使用蓝图进行对象交互

Unreal Engine 4蓝图可视化编程
当开始开发一个游戏时,你想到的第一步应该是建立一个原型。幸运的是,虚幻引擎4和蓝图让基本的游戏功能实现起来比以往任何时候都更容易。这样用户便可以很快地开始测试自己的想法。为了让大家熟悉虚幻编辑器(Unreal Editor)和蓝图(Blueprint),我们将使用一些自带的资源和蓝图建立游戏玩法机制。

本章我们将学习以下内容。

  • 创建新的项目和关卡。
  • 在关卡中置入对象。
  • 通过蓝图改变对象的材质。
  • 使用蓝图编辑器链接所有的蓝图。
  • 编译、保存并试玩游戏。
  • 使用蓝图移动游戏世界中的对象。
没有更多推荐了,返回首页