-
2021-08-01 17:47:00
打开蓝图之后什么也没有
问题解决!
更多相关内容 -
Python 蓝图
2018-11-03 18:07:472.如果我们有多个同事分工开发admin,user和其它可能的模块呢,都同时往一个views里写代码吗,在做版本控制时,提交过程中频繁出现提交冲突了怎么办? 3.加入我们要抛弃admin或者user功能块时怎么办,要一一手动删除... -
C++和蓝图
2021-01-26 18:42:26C++和蓝图概述蓝图可以继承C++类,从而使得程序员可以在代码中创建新的游戏性类,而关卡设计人员可以使用蓝图来继承该类并对其进行修改。有很多种修饰符可以改变C++类和蓝图系统间交互方式,其中某些修饰符会在本...C++和蓝图
概述
蓝图可以继承C++类,从而使得程序员可以在代码中创建新的游戏性类,而关卡设计人员可以使用蓝图来继承该类并对其进行修改。
有很多种修饰符可以改变C++类和蓝图系统间交互方式,其中某些修饰符会在本示例中突出介绍。
类设置
在类设置的第一部分中,使用C++类向导
创建一个名称为LightSwitchBoth 的类。
LightSwitchBoth类中的大部分代码设置都和 仅使用C++的LightSwitch示例
类似。尽管您可以让一个蓝图继承LightSwitchCodeOnly类,
但蓝图图表并不能访问该类中创建的组件、属性及函数。该示例将使用 UPROPERTY() 和 UFUNCTION() 修饰符,这两个修饰符使得LightSwitchBoth作为继承它的蓝图的模板。
您会发现首先参考下 仅使用C++的LightSwitch示例
是有用的,这样您可以看下如何设置头文件及源文件
来创建LightSwitchComponent、SphereComponent、DesiredBrightness属性及OnOverlap函数。
这个头文件是从 仅使用C++的LightSwitch示例
改编而来,添加了以下功能:PointLightComponent和SphereComponent是BlueprintReadOnly(仅蓝图可读的),并且将显示在 我的蓝图 选卡中的 Switch Components(切换组件) 类目中。
OnOverlap现在是一个BlueprintNativeEvent,将会显示在 我的蓝图 选卡中的 Switch Functions(切换函数) 类目中。
DesiredBrightness是BlueprintReadWrite(蓝图可读写的),将显示在 我的蓝图 选卡中的 Switch Properties(切换属性) 类目中。
DesiredBrightness现在是EditAnywhere(随处可编辑的),而不是VisibleAnywhere(随处可见的)。
UCLASS() 宏有个 Blueprintable 修饰符。在这个示例中,该修饰符不是必须的,因为LightSwitchBoth直接继承Actor,而Actor是Blueprintable(可蓝图化的),所以LightSwitchBoth会继承该修饰符。
加上 UPROPERTY() 和 UFUNCTION() 宏中的额外修饰符,LightSwitchBoth类的头文件如下所示:
LightSwitchBoth.h
// Copyright 1998-2016 Epic Games, Inc. All Rights Reserved.
#pragma once
#include "LightSwitchBoth.generated.h"
/**
*
*/
UCLASS()
class ALightSwitchBoth : public AActor
{
GENERATED_UCLASS_BODY()
/** point light component */
UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category="Switch Components")
TSubobjectPtr PointLight1;
/** sphere component */
UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category="Switch Components")
TSubobjectPtr Sphere1;
/** called when something overlaps the sphere component */
UFUNCTION(BlueprintNativeEvent, Category="Switch Functions")
void OnOverlap(class AActor* OtherActor, class UPrimitiveComponent* OtherComp, int32 OtherBodyIndex);
/** the desired brightness for the light */
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category="Switch Properties")
float DesiredBrightness;
};
在LightSwitchBoth的源文件中,构造器仍然是一样的。但是,需要对 OnOverlap 函数做一点修改。这个函数现在是一个BlueprintNativeEvent。这意味着
在继承这个类的蓝图中,可以放置一个覆盖 OnOverlap 的事件,当正常调用该函数时会执行此事件。如果该事件不存在,那么则是执行那个函数的
C++实现。要想使这个设置正常工作,该C++函数需要重命名为 OnOverlap_Implementation 。稍后在本示例中将介绍这个蓝图设置。对 OnOverlap 函数
进行了修改后,LightSwitchBoth 的源文件如下所示:
LightSwitchBoth.cpp
// Copyright 1998-2016 Epic Games, Inc. All Rights Reserved.
#include "BasicClasses.h"
#include "LightSwitchBoth.h"
ALightSwitchBoth::ALightSwitchBoth(const FObjectInitializer& ObjectInitializer)
: Super(ObjectInitializer)
{
DesiredBrightness = 15.0f;
PointLight1 = ObjectInitializer.CreateDefaultSubobject(this, "PointLight1");
PointLight1->Brightness = DesiredBrightness;
PointLight1->bVisible = true;
RootComponent = PointLight1;
Components.Add(PointLight1);
Sphere1 = ObjectInitializer.CreateDefaultSubobject(this, TEXT("Sphere1"));
Sphere1->InitSphereRadius(250.0f);
Sphere1->OnComponentBeginOverlap.AddDynamic(this, &ALightSwitchBoth::OnOverlap); // set up a notification for when this component overlaps something
Sphere1->OnComponentEndOverlap.AddDynamic(this, &ALightSwitchBoth::OnOverlap); // set up a 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 。
在 C++代码中添加的PointLightComponent和SphereComponent 也会显示在 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(仅显示用户创建的变量) 复选框时,
会隐藏从父类继承的属性。显示所有变量
仅显示用户创建的变量
有两个图表用于设置 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 的值。
LightSwitch_BPOnly 类中设置的另一个图表是 事件图表
。EventGraph的执行是由事件触发的。在这个示例中,
任何时候当调用C++函数 OnOverlap 时, OnOverlap 就会执行。在LightSwitchBoth的源文件中,设置了代理,以便当一个Actor进入或离开SphereComponent时会执行 OnOverlap 。
Sphere1->OnComponentBeginOverlap.AddDynamic(this, &ALightSwitchBoth::OnOverlap); // set up a notification for when this component overlaps something
Sphere1->OnComponentEndOverlap.AddDynamic(this, &ALightSwitchBoth::OnOverlap); // set up a notification for when this component overlaps something
OnOverlap 事件节点连接到了 Set Light Color 节点上。任何时候当执行该事件时,它都将会把PointLightComponent的光源颜色设置为一个随机颜色。这覆盖了
源码文件中用于切换的PointLightComponent可见性的 OnOverlap_Implementation 函数。
关于事件及处理图表的更多信息,请参照事件
、 事件图表
和事件模式
文档。
在变量的设置中, DesiredBrightness 变量设置为 EditAnywhere (随处可编辑) ,所以在 蓝图编辑器 的默认模式
中它是可见的,并且可以进行编辑。
这意味着对于类的每个实例,这个变量是可以变化的,所以每个Actor可以有其自己的 DesiredBrightness 。因为 DesiredBrightness 也是 BlueprintReadWrite(蓝图可读写) 的,且
Construction Script 中使用了它,所以更新它还会导致再次执行 Construction Script 。
其他Class Blueprints(类蓝图)可以继承由蓝图创建的类,通过以下两种方式实现:使用 Class Viewer(类别查看器) 中的类附近的下拉列表按钮来创建一个新蓝图,
或者通过右击该蓝图并选择 Create New Blueprint Based on This(基于此蓝图创建一个新蓝图) 。
类蓝图 LightSwitchBoth_BP 位于 内容浏览器
中,您可以从那里将其拖拽到关卡内。它也存在于 类别查看器
中。
关于使用 内容浏览器 或 类别查看器 在关卡放置Actor的更多信息,请参照放置Actor
文档。
-
ue4只会蓝图不会c++有什么影响吗
2021-01-13 15:36:11展开全部影响就是,只能做漫游,做不了游戏。。62616964757a686964616fe4b893e5b19e31333431366235。。。蓝图就是个节点编辑器,或者叫做可视化编程,这不是UE4首创的,更谈不上任何的创新,因为这玩意在30多年之前...展开全部
影响就是,只能做漫游,做不了游戏。。62616964757a686964616fe4b893e5b19e31333431366235。。。
蓝图就是个节点编辑器,或者叫做可视化编程,这不是UE4首创的,更谈不上任何的创新,因为这玩意在30多年之前,就已经被电影行业玩烂了。最早可以追溯到一款诞生于80年代初期SGI工作站上面,名叫Avid Media Composer的影视合成剪辑软件。
自Avid之后,绝大部分影视动画制作软件里,都标配了这玩意。比如C4D,NUKE,Houndini等软件,都有自己的节点编辑器。而UE4里的节点编辑器,唯一的不同之处在于,它起了一个"不一样的名字",实则换汤不换药。
下图为C4D的节点编辑器(诞生于1996年发布的C4D V4版):
Houdini中的节点编辑器(诞生于2002年发布的5.5版):
节点编辑器,是制作影视动画的神器。因为它可以让影视制作人员,跳过编程语言的学习。但要靠它做游戏,则更像是个笑话了。
动画与游戏的根本区别,首先需求产生的顺序不同。。。影视动画是先有剧本,之后按照剧本来制作动画,需求不会在中间环节产生变化,逻辑也不会在生产环节产生改变。而游戏中,玩家的行为是无法提前预知的,需求可能在任何时间产生变化。因此最直接的方法就是,不去设置可能改变需求的功能,让玩家无法做出"计划外的行为",但这也就根本无法称之为"游戏"了,最多只能算"场景漫游"。
第二,对冗余的忍受程度不同。。。动画的逻辑,冗余只在生产过程中产生,而成品本身,只是一个视频文件。而游戏中产生的冗余,将直接决定游戏的性能。如果按照一般的程序语言标准来说,蓝图生成的所有逻辑,其实含有大量的垃圾代码。UE4的项目需要更高的硬件配置,其实主要并不是因为"画面高大上",而是冗余。假如把一个Unity项目的画质,提升到超越UE4的水平,它需要的硬件配置,依然会比UE4项目要低很多。这就是UE4的项目很难移植到手机,掌机,而Unity却可以的根本原因。
用伪代码,举个不太准确的例子,如果用代码表示一个简单的AI逻辑,“如果敌人A的位置,接近B的3米之内,B就开始攻击。”
执行起来,大概是长这个样子:
如果(A的X轴位置,减去B的X轴位置,小于3){
发动攻击。。。
}
其实判断条件就一个。。如果A的X轴-B的X轴,小于3,那么就攻击。
而如果用蓝图来生成出的代码,有可能长这个样子:
如果(A的X轴位置,减去B的X轴位置,小于3){
发现并不成立,于是去检查是否等于3
}
如果(A的X轴位置,减去B的X轴位置,等于3){
发现并不等于3,排除法得出结论,距离大于3
发动攻击。。。
}
同样的结果,CPU就需要多做出两次判断,于是硬件要求就提升了一倍。。。。
蓝图这东西,作为爱好玩一玩可以,真的到了生产环节,我是真想不出它有什么用。。。可以顺利上线的游戏,比如《绝地求生》吧,你认为那里面有多少逻辑,是用蓝图连出来的?我敢肯定的告诉你,一个都没有。。。全是用C++写的。。。
-
UE4蓝图基础
2021-03-03 16:45:00蓝图可视化脚本简称“蓝图”或“蓝图脚本”,是一种需要编译的面向对象的可视化编程语言,蓝图完全集成在UE4中,蓝图通过节点与连线工作。 蓝图脚本的节点 触发事件,在蓝图脚本中以红色的节点出现函数,在看图...一、蓝图可视化脚本与蓝图系统
1.蓝图脚本
蓝图可视化脚本简称“蓝图”或“蓝图脚本”,是一种需要编译的面向对象的可视化编程语言,蓝图完全集成在UE4中,蓝图通过节点与连线工作。
蓝图脚本的节点
- 触发事件,在蓝图脚本中以红色的节点出现
- 函数,在看图脚本中以蓝色的节点出现
- 变量,在蓝图脚本中中以黄色节点出现
2.蓝图系统
蓝图系统又称“蓝图”或“蓝图类”,蓝图类可以看成是一个包含游戏内容的容器,其中可以包含组件、脚本或可以仅仅包含数据。
蓝图类有点类似Unity3d中的预设(prefb),蓝图类可以类似预设一般保存对象状态,可以随时拖入场景中使用,只是在其他功能上不如预设,如预设在U3D中的打包中可以发挥出优秀的效果,但是蓝图类只能作为容器使用。
蓝图类包含蓝图脚本,每一个蓝图类都包含一个默认的蓝图脚本。
蓝图类的分类
- 关卡蓝图:关卡蓝图在每个Level中只能存在一个,负责整个关卡的运行逻辑,关卡的初始化,帧更新都在关卡蓝图里进行;
- 普通蓝图:普通蓝图就是UE4的预设,在普通蓝图中我们可以对其中的对象进行一些的配置,如设置网格,贴图,粒子特效,添加相机,添加物理材质和挂载蓝图脚本等等;
- 游戏模式蓝图:UE4中游戏模式也是以蓝图的形式存在的,游戏模式蓝图控制一系列游戏的规则;
- 材质蓝图:在UE4中贴图材质也是蓝图的形式存在的,在材质蓝图中我们可以如同建模软件一般对材质进行一系列更高级的材质配置,如下图的一个简单示例:
4.创建蓝图
创建蓝图的方法很多,这里介绍比较常用的方法
- 可以直接在Content Browser(内容浏览器)中右键创建一个空的蓝图类,空蓝图除了包含一个根组件外不再包含其他东西,当我们在空蓝图中创建了对象后可以通过拖拽的方式将对象拖动到根组件位置处,用游戏对象替换根组件作为根组件,这样创建空蓝图时的白色小球就会消失;
- 在World Outliner(世界大纲)中选中游戏对象,可以通过工具栏中的Blueprints工具中的下面两个选项创建一个包含所选内容的蓝图类;
- 通过Blueprints工具的New Empty Blueprint Class也可以直接创建空蓝图类;
- 然而关卡蓝图似乎只能通过Blueprints工具的Open Blueprint Class打开。
二、变量与对象引用
1.在蓝图中创建变量
在蓝图中创建变量的方式有两种,其一:直接点击My BluePrint/Variables/+Variable,默认创建bool行的变量,可以点击变量前的色块更换变量类型。
其二:在蓝图脚本区域右键->输入Get New Var,可以直接在蓝图脚本中以节点的形式创建变量,在右侧细节面板中设置变量的值。
所有创建好的变量都会在My Blueprint面板Variables栏中显示。
在创建好的变量的Details/Variable/Variable Type选项中可以设置变量为普通变量、数组、Set容器和Map容器。
2.在蓝图中使用变量
可以直接在蓝图脚本区域右键->输入Get/Set [变量名]即可获取变量的获取/设置组件,也可以直接从左侧的My Blueprint面板Variables栏中拖拽变量到蓝图脚本区域选择Get/Set。
3.生成时公开与私有变量
蓝图中的公有与私有与程序中的公有私有有一些不同,蓝图中只分为生成时公开和私有两种访问权限。
生成时公开(Expose on Spawn)
勾选生成时公开后,在蓝图类使用Spawn Actor from Class组件生成蓝图类实例时,勾选生成时公开的变量将可以接受外部值输入。
如上图可以看到勾选生成时公开的变量会以输入接口的形式出现在Spawn Actor from Class节点里。这里需要注意的是,勾选Expose on Spawn,还需要勾选Instance Editable,否则会报警告。
私有变量(Private)
设置成私有变量的变量只能在蓝图类里访问,蓝图类的外部实例也无法访问这个变量,如上图,变量L没有设置成私有,所以可以通过Spawn Actor from Class组件生成的实例访问这个变量,而设置成私有的K变量搜索不到Set K节点。
3.在蓝图中使用组件引用
很多时候我们需要调节自身Actor上的组件的某些参数,那么我们就需要获得这个组件的引用以便获取组件上的参数进行调节,那么我们如何获得组件的引用呢?
其实方法也很简单,在My Blueprint/Variabales下有一个子栏“Components”其中存放着当前Actor上的所有的组件的引用,使用方法就是直接将需要的组件引用拖拽到蓝图脚本区域即可。获得了组件引用我们就可以通过引用使用不同的方法获取组件上的不同的参数了。
4.动态获取世界大纲中的Actor
在蓝图脚本中有四个方法获取外部Actor:
- Get All Actor of Class:通过类型来获取外部Actor
- Get All Actor with Tag:通过标签来获取外部Actor
- Get All Actor with Interface:通过外部接口在获取外部Actor
- Get Actors:通过层来获取Actor
三、蓝图的数据类型
1.5个基本数据类型
UE4蓝图中基本数据类型只有5个,需要注意的是蓝图中没有char、double、short、long等数据类型,在C++与蓝图的配合使用时需要注意这些类型的变量。
Boolean
Byte
8位,一字节,0-255。
Integer
32位整型,四字节。
Integer64
64位整型,八字节,能存储更大的数。
Float
32位单精度浮点型,其中1符号位、8指数位、23数值位,UE4中默认保留小数点后6位。UE4中只有Float类型没有Double类型。
2.3种字符串
String
蓝图中String类型就是蓝图C++中的FString类型,普通字符串,可以对其中的字符进行增删查改。
Name
Name是一种固定字符串类型,变量初始化以后不能在对其中的内容进行修改,且Name类型的字符串不区分大小写,多用于作为全局变量来唯一标识对象。Name类型的字符串在运行过程中存储于内存的字符串表中,使用效率高。
Text
Text是String的长度加强版,通常用于存储一段文字并可以进行国际化处理。
3.Vector(维度向量)
Vector
默认创建的Vector是Vector 3D,即三维量,包含x、y、z三个值,可以表示任何任何三维量,如:三维坐标和RGB等。
Vector 2D 和Vector 4
Vector 2D就是二维量,Vector 4就是四维量,常用于表示四元素。
Two Vectors
Two Vectors就是一个关于Vector的pair(对组),pair在C++的STL种较为常用,是一个只包含两个元素的容器。
4.Rotator(三维旋转量)
包含:
x:roll,翻滚角,以x为轴,进行yz平面的旋转;
y:pitch,俯仰角,以y为轴,进行xz平面的旋转;
z:yaw,航向角,以z为轴,进行xy平面的旋转。
5.Transform
Transfrom类型是一个3*3的矩阵,包含Location、Rotation和Scale三个三维向量。
四、条件语句
1.Branch(if条件判断)
传入一个bool值,进行分流,通常和比较组件配合使用,如:“==”、“>”等。
2.Switch
- Selection:case判断的变量;
- Default:默认执行分支;
- Add pin:添加执行分支。
五、循环语句
1.For Loop(for循环)
- First Index/Last Index:提供循环的次数;
- Loop Body:循环体执行分支;
- Index:返回当前循环索引;
- Conpleted:循环完毕后执行分支。
2.For Loop whit Break(可跳出的for循环)
使用方法和For Loop类似。
3.For Each Loop(数组遍历)
专门有用遍历数组的循环。- Array:需要遍历的数组;
- Loop Body:循环体分支;
- Array Element:遍历的数组元素;
- Array Index:当前索引;
- Completed:遍历结束执行分支。
4.For Each Loop with Break(可跳出的数组遍历)
用法和Foreach Loop一样,只是多了一个跳出执行分支。
5.Reverse for Each Loop(反向数组遍历)
6.While Loop(while循环)
六、数组
1.创建数组
创建数组要比创建变量多一个步骤,首先我们需要创建一个变量,然后再将这个变量的Details/Varialble Type选项的右侧色块选择九宫格,即可将对应变量转换成对应类型的数组。
2.为数组赋值
Add(Array)
传入一个数组和一个元素即可通过Add(Array)组件为组数赋值
如:
循环完毕后数组Array内便存储有0-10的是个int型元素。
3.获取元素
Get(a copy)
获取指定索引的元素的拷贝。
Get(a ref)
获取指定索引的元素的引用。
4.插入元素
Add(Aray)
直接在数组的末尾插入元素的方法也是使用Add(Array)组件,Add(Array)组件的的插入过程就是直接在数组的末尾插入元素。
Insert
指定位置插入使用Insert组件,输入参数从上至下依次为目标数组、要插入的元素、目标插入的索引位置。当要使用Insert组件在数组末尾插入,而又不知道数组大小时,可以使用Last Index组件直接获取输入数组的尾索引,当然直接使用只会在最后一个索引位置插入,而使最后一位元素向后移动一位,而达不到在数组尾部插入的效果,所以需要加一食用。
Set Array Elem
设置输入数组指定索引的元素的值,Size to Fit选项可以设置如果指定索引不存在时数组自动扩充size大小。
5.查找元素
Contains Item
Contains Item组件可以查找指定数组中是否包含某一元素,但是Contains Item只返回bool的判断结果,不会返回目标的索引值。Find Item
Find Item则是从输入数组中查找指定元素并返回第一次查找到该元素的索引值。
6.删除元素
Remove Index
通过索引删除元素Remove Item
从输入数组中移除指定元素,Remove Item会删除数组中所有指定的元素,如果删除成功则返回true,失败则返回false。
7.筛选元素
Filter Array
过滤数组可以按类型来筛选数组元素,用于父类型数组存储子类型元素时进行类型筛选,如:Actor数组筛选MyClass类型元素,Filter Array返回一个筛选后的新数组。
8.清空数组
使用Clear组件可以将数组内的元素全部清空。
9.获取数组长度
10.设置数组长度
七、结构体
1.结构体创建
蓝图中结构体的创建是没办法在蓝图脚本视图中创建的,UE4蓝图中结构体是与蓝图脚本同级的蓝图类,创建蓝图结构体的方法:在Content Browser中右键->Create Advanced Assect/Blueprint栏->Structure,即可创建一个结构体,创建出来的结构体默认拥有一个bool值得成员变量。
2.定义成员变量
蓝图中得结构体只能创建成员变量,不能创建成员函数,成员变量可以直接设置默认值。
3.结构的使用
将结构体创建好以后便可以直接在蓝图脚本中搜索到并使用了。
八、枚举
1.枚举的创建
枚举的创建和使用和结构体区别不大,创建方式一如结构体一般,Content Browser中右键->Create Advanced Assect/Blueprint栏->Enumeration,创建好后UE4也会在一个新的视图中对枚举进行编辑,枚举的编辑操作也相当简单,只有向枚举中添加与删除元素的操作,这些元素都可以添加注解提示,枚举也可以添加整个枚举的注解提示。
2.枚举的使用
枚举的使用就如同变量的使用一般,没有什么可说的。
九、接口
1.接口的定义
接口的定义和和蓝图函数库,蓝图宏库一样,但是接口的不像函数库和宏库一般可以再一个蓝图类中定义多个函数和宏,接口就是一个蓝图类,并且接口的编辑界面及其简约,可编辑视图只有一个My Blueprint和一个Detials,在My Blueprint/Functions栏可以新建接口函数,在对应的接口函数的Details/Graph可以设置一些接口函数的描述和Const属性,在Details/Inputs和Outputs栏可以设置接口函数的输入与输出参数。
2.接口的继承
接口是一个抽象蓝图,接口的实现必须通过继承接口的蓝图来实现,在蓝图中接口继承通过Toolbar/Class Settings/Interfaces栏即可添加接口到当前蓝图类是指继承此接口。
3.接口的实现
无返回值的接口实现
在一个蓝图继承了一个无返回值得接口后,这个接口将以事件的形式出现在这个蓝图类的All Actions for this Blueprint里
如:
蓝图以这个事件作为接口函数的入口,以此节点开始便可以开始实现各个蓝图类各自继承的接口函数的逻辑了。
有返回值得接口实现
有返回值的接口不会以事件的形式出现在Add Event里,而是会直接出现在My Blueprint/Interface栏里,我们双击即可打开接口函数的编辑视图,在视图中实现接口即可。
4.接口函数的调用
蓝图通过
[接口名](Mesasge)
组件来调用接口中的函数,如下图中的Interface1(Message)和Interface2(Message)。
接口的使用需要指定使用的接口是哪个蓝图类中实现的接口和接口需要传入的参数。在蓝图类的My Blueprint/Variables栏是可以搜索到我们自己创建的蓝图类的,通过过去蓝图类的引用便可以指定接口函数的实现者了。当然我们也可以使用Get All Actors with Interface组件来获取实现了指定接口的所有蓝图类,然后再对这些蓝图类中实现的函数进行调用。
十、蓝图函数库
蓝图函数库是一个可以被所有蓝图类调用的函数集合,蓝图函数库里的方法全部都被定义为静态方法,用于定义一些不与特定游戏对象绑定的功能性函数的实现。
1.创建蓝图函数库
创建蓝图函数库的方式和创建结构体类似,在Content Browser中右键->Create Advanced Assect/Blueprint栏->Bluprint Function LiberLibrary。
2.实现蓝图函数库里的函数
和结构体一样,创建好的蓝图函数库UE4会创建一个新的界面用于编辑库里函数;
- 在My Blueprint/Functions栏可以申明函数
- 在My Blueprint/Local Variables栏可以生命局部变量,在其Details中可以设置局部变量默认值;
- 在对应函数的Details/Input和Output栏可以分别设置函数的输入输出参数
- 在脚本编辑区可以实现函数逻辑。
3.使用蓝图函数库里的函数
要使用蓝图函数库里的函数,可直接在脚本编辑区右键输入函数名即可在Class栏中看到蓝图函数库里的函数了。
十一、蓝图宏库
宏在UE4中几乎无处不在,蓝图宏库是开发者使用蓝图自定义的一系列的宏的容器,蓝图宏库和蓝图函数库一样可以定义多个宏;
- 蓝图宏库与蓝图函数库不同的是,蓝图宏库中的宏是在预编译过程中完成处理的,即蓝图宏库不需要编译;
- 自定义的宏,可以有任意数量的输入输出引脚,即一个宏可以没有输出引脚,这样的宏可以只进行数据处理,一个宏也可以有多个输入输出引脚,这样的宏可以根据不同的逻辑选择不同的执行流,而蓝图函数库中的函数必须有且只有一个输入和一个输出引脚;
- 与函数不同,宏中不可以再定义成员变量,即宏只负责处理逻辑,不提供暂存能力。
1.创建蓝图宏库
宏库的创建与函数库的创建是一样的,在Content Browser中右键->Create Advanced Assect/Blueprint栏->Bluprint Macro LiberLibrary。
2.蓝图宏声明
- 在My Blueprint/Macro中可以声明一个宏;
- 在指定宏的Details/Inputs和Outputs中可以定义输入与输出引脚和参数。
3.蓝图宏的使用
和蓝图函数的使用方法一致。
4.自定义流程控制
除了蓝图提供给我们的条件语句和循环语句等流程控制语句外,我还可以使用宏编写自己的流程控制,因为宏可以有多个输入和输出引脚,使用方法就是使用宏的形式定义自己的流程控制逻辑,通过不同的输入给予不同输出,即可达到自定义流程控制的目的。
十二、事件
除了UE4蓝图中给我们提供大量的预定义事件,我也可以自定义事件。
1.事件的定义
事件的定义也很简单,在All Actions for this Buleprint中选择Add Custom Event,便可以创建一个自定义事件的入口,之后通过这个入口实现事件的内部逻辑,一个事件便定义完成。
2.事件的调用
事件调用必须通过实现这个事件的蓝图类才可以对其中的事件进行调用。如:
Event Blueprint为实现自定义事件的蓝图类;
Print Str为自定义事件。
3.事件调度器
事件调度器的创建与使用请阅读目录:十七、蓝图类的通信/3.使用事件调度器进行通信
十三、蓝图模块
蓝图中可以将一个复杂了逻辑处理合并成一个节点模块,从而简化整体的执行流复杂度,使蓝图的执行流变得简单明了。我们可以将需要合并的执行流多选选中然后右键,即可在Organization栏中通过Collapse Nodes选项来合并执行流。
除了将执行流合并成节点外,蓝图还提供将多个执行流合并成一个函数或一个宏的功能。合并好的模块也可以在Organizition/Expand Node进行模块分离。
十四、角色控制
1.为角色添加跟随相机
相对U3D来说,UE4的相机跟随要简单得多,UE4中直接将相机设置成了蓝图类的组件,当蓝图类时Player时,即可实现相机对Player的跟随了。
相机跟随需要通过一个物理组件
Spring Arm
来链接相机和Player,将相机附着在Spring Arm下,即可在Spring Arm的作用下实现相机跟随。2.为角色添加控制器
在UE4的游戏制作过程中,我们不难发现当我们运行游戏时,在世界大纲中多出了很多东西,如下图:
其实,UE4为我们提供很多已经预制好的必须品,如上图的PlayerController(角色控制器)、PlayerCameraMenager(角色相机管理器)等。也就是说不可以直接使用UE4预制给我们的角色控制器来控制我们的Player,而不需要自己再去为Player蓝图配置角色控制器了,我们只需将Player的细节面板上的Auto Possess Player设置成Player0即可,Player0即表示本地角色。
需要注意的是,对于角色控制更优的方式是使用
Player Start
组件去持有Player蓝图类,再通过Player Controller来控制Player Start达到控制角色的目的。3.自定义游戏模式
在我们创建一个UE4工程后,UE4会启用UE4默认的游戏模式
GameModeBase
,GameModeBase就控制着Player Controller、PlayerCameraMenager、PlayerState等运行时UE4动态生成的一些游戏物体,我们可以通过启用我们自定义的游戏模式来设置这些游戏物体按自己的定义的规则来生成运行。游戏模式也是一个蓝图类,创建游戏模式就是创建蓝图类,只是这个蓝图类需要继承自GameModeBase类,继承自GameModeBase类的蓝图就是一个游戏模式蓝图。不过在我们第一此=次打开游戏模式蓝图时,UE4会将游戏模式蓝图识别成一个普通蓝图,而进入普通蓝图的编辑模式,可能是bug吧,此时我们只需将蓝图关闭,再打开一次,UE4便可以识别出游戏模式蓝图了。
游戏模式蓝图中可以定义自己的游戏模式规则,比如我们可以通过修改Spectator Class选项为自定义的游戏物体,这样在游戏运行时,UE4将不再生成DefaulPawn,而是会生成我们指定的游戏物体。
配置好游戏模式后我们还需要让当前项目使用我们自定义的游戏模式,通过Seettings ->Project Settings->Project/Maps&Modes->Dfault GameModes,选择我们自己的配置的游戏模式即可让当前项目启用我们自己定义的游戏模式了4.操控角色控制器
我们要操控角色控制器就需要配置键盘按键映射,配置好的键盘映射会以函数的形式加入蓝图脚本组件集中。
我们在Seettings ->Project Settings->Engine/Input->Bindings/Axis Mappings设置键盘映射并可以配置映射的值,
配置好键盘映射以后便可以在蓝图脚本中使用这些函数主键来控制我们Player了,控制角色运动的方法很多,我这里以旋转力矩的方式来控制小球运动,具体的控制方法如下:
加入两个键盘映射函数组件(InputAxis MoveF/B,InputAxis MoveL/R)、两个添加角度力矩的组件(Add Torque in Radians,Add Torque in Radians),但是添加角度力矩组件是需要一个控制目标的,我们需要从左侧的My Blueprint面板的Components中将需要控制的物体Player拖入脚本蓝图中,分别连接到添加角度力矩组件的Target上。这里还需要注意的一点是,在我们为Player添加相机时,相机使用的是相对于Player的局部坐标,使用局部坐标的相机会跟随Player旋转,而使用世界坐标的相机将会固定某一个角度跟随Player移动。切换方法为:下拉Spring Arm的细节面板/Transform/Rotation的三角箭头选择切换。
并且相机默认情况下是启用了物理碰撞的,但大多数情况下我们是不需要让相机出现物理碰撞的,所以我们也应当取消相机的物理碰撞。操作方法为:取消Spring Arm的细节面板/Camera Collision/Do Collision Test选项。
当然要想比较真实的模拟出物理效果,光这样是不行的,因为默认情况下Player是没有启动物理模拟的,我们需要启用Player的细节面板/Physics/Simulate Physics选项,并且将调节Player的细节面板/Linear Damping(线性摩檫)和Player的细节面板/Angular Damping(旋转摩檫)到适当的值,应为UE4默认是没有旋转摩檫的并且,默认线性摩檫为0.01。
小知识
- 大多数时候我们都需要勾选作用力函数组件的Acel Change选项,如:上面的Add Torque in Radians,勾选了Acel Change选项作用力组件会在作用目标物体时忽略物体的质量因素,因为存在质量影响的话,我们可能需要给一个极大的力才能推动目标物体;
- 有时可能默认大小的作用力对目标物体的移动作用达不到我们理想的效果,此时可以先将作用力加倍后在传递给作用力组件,蓝图脚本组件集中提供多种多样的乘积组件,我们上面使用的是float*float组件;
十五、触发器
在游戏设计中触发器的使用是非常平凡的,而在蓝图中触发器的实现也并不复杂,我们来看一下具体操作:
1.创建触发器
- 蓝图模式中游戏的一切都是蓝图,触发器也不例外,所以要做一个触发器,首先我们的创建一个蓝图的壳子,并继承自Actor类
- 触发器还需要一个极为重要的东西就是碰撞体,当然这里的碰撞体不是具有物理碰撞的网格碰撞体,而是蓝图的物理组件集中的Box Collison,一个没有物理碰撞效果专门用于触发器的盒碰撞体,我们给蓝图类添加这个组件,一个触发器便完成了
2.使用触发器
当触发器放置于场景中,有物体进入触发器碰撞盒时,触发器便会出自动发触发Event ActorBeginOverlap时间组件,之后我们便可以进行一系列逻辑操作了。
十六、蓝图类的通信
1.使用引用进行通信
两个蓝图类要想通过引用进行通信,那么其中一个蓝图类就必须拥有另一个蓝图类的引用,如何获取一个蓝图类的引用呢?
在My Blueprint/Variables栏中添加一个所需要引用的蓝图类类型的变量,勾选它的Details/Variable/Instance Editable选项,就可以在这个蓝图类的实例的Details/Default栏中看到引用变量(如果不勾选是没有default栏的),如此便可以方便的获取另一个蓝图类的实例的引用了。
通过引用两个蓝图类之间便可以进行单向的信息传递了。即拥有引用的蓝图类可以获取所引用蓝图的传递过来的信息,反向则不行。
2.使用接口进行通信
使用接口进行通信的好处是可以很便利的通过同一事件让各种不同的蓝图做出不同的反应,如:当受到子弹攻击时,墙会反弹子弹,人会受伤,通过接口通信来实现这个效果就是,创建一个受到子弹攻击的接口OnTakeAttack,然后分别让墙和人都继承这个接口并实现不同的效果,如此当受到子弹攻击时,我们便可以通过Get All Actor with Interface来调用实现这些接口的Actor来做出各自的反应。
接口的实现与使用请阅读目录:九、接口。
3.使用事件调度器通信
事件调度器的通信过程是一个调度者与一个或多个被调度者之间的通信过程,类似观察者模式的通信过程。
创建事件调度器
使用事件调度器来进行蓝图通信,首先我们需要拥有一个事件调度器;
事件调度器只能被拥有者调用,所以我们需要在调度者蓝图上创建事件调度器,在My Blueprint/Event Dispatchers栏可以新建一个蓝图调度器,此时这个蓝图便拥有了一个事件调度器,我们可以通过拖拽事件调度器到脚本编辑视图或直接在All Actions for this Blueprint中搜索,可以对事件调度器进行事件绑定(Bind)、事件解绑(Unbind)、解绑全部事件(Unbind all),直接为事件调度器绑定新事件(Assign)和调用事件调度器(Call)。当一个事件调度器被调用后,与这个事件调度器绑定的事件都会被调用,一次来达到信息传递的目的。
绑定事件
调度者要事件调度器调用被调度者的事件,那么被调度者就需要向调度者的事件调度器上绑定事件,通过Bind Event to [事件调度器名]组件来绑定事件到事件调度器上。
Target:输入事件调度器的拥有者对象
Event:需要绑定的事件
如此一个基于事件调度器的通信机制便完成了。
-
动画蓝图 - Unreal Engine
2020-12-29 07:19:18为何选择动画蓝图?"动画蓝图“听起来比”蓝图“更高深莫测。 蓝图用起来很有意思,但现在看起来动画蓝图和蓝图的工作原理不太一样,所以我想在此处讨论一下。首先,让我们谈一下如何在虚幻引擎中播放动画。我们有两... -
blueprint-viewer:废料机械蓝图的3D查看器
2021-05-15 19:30:14蓝图查看器 废料机械蓝图的3D查看器 用它做什么 您可以使用它导出到.glb文件。 这是一种文件格式,在一个文件中包含所有模型和纹理。 然后,您可以将其上传到Sketchfab,以在蓝图的车间页面中添加模型和纹理。 安装 ... -
全面解析:服务蓝图的应用逻辑
2021-11-01 10:56:40服务蓝图是服务设计的主要工具,然而设计者们经常误解它与用户旅程图的关系、谁应该参与流程以及如何将其价值展现给团队。于是本文就为大家盘点服务蓝图与用户旅程图之间的关系以及服务蓝图的应用逻辑。 一、... -
UE4蓝图实例教学
2020-12-24 19:39:02让你可以通过学习可以深入理解虚幻蓝图的蓝图用法。感谢支持。我们一起努力继续学习吧!很多小伙伴都对虚幻引擎的强大和超棒的实时渲染效果所折服。但是一涉及到学习和使用却因为没有良好的方法入门而望... -
flask蓝图使用
2022-04-22 13:43:31当我们要使用flask开发一个大型项目的时候,会涉及到很多的视图设计,如果所有的视图都写在同一个文件里面,代码就会变得混乱不堪,然而蓝图就可以很好的帮我们解决这个问题,把整个项目分成一个一个的应用,每一个... -
UE4蓝图基础——蓝图流程控制节点
2021-03-01 21:14:42蓝图流程控制节点Branch(分支)DoN(循环)DoOnceFlipFlopForLoopForLoopWithBreakGateMultiGateSequence 蓝图流程控制节点,基于不同情况而控制执行流程的节点。类似程序编写中的if、for、顺序执行、循环执行。 ... -
SAP业务蓝图该怎么做
2017-11-01 13:16:36SAP业务蓝图该怎么做 引用网上的一篇文章,了解下业务蓝图该怎么做。 SAP实施方法论涵盖五大步骤,包括:项目准备、蓝图设计、系统实现、最后准备、上线与支持。本次结合多次项目的实际体会,先仅针对如何... -
Flask蓝图
2021-08-04 10:28:50蓝图 需求 在一个Flask 应用项目中,如果业务视图过多,可否将以某种方式划分出的业务单元单独维护,将每个单元用到的视图、静态文件、模板文件等独立分开? 例如从业务角度上,可将整个应用划分为用户模块单元、... -
用户旅程图与服务蓝图:到底有什么区别?
2021-11-01 10:53:45作者深入浅出地分析了用户旅程图以及服务蓝图的共性和差异,让我们一起来看看这两个人人都能学的服务设计工具! 一、开篇 我们生活中发生的每一件事都是一个旅程,它可能跨越几分钟、几年甚至一生。 它可能是... -
Unreal蓝图入门 节点
2019-12-07 21:49:40最近开始摸索Unreal的蓝图基础使用,一些基本的操作大家可以在官方网站中的教程中找到,所以我们直接跳到事件图表上来讲。 首先,Unreal有丰富的注释功能,按住键盘C可以创建出注释区域,在右侧的“细节”面板我们... -
深入Unreal蓝图开发:实现蓝图模板函数
2019-04-27 10:59:52使用UFunction CustomThunk函数方式,实现蓝图模板功能节点,用来处理任意类型的数组,并探索实现细节背后的蓝图机制。 -
给未来画一幅蓝图
2020-12-29 02:31:27既然你想要做某件事,就说明你是具备这种愿望变成现实的潜在力量的,人们不会凭空去想象自己力所不能及的事情,就像上文刚毕业的稻盛和夫,谁能想象一个非专业人士在如此简陋的条件下能研究出来和世界一流公司匹敌的... -
Carla 对象和蓝图
2022-04-22 09:37:001. 介绍 本文介绍的内容为Carla中的actor和blueprints,实在不知道怎么翻译actor,感觉翻译成演员有些奇奇怪怪,因此将actor代指成对象。 2. actor组成 ...获取Carla世界中的蓝图与蓝图对应的属性信息 bluep -
flask web 框架——蓝图(Blueprint)
2022-01-25 13:22:09文章目录一、蓝图(Blueprint)的概念二、蓝图的使用三、...但这么做很容易导致循环导入问题,所以,Flask 引入了**蓝图(Blueprint)**的概念。 蓝图是一种组织项目中文件或代码的方式。与把视图和其他代码直接注册到a -
UE4蓝图解析(四)
2020-12-24 04:37:10这是蓝图解析系列文章的第四部分,将介绍Statement优化和字节码生成相关索引:南京周润发:UE4蓝图解析(一)zhuanlan.zhihu.com南京周润发:UE4蓝图解析(二)zhuanlan.zhihu.com南京周润发:UE4蓝图解析(三)... -
虚幻引擎4蓝图节点
2020-04-13 19:09:32收集一些自己了解的蓝图节点,以便更好地学习。 -
UE4部分蓝图
2020-12-24 19:38:58在蓝图中找到对应物体选中物体→打开蓝图→右键选择Create a Reference to Shape_Cube获取物体坐标:Get Actor Location获取物体旋转信息:Get Actor Rotation获取物体缩放信息:Get Actor Scale打印(显示信息):... -
随便做着玩的蓝图系统(3)围绕Actor生成静态网格体
2021-02-14 21:17:14这样一来就能同时满足上述两个要求:Actor蓝图在生成时就不会往世界大纲里面放东西,要找起东西来也不会乱;生成的组件如果以相对位置生成,那么便总是会围绕着Actor放置在关卡中的位置生成,而非围绕世界坐标的... -
蓝图通信二
2017-07-24 20:07:05创建独立的蓝图类实现蓝图间的互相通信CSDN的博客添加图片太麻烦了,而且链接网页图片会出现错误,如果需要看详细文章,请访问我的微信公众号《猎梦虚幻研究社》在第一篇中,介绍了通过关卡蓝图来实现蓝图间的数据... -
UE4 蓝图 循环调用
2022-02-19 14:28:24在蓝图中的循环的两类方式的不同。关键点看是否有Delay节点,因为Delay是异步的方式调用的。 使用循环节点 原因:因为循环导致执行到delay后不会马上调用后面的语句就判断条件,导致Bool变量得不到更新。 好比是你... -
flask中蓝图的使用
2019-06-02 21:14:15在应用最终的路由表 url_map中,在蓝图上注册的路由URL自动被加上了这个前缀,这个可以保证在多个蓝图中使用相同的URL规则而不会最终引起冲突,只要在注册蓝图时将不同的蓝图挂接到不同的自路径即可 url_for ... -
【Flask】创建一个蓝图
2022-02-02 22:12:08蓝图 在一个Flask 应用项目中,如果业务视图过多,可否将以某种方式划分出的业务单元单独维护,将每个单元用到的视图、静态文件、模板文件等独立分开? 例如从业务角度上,可将整个应用划分为用户模块单元、商品模块... -
UE4从C++到蓝图
2020-12-06 10:36:28当我们需要将一个UObject的子类的成员变量注册到蓝图中时,只需要借助UPROPERTY宏即可。 先创建一个子类,在.h文件的类中添加如下代码: UPROPERTY(EditAnywhere,Category="mytest") int32 test_time; 然后可以在.... -
UE4--蓝图的作用
2021-03-13 15:27:33UE4是一种基于蓝图和c++语言的游戏开发引擎,蓝图也被称为可视化编程,将c++语言的代码可视化,通过逻辑性编入到引擎中,这也大大的降低了这个引擎的上手难度,让很多新人可以很快熟练地使用这个引擎,所以就可以...