2019-12-07 21:49:40 weixin_44332254 阅读数 13
  • 从这里开始虚幻4-第2辑-蓝图 v4.18

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

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

最近开始摸索Unreal的蓝图基础使用,一些基本的操作大家可以在官方网站中的教程中找到,所以我们直接跳到事件图表上来讲。
首先,Unreal有丰富的注释功能,按住键盘C可以创建出注释区域,在右侧的“细节”面板我们可以轻松调整颜色以及气泡的出现。

节点

见过一些别人编辑好的蓝图的同学们都知道,蓝图中有错综复杂的连线,这些连线从一个地方出来,到另一个地方去,控制了流程和数据的输入输出。就像是交通线,每个城市就相当于“节点”

节点类型
事件(Events)、自定义事件、函数调用、事件调度器、流程控制、数组节点、时间轴、数学表达式节点、随机流、注释。这些都属于节点类型,丰富的节点类型可以帮助我们在小型的游戏开发中基本不需要编写自己的C++代码,实现一些功能,但是同时者考验来蓝图编写者的逻辑思维能力。

事件
在蓝图中可以定义各种事件,创建蓝图时默认就会为我们提供三种事件:BeginPlay Tick以及Overlap。对应着我们游戏开始,帧调用以及碰撞触发事件。 在一个蓝图中,事件的种类可以有多个,但是同种类型的事件只能有一个。
另外,我们也可以自定义事件,Add Event一个事件,然后我们在细节面板可以修改自定义事件的名字,定义各种事件的成员变量。

函数调用
函数的调用是蓝图中同样重要的一环,函数调用可以简单分为一般函数调用,其他函数调用和纯函数调用。
所谓一般函数调用,是可以在蓝图中形成的操作,同属于目标Actor或对象的函数相对应 。
其他函数调用,是属于除了该蓝图之外的其他对象或者Actor的函数。
纯函数调用,是可以执行的特殊动作,它不会影响世界或者世界中的对象。比如输出一个属性值,进行数学运算等。

流程控制
switch:提供了各种switch判断的类型,也可以自定义枚举类型在这里判断。
branch:相当于if else语句
Do N:接受条件执行,但是有次数限制,达到次数上限后,再次接受相同条件无法执行后续节点操作。但是可以通过重置使次数归0 .
DoOnce:同上,但是只能执行一次
DoOnceMultiInput:可以根据不同情况执行不同的操作,但是如果想要再次执行,需要Reset。
FlipFlop:交替执行A和B后面的内容。
ForLoop:for循环
ForLoopWithBreak:可以在一定条件下终止循环,执行相应的语句。
Gate:门,顾名思义。可以设置Enter的条件和Exit的执行语句,可以设置open的条件,close的条件,或者用toggle使其自动open和close·······
MultiGate:可以又多种输出的开关门,可以设置开始和重置,可以选择是否随机或者循环,可以从只当index的输出开始
Sequence:按顺序一次执行,但是值得注意的是,即使写了Delay,Sequence也会直接执行后面的语句

变量

存放一个值或者引用世界中一个Object或Actor的属性。
变量类型:
在这里插入图片描述
在这里插入图片描述

详细介绍:

布尔值(bool):小案例:利用不布尔值设置一个point light的intensity,按下键盘一个键后,如果灯是打开则关闭,如果关闭则打开。
易犯错误:将一个布尔值取反后,忘记重新把这个取反后的值设置回这个变量中,导致只能发生一次变化。
字节(byte):学过一定计算机理论的知道,1字节是8位,在UE中存储范围是0-255。在右侧细节栏中可以设置UI中滑动的范围以及值的取值范围,后者控制前者。
整型和64位整型:整型是32位,两者仅仅范围不同
浮点型(float):范围很大,案例:做一个四舍五入的功能(利用浮点型转整型操作)。
Name,String以及Text:Name是轻量级的字符串,经常被用于对象的命名 string是我们通常用的字符串,支持字符串的拼接,查找等其他语言中都存在的操作 Text是大段文本,如果游戏中出现大段对话,基本我们就使用Text,这样会对我们的本地化非常有帮助。
Vector:引擎中很多属性例如位置,旋转,缩放都是使用Vector。案例:使用Vector修改物体的位置和缩放。
Rotator:和Vector类似,可以用来定义一个旋转角度。
Transform:Transform即物体的位置,旋转和缩放,第一个和第三个是Vector类型,第二个是Rotator类型。案例:获取物体的Transform中的旋转进行输出。

Enum枚举类型:我们可以在内容浏览器中新建一个自己的枚举类型,为其设置各种情况以及解释
Structure结构体:我们可以在内容浏览器中新建一个结构体,类似于各种编程语言中的struct
综合案例:创建一个学生结构体,属性为姓名,年龄,以及学校(利用枚举类型),在蓝图中实现这样的功能:根据学生年龄的大小,输出“姓名”+是否成年+“(学校类型)”。

数组节点:
由于本篇文章是基于有一定其他编程语言经验的人编写,所以数组方面可能不会那么详尽的去介绍。
在这里插入图片描述
在这个地方可以修改变量的类型,有普通变量,数组,集以及字典。

数组中的方法:
在这里插入图片描述
很多方法都是其他语言中存在的一些常用的方法,大多都属于增删改查,具体如何使用各位客官可以自己摸索。

集合:
接下来就是我们的第三种数据存储容器,集合
在这里插入图片描述
在C#中,我们有数组,列表,字典,哈希表,栈和队列等数据结构,集合也是一种类数据结构容器,在初等数学中我们应该学过集合相关的知识。
如果硬要对比的话,集合就好比一个键值对相同的字典。
在蓝图中,可以对集合进行如上图的操作。其中也包含了最常用的差并交三个基本操作。

地图:
第四种数据存储容器:map
这个就很熟悉了,有的编程语言中它叫map,有的中是Dictionary,本质上就是一个键值对,而且是一种引用类型的键值对;与之相对的是,哈希表是一种值类型的键值对。
在这里插入图片描述
上面是map中一些常用的方法,有一定数据结构知识的客官们应该能轻松应用这些方法。

函数(Function)

在这里插入图片描述
在上图中,我们已经大概了解了图标和变量的含义,那么接下来是函数。
在这里插入图片描述
可以覆盖,但由于我们还没有继承的子类或者父类,我们就先新建一个函数
在这里插入图片描述
点击新建的函数,可以进入我们的函数界面,在右侧的细节面板有我们的一些函数相关的设置,例如一些注释,访问方式(public protected private) 是否为纯函数 在输入和输出中,我们可以定义相应的函数的输入和输出数据流。

实操训练:对一个数组进行排序
unreal蓝图中实现数组的排序是非常消耗性能且复杂的。

宏:
宏跟函数非常类似,可以定义输出和输出,而它比函数多了一个功能,它可以在右侧的细节面板设置多个输入和输出引脚,有点类似于我们的分支,具体如何使用到之后继续总结。

数学节点–蓝图中的math类
在这里插入图片描述
如图所示,在蓝图中搜索math,会出现很多一些蓝图中的数学节点,这些节点提供了我们对一些数据类型的基本的操作。
数学节点也包括对transformation的操作,另外,我们的Random节点也归在数学节点里,不再做进一步的介绍,请各位客官尝试使用一下各种数学函数,灵活运用到自己的项目中。

时间轴:
Timeline为我们提供了一个基于时间的控制器,不仅仅是做动画,Timeline代表了一种在时间轴上进行各种操作的编程习惯。
对Timeline的介绍分为两部分,首先是Timeline的曲线编辑器:
在这里插入图片描述最上面一排,可以添加基于各种类型变量的曲线,设置曲线的时间,自动播放,循环等属性。在一个Timeline中可以定义多条曲线,都会在事件图表中显示出来。中间是我们的曲线编辑窗口,我们可以按shift去添加关键帧,用delete去删除关键帧。右键点击关键帧,可以设置关键帧在此处的状态是平滑,线性还是剧变等等状态。

然后是事件图表中的Timeline节点:
在这里插入图片描述
Play:播放
Play from Start:从头开始播放
Stop:停止
Reverse:从后往前播放
Reverse from End:从最后往前播放
Set New Time:为动画设置一个新的时间
Update:每帧执行
Finished:结束执行
Direction:播放是从后往前还是从前往后

Timeline在创建后,在左侧会以组件的形式出现,我们可以像对其他变量和组件一样对它进行get 和set
下面是关于Timeline节点的一些方法:
在这里插入图片描述

2017-03-24 13:46:41 beginner9 阅读数 1171
  • 从这里开始虚幻4-第2辑-蓝图 v4.18

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

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

学习心得,做下笔记,防止忘~

1.新建关卡(level)

2.新建蓝图类


3.打开蓝图类

视口——>rendering


出现龙头,如下图,很好!


4.把“”“视口”右下角的input 中的Auto Receive input 设置为“”“player 0”,如下图:


5.在“”“事件图表”中添加变量


6.绘制蓝图关系

创建成功关系图后一定要编译


7.设置循环1-10次,如下图:


end~运行效果图:

按“”“F”键盘上的按键,就可在看见效果


2015-11-13 19:42:51 xi_niuniu 阅读数 1399
  • 从这里开始虚幻4-第2辑-蓝图 v4.18

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

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

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

本篇博客主要内容是 射击添加到视口中的actor 并用自定义材质改变其颜色


创建一个基于FirstPerson蓝图模板项目

新建一个用于保存材质的文件夹


创建材质



































为Cylinder添加脚本
















播放运行最终效果



不过以上脚本还不完美。不仅子弹碰撞到圆柱体会变色,玩家和任何其它actor碰撞到圆柱体上都会变色。

在蓝图编译器器中做如下修改






这时只有子弹actor碰撞到圆柱体上才会变色


2016-01-02 20:53:08 wag2765 阅读数 288
  • 从这里开始虚幻4-第2辑-蓝图 v4.18

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

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

创建HUD蓝图和创建Character蓝图的方式一样,先创建一个HUD的C++ class之后,然后在资源视图中右键新建蓝图-》选择之前创建好的HUD class:



 



 

 

 

使用UMG组件时,需要在“工程名.Build.cs”代码中修改,修改内容为下面红色部分:

public class TD_Test : ModuleRules

{

public TD_Test(TargetInfo Target)

{

PublicDependencyModuleNames.AddRange(new string[] { "Core", "CoreUObject", "Engine", "InputCore", "UMG", "Slate", "SlateCore"});

 

2019-02-24 12:01:58 qq_31788759 阅读数 432
  • 从这里开始虚幻4-第2辑-蓝图 v4.18

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

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

教程链接:Unreal Engine 4 虚幻引擎蓝图中级教程物理碰撞

想共享的小伙伴可以E-mail我:lxbcolorgalaxy@qq.com

目录

第一章 常见的物理现象及分析

1蓝图模板中的物理现象

2创建子弹抛射

3自动追踪

4碰撞事件

5纯物理模拟子弹

第二章 碰撞体

1简易碰撞体

2DOP碰撞体

3凸面碰撞体

4567UBX导入碰撞体

8从其他模型复制碰撞体

9碰撞体积

第三章 物理刚体

1物理刚体

2质量

3质心

4运动衰减

6运动空间锁定

第四章 碰撞通道

1类型、反馈、通道

2UE4中的碰撞设置

3碰撞案例测试

4类型与反馈案例

5添加自定义碰撞

第五章 碰撞事件

1ACTOR交叉触发

2OnComponent触发

3击中

4击伤事件

5伤害类型

6点伤害

7范围伤害规则

8完全伤害

第六章 射线检测

1零粗细(很细)射线检测

2零检测返回结果

4球体非零粗细检测

5调试检测结果

6多重零粗细检测

7盒子、胶囊体检测

8逐多边形检测


 

第一章 常见的物理现象及分析

1蓝图模板中的物理现象

分析了第一人称射击模板中的物理现象,比如子弹飞行、碰撞、产生力的效果与消失。

2创建子弹抛射

1.给子弹击中物体施加一个同方向的冲击力——子弹蓝图

 

2.子弹模型添加Projectile Movement Component组件,引擎自带的子弹模拟,可设置子弹参数

 

3.控制生成的子弹位置、播放角色动画

3自动追踪

1.设置子弹反弹参数

 

2.设置子弹追踪导航功能

蓝图中设置追踪目标

 

4碰撞事件

1.Overlap重叠事件(类似Unity里的触发器,又不同)两者均需要勾选Generate Overlap

5纯物理模拟子弹

1.删除projectile组件,更改Sphere Mesh的碰撞预设,给小球生成时添加Physics Linear Velocity,更改发射方向。

2.选中Actor,修改生命周期

第二章 碰撞体

1简易碰撞体

2DOP碰撞体

10DOP分别沿着X Y Z轴创建更复杂的碰撞体

3凸面碰撞体

 

4567UBX导入碰撞体

3DMAX中制作碰撞体的命名规则:盒型UBX、球形USP、不规则UCX,紧跟其中一个模型的名称。不规则时,每个内角要小于180°,是一个凸边形。

 

8从其他模型复制碰撞体

选中其他已有碰撞体的相同模型,在无碰撞体的模型中选择Copy

9碰撞体积

Blocking Volume通常当作场景的边界碰撞盒,可同BSP模型一样进行编辑修改

第三章 物理刚体

1物理刚体

2质量

3质心

4运动衰减

6运动空间锁定

第四章 碰撞通道

1类型、反馈、通道

Object Type ——> Response ——> Channel

2UE4中的碰撞设置

3碰撞案例测试

1.阴影烘培效果,Movable是实时的,Static需要构建

2.可破坏物体 设置碰撞时可破碎

3.各种Object Response设置

4类型与反馈案例

5添加自定义碰撞

 

第五章 碰撞事件

1ACTOR交叉触发

Event ActorBeginOverlap——碰撞物体触发

Event ActorEndOverlap

2OnComponent触发

Add On Component Begin Overlap——碰撞组件触发

Add On Component End Overlap

3击中

Event Hit

开启Hit事件 碰撞响应要设置为Block

4击伤事件

1.应用伤害Apply Damage

2.接受伤害

Event AnyDamage

Event PointDamage

Event RadialDamage

5伤害类型

1.DamageType的预设类别

2.创建一个继承DamageType的自定义DamageType蓝图

 

3.代替Add Impulse产生冲击力,设置Damage Type中的Damage Impulse为80。但Apply Damage无法触发代码Add Impluse At Location(Apply Point/Radial Damage可以)。

AnyDamage连接下的

6点伤害

1.子弹蓝图里触发Damage

7范围伤害规则

1.球形范围伤害

2.由于Damage Prevention Channel的原因,侧面和后面的方块受到的爆破力被阻碍

8完全伤害

1.C++引擎源码中的ApplyRadialDamge蓝图节点信息

h头文件

/** Hurt locally authoritative actors within the radius. Will only hit components that block the Visibility channel.
	 * @param BaseDamage - The base damage to apply, i.e. the damage at the origin.
	 * @param Origin - Epicenter of the damage area.
	 * @param DamageRadius - Radius of the damage area, from Origin
	 * @param DamageTypeClass - Class that describes the damage that was done.
	 * @param DamageCauser - Actor that actually caused the damage (e.g. the grenade that exploded).  This actor will not be damaged and it will not block damage.
	 * @param InstigatedByController - Controller that was responsible for causing this damage (e.g. player who threw the grenade)
	 * @param bFullDamage - if true, damage not scaled based on distance from Origin
	 * @param DamagePreventionChannel - Damage will not be applied to victim if there is something between the origin and the victim which blocks traces on this channel
	 * @return true if damage was applied to at least one actor.
	 */
	UFUNCTION(BlueprintCallable, BlueprintAuthorityOnly, Category="Game|Damage", meta=(WorldContext="WorldContextObject", AutoCreateRefTerm="IgnoreActors"))
	static bool ApplyRadialDamage(const UObject* WorldContextObject, float BaseDamage, const FVector& Origin, float DamageRadius, TSubclassOf<class UDamageType> DamageTypeClass, const TArray<AActor*>& IgnoreActors, AActor* DamageCauser = NULL, AController* InstigatedByController = NULL, bool bDoFullDamage = false, ECollisionChannel DamagePreventionChannel = ECC_Visibility);
	
	/** Hurt locally authoritative actors within the radius. Will only hit components that block the Visibility channel.
	 * @param BaseDamage - The base damage to apply, i.e. the damage at the origin.
	 * @param Origin - Epicenter of the damage area.
	 * @param DamageInnerRadius - Radius of the full damage area, from Origin
	 * @param DamageOuterRadius - Radius of the minimum damage area, from Origin
	 * @param DamageFalloff - Falloff exponent of damage from DamageInnerRadius to DamageOuterRadius
	 * @param DamageTypeClass - Class that describes the damage that was done.
	 * @param DamageCauser - Actor that actually caused the damage (e.g. the grenade that exploded)
	 * @param InstigatedByController - Controller that was responsible for causing this damage (e.g. player who threw the grenade)
	 * @param bFullDamage - if true, damage not scaled based on distance from Origin
	 * @param DamagePreventionChannel - Damage will not be applied to victim if there is something between the origin and the victim which blocks traces on this channel
	 * @return true if damage was applied to at least one actor.
	 */
	UFUNCTION(BlueprintCallable, BlueprintAuthorityOnly, Category="Game|Damage", meta=(WorldContext="WorldContextObject", AutoCreateRefTerm="IgnoreActors"))
	static bool ApplyRadialDamageWithFalloff(const UObject* WorldContextObject, float BaseDamage, float MinimumDamage, const FVector& Origin, float DamageInnerRadius, float DamageOuterRadius, float DamageFalloff, TSubclassOf<class UDamageType> DamageTypeClass, const TArray<AActor*>& IgnoreActors, AActor* DamageCauser = NULL, AController* InstigatedByController = NULL, ECollisionChannel DamagePreventionChannel = ECC_Visibility);

cpp实现

bool UGameplayStatics::ApplyRadialDamage(const UObject* WorldContextObject, float BaseDamage, const FVector& Origin, float DamageRadius, TSubclassOf<UDamageType> DamageTypeClass, const TArray<AActor*>& IgnoreActors, AActor* DamageCauser, AController* InstigatedByController, bool bDoFullDamage, ECollisionChannel DamagePreventionChannel )
{
	float DamageFalloff = bDoFullDamage ? 0.f : 1.f;
	return ApplyRadialDamageWithFalloff(WorldContextObject, BaseDamage, 0.f, Origin, 0.f, DamageRadius, DamageFalloff, DamageTypeClass, IgnoreActors, DamageCauser, InstigatedByController, DamagePreventionChannel);
}

bool UGameplayStatics::ApplyRadialDamageWithFalloff(const UObject* WorldContextObject, float BaseDamage, float MinimumDamage, const FVector& Origin, float DamageInnerRadius, float DamageOuterRadius, float DamageFalloff, TSubclassOf<class UDamageType> DamageTypeClass, const TArray<AActor*>& IgnoreActors, AActor* DamageCauser, AController* InstigatedByController, ECollisionChannel DamagePreventionChannel)
{
	FCollisionQueryParams SphereParams(SCENE_QUERY_STAT(ApplyRadialDamage),  false, DamageCauser);

	SphereParams.AddIgnoredActors(IgnoreActors);

	// query scene to see what we hit
	TArray<FOverlapResult> Overlaps;
	if (UWorld* World = GEngine->GetWorldFromContextObject(WorldContextObject, EGetWorldErrorMode::LogAndReturnNull))
	{
	World->OverlapMultiByObjectType(Overlaps, Origin, FQuat::Identity, FCollisionObjectQueryParams(FCollisionObjectQueryParams::InitType::AllDynamicObjects), FCollisionShape::MakeSphere(DamageOuterRadius), SphereParams);
	}

	// collate into per-actor list of hit components
	TMap<AActor*, TArray<FHitResult> > OverlapComponentMap;
	for (int32 Idx=0; Idx<Overlaps.Num(); ++Idx)
	{
		FOverlapResult const& Overlap = Overlaps[Idx];
		AActor* const OverlapActor = Overlap.GetActor();

		if ( OverlapActor && 
			OverlapActor->bCanBeDamaged && 
			OverlapActor != DamageCauser &&
			Overlap.Component.IsValid() )
		{
			FHitResult Hit;
			if (DamagePreventionChannel == ECC_MAX || ComponentIsDamageableFrom(Overlap.Component.Get(), Origin, DamageCauser, IgnoreActors, DamagePreventionChannel, Hit))
			{
				TArray<FHitResult>& HitList = OverlapComponentMap.FindOrAdd(OverlapActor);
				HitList.Add(Hit);
			}
		}
	}

	bool bAppliedDamage = false;

	if (OverlapComponentMap.Num() > 0)
	{
	// make sure we have a good damage type
	TSubclassOf<UDamageType> const ValidDamageTypeClass = DamageTypeClass ? DamageTypeClass : TSubclassOf<UDamageType>(UDamageType::StaticClass());

		FRadialDamageEvent DmgEvent;
		DmgEvent.DamageTypeClass = ValidDamageTypeClass;
		DmgEvent.Origin = Origin;
		DmgEvent.Params = FRadialDamageParams(BaseDamage, MinimumDamage, DamageInnerRadius, DamageOuterRadius, DamageFalloff);

	// call damage function on each affected actors
	for (TMap<AActor*, TArray<FHitResult> >::TIterator It(OverlapComponentMap); It; ++It)
	{
		AActor* const Victim = It.Key();
		TArray<FHitResult> const& ComponentHits = It.Value();
		DmgEvent.ComponentHits = ComponentHits;

		Victim->TakeDamage(BaseDamage, DmgEvent, InstigatedByController, DamageCauser);

		bAppliedDamage = true;
	}
	}

	return bAppliedDamage;
}

2.Apply Radial Damage with Falloff (falloff为0不衰减,越大衰减越快

第六章 射线检测

1零粗细(很细)射线检测

 

射线通道TraceChannel

Visibility——适用于两点之间,存在障碍物时触发

Camera——适用于从相机发出射线

TraceComplex——针对复杂物体,检测复杂碰撞体还是简单的碰撞体,一般不开启

 

Note设置Start End Position

绘制射线的持续时间

2零检测返回结果

法线

测试

 

4球体非零粗细检测

5调试检测结果

蓝图

预测

实际

6多重零粗细检测

1.立方体 碰撞预设设置由BlockAll变为OverlapAll

Blocking Hit 绿色为false,红色为true

7盒子、胶囊体检测

Orientation——方向

 

8逐多边形检测

Trace Complex 不勾选——检测碰撞体

勾选——检测多边形模型

同时,模型选择Use Complex Collision As Simple Collision

 

 

没有更多推荐了,返回首页