目录
Get Actor of Class/Get All Actors of Class
案例2:创建门的蓝图类——Actor和组件的区别、门和轴心点修改
节点3.Get Player Controller(获取玩家控制器)
节点2:Get Actors Of Class 获取所有Actor的类
节点1:类型转换为Third Person Character
节点1:Get Actors Of Class 获取类的所有Actor
一、蓝图基础逻辑
在蓝图的内容里,我们主要用到的是侧边栏和中间的视口区域,上半部分的工具栏中就有今天课程的主要内容“蓝图”两个字,单击鼠标左键展开分项,选中关卡蓝图再次单击鼠标左键,进入的这个界面就是关卡蓝图的编辑界面。
蓝图菜单创建时有三种:关卡蓝图、游戏模式、蓝图类
1.关卡蓝图:用于制作当前游戏场景的程序。
2.游戏模式:与制作中的游戏整体相关的设置、动作,在最初阶段基本不用,了解如何开发Unreal Engine后才加以使用。
3.蓝图类:类集中处理几个相关的功能及数据的小型程序。制作复杂程序时,创建类会是结构整体一目了然。
二、框架
GameInstance(游戏实例):
整个游戏贯穿始终,独立于关卡(常用来显示UI,比如刚进入游戏时的主界面,以及游戏加载界面)
GameMode(游戏模式):
制定游戏的规则,一个关卡有一个规则,一个游戏有多个规则。每一种gamemode就是一种玩法,包含游戏进行的规则和胜负条件等信息,一般和关卡绑定,一个关卡通常只放一个gamemode,但整个游戏可以有多种gamemode。
- 出现的玩家和观众数量,以及允许的玩家和观众最大数量。
- 玩家进入游戏的方式,可包含选择生成地点和其他生成/重生成行为的规则。
- 游戏是否可以暂停,以及如何处理游戏暂停。
- 关卡之间的过渡,包括游戏是否以动画模式开场。
GameState (游戏状态):
记录GameMode游戏规则的信息,基于规则的事件在游戏中发生,需要进行追踪并和所有玩家共享时,信息将通过 Game State 进行存储和同步。
- 游戏已运行的时间(包括本地玩家加入前的运行时间)。
- 每个个体玩家加入游戏的时间和玩家的当前状态。
- 当前 Game Mode 的基类。
- 游戏是否已开始
Pawn/Character:
Pawn:游戏中活动的主体(主角、npc); 可操控的actor统称为pawn,不局限与人形,可以是任何形式的物体。
Character:继承自Pawn,有人物的形状。而character比pawn多了一个移动组件(movement component),一般为人形态
- Pawn是一个actor。Pawn可以被Controller持有,他们可以接收输入,可以做很多游戏逻辑。
- Character是一个人形风格的Pawn,继承自Pawn。他默认自带一个胶囊体碰撞器和角色运动组件。他可以做到基本的人形移动,他可以平滑的复制移动并且有一些动画相关的功能。
PlayerState:
记录Player/Character中的信息
PlayerController:
一个玩家控制器代表一个玩家,不会被销毁,位置会寻找角色蓝图里的相机组件,并复用它的位置,多个相机则用序号最小的,没有就在位置0自创相机。
一个Play Controller可以拥有(possses)一个Pawn/Character ; (Player Controller的位置是摄像机的位置)
三、蓝图
1、蓝图类 Object
类似预制体
(1)Actor
一个可以在世界中摆放,或者生成的Actor,理解为一个基类。
(2) Pawn
Pawn是一个可以从控制器获得输入信息处理的Actor.
(3) Character
角色是一个包含了行走,跑步,跳跃以及更多动作的Pawn.
(4) PlayerController
角色控制器
(5) Game Mode
一个Game Mode 定义了游戏是如何被执行的,游戏规则,如何的分以及其他方面的内容。
2、关卡蓝图
与关卡所绑定,每个关卡都有一个关卡蓝图,不能复用(一个关卡蓝图不能在其他关卡用)优点:能轻松引用关卡中的东西
3、蓝图通信
蓝图通信是两个类或多个类之间产生联系的方式(调用)
(1)直接蓝图通信
是只能实现一种蓝图和另一种蓝图通信(一对一),不能实现一对多的通信方式。
Get Actor of Class/Get All Actors of Class
获取类的所有actor:会在场景中获取指定类的所有actor(例如指定为静态网格体,就会把场景里的所有静态网格体存入数组里),这个蓝图更适合用for each loop节点对某类actor进行批量的操作。(因为存入数组里很不方便单独获取某一个actor)
(2)事件分发器
(3)蓝图接口
(4)蓝图转换(castTo**)
知识扩充:
4、自定义事件
就是不属于UE4本身的事件,是我们手动写的事件
事件(Events) 是从游戏性代码中调用的节点,其使得蓝图执行一系列操作,蓝图本身会存在一些UE声明好的事件,通过对这些事件的实现,我们可以在对应事件发生的时候执行我们定义好的逻辑。
除了系统声明好的事件,我们也可以自己在蓝图中声明并定义事件,即自定义事件。比如下面我们定义了一个屏幕打印字符串的事件。
知识扩充:
UE蓝图(一)——自定义事件、函数与宏_ue 自定义事件-CSDN博客
5、事件绑定
事件是用户或浏览器自身执行的某个动作,诸如点击click
事件绑定,又称事件监听或事件委托,是指将一个或多个事件处理程序注册到特定的事件目标上,当该目标触发指定的事件时,注册的事件处理程序就会被执行。
- 事件注册:通过调用事件目标的特定方法,将事件处理程序与事件类型进行绑定。
- 事件触发:当用户在页面上执行与绑定事件类型相对应的操作时(如按钮点击、滑动与拖拽、碰撞检测等),会触发相应的事件。
- 事件处理:浏览器会调用与触发事件相关联的事件处理程序,并执行其中的代码。
6、对象引用
指的是在引擎内部不同对象或资源之间建立的关联或连接。这种关联允许一个对象通过引用另一个对象来访问其属性、方法或执行其他操作。
四、基础概念
知识点1:蓝图是可视化编程
知识点2:蓝图是面向对象的编译型可视化编程语言
面向对象:我打麻将,你打麻将,他打麻将
对象执行动作
面向过程:打麻将(你,我,他)
拆解成动作,把数据丢进去
知识点3:关卡蓝图和蓝图类的区别
关卡蓝图是用于创建游戏中的关卡或场景的工具。它允许游戏开发者在蓝图中创建对象、设置物理属性、添加游戏逻辑等,以构建一个完整的游戏关卡。
蓝图类是用于创建重复使用的代码、函数和算法的工具。它允许游戏开发者在蓝图中创建自定义类、定义函数和变量等,以便在游戏中被多次调用和重复使用。
关卡蓝图和蓝图类的区别在于它们控制的范围和可修改程度不同。关卡蓝图只控制当前关卡中的对象和行为,可以实时修改;而蓝图类定义了游戏对象的所有信息,在游戏过程中不可以修改,但可以在不同的关卡中使用。
知识点4:蓝图数据类型
- 红色横杠对应的布尔型(Boolean)是表示真或假。二者选其一的状态时使用。
- 绿色横杠对应的整型(Int也可记做Integer),用于声明整数类型的数据
- 浅绿色横杠对应的浮点型(Float),用于声明带有小数点的数据。
- 玫红色横杠对应的字符串型(String)
知识点5:节点的介绍
任何一种类型的节点,都由三部分组成。标题,输入部分,输出部分。
01.标题
节点的上方,显示着节点的标题。标题部分会根据节点的类型而显示不同的颜色。所以,看到颜色就知道该节点属于哪种类型了。
02.输入部分
显示在节点左侧的引脚,用于从其他节点接受数据。通过这些引脚与上游节点连接,获取必要的数值。
03.输出部分
显示在节点右侧的引脚,用于传递数值到其他节点。举个例子,将本节点计算后的结果值,传递给下游的节点。下游节点,将以此值作为输入部分。
知识点6:引脚的介绍
在虚幻4引擎里程序的实现都是通过节点连线传递信号的方式执行的,我们看到的这两个节点,都有白色的三角形引脚,统称为执行引脚,同时左侧的执行引脚称为输入引脚,右侧的执行引脚称为输出引脚,BeginPlay节点并没有左侧的输入表示他是纯输出节点,它的作用是在按下播放键,也就是游戏开始时释放一个信号到通过信号线连接的下一个节点的输入引脚,使其产生作用,同时下一个节点再执行完本身的功能后会继续沿着连线向下下个节点传递信号,指到信号线终止,则该段逻辑执行完毕。
仅限开发代表打包时发布版本是属于禁用状态
-
在关卡蓝图中单击右键展开节点搜索栏
-
键入BeginPlay,大小写没关系,选择事件BeginPlay,单击鼠标左键选中
-
再次右键展开节点搜索栏,键入PrintString,选择背景灰化的PrintString节点
-
鼠标左键按住BeginPlay节点右侧的白色三角形引脚拉出一条信号线,连接到PrintString节点左侧的白色三角形引脚上
-
同时将PrintString节点中间的Hello修改为想要在屏幕上打印的话,例如:Hello,蓝图
-
-
知识点7:节点的执行顺序
-
在事件图表中,节点的执行顺序是:从左至右。排布节点的时候,也是将最先执行的放在最左边,然后依次向右侧排列,这样会比较容易连接。
-
知识点8:节点的类型
-
01、事件节点
事件节点标题部分为红色,当用户操作或在游戏场景中发生了某件事时,就会触发事件。(信号)例子:启动游戏、用户操作鼠标和键盘、角色发生某种冲突时等等
Begin play事件(事件开始运行)就是事件节点
02、执行节点
执行节点标题部分为蓝色,作用于具体处理业务逻辑的节点。左右两侧都有白色三角形标志,因此,在整个执行流程中,它可以承接上游并且呼出下游。
Print String(打印字符串)节点就是执行节点
03.读取节点
读取节点标题部分为绿色,作用是向其他节点传递必要的信息,节点的右侧有用于接收读取值的项目(通常显示为Return Value),没有白色五角星标志,不能从事件连接到该节点。
Get Date(获取日期)节点就是读取节点
部分节点:
1.BeginPlay:事件节点,游戏一运行就触发。
2.make Literal String 节点:输入自身想要输入的字符串,与print String 节点进行连接,可以进行显示。
String 可以替换为其他格式。
3.print String 节点:
InString:要输出到日志的字符串
Print to Screen :是否输出打印到屏幕
Print to Log :是否输出打印到日志
Text Color:更改输出的字符串颜色
Duration:显示的时长,如果是负数,将从配置加载。
与Print String节点类似的还有Print Text节点。
知识点9:节点的注释
添加注释:右键添加注释
多个添加注释框选:多个同时添加注释,就会模块化
-
知识点10:添加小白人第三人称来操作
给小白人一个场景控制权:细节——自身——poss——player 0
五、案例集合
案例1:开关门互动实现
生活中的感应门是怎么运作的,感应门先是会有个感应装置感应到人的靠近,门自动打开,当人远去,门又会自动关闭,那么游戏中的门也是同理,再ue4中叫做盒体触发器。
现实生活中的感应器——ue4的盒体触发器。
需知名词:关卡蓝图——写一些场景的互动、事件、碰撞(在另一篇文章:【虚幻4】UE4初学者系列教程基础篇-全中文新手入门教程)
所需节点:
节点1:OnActorBeginOverLap
触碰开始时执行事件<进入区域触发事件>
节点2:OnActorEndOverLap
触碰结束时执行事件<退出区域触发事件>
节点3:时间轴
案例1开关门的互动显示
-
所需:添加新项目——内容包——strarter Content——SM Door
-
(刚刚添加会穿模,需要添加碰撞,来阻挡角色)
-
-
碰撞:打开门的模型。碰撞——添加盒体简化碰撞(添加碰撞后,player0就走不过门了)
-
调整碰撞大小:快捷键R缩放+拉动大小(碰撞大小即player0碰到门后走不动的范围)
-
盒体触发器:模式——基本——盒体触发器
-
(开门的操作即出现在盒体触发器的范围内,绿色边框)
-
将门修改成可移动:选中门后——变换——可移动
-
点击盒体触发器——工具栏——蓝图——打开关卡蓝图——右键
-
-
点击门——创建门的引用——set actor rotation——z轴修改成85度(告诉系统,让门这个目标围绕z轴进行85度的旋转)
-
-
(保存运行后会发现,player0靠近门/盒体触发器 就会打开)
但是这时候我们会发现,门开的很生硬,并且不能关闭,那么我们就需要添加时间轴来让门缓缓的开启,并且连接上 OnActorEndOverLap节点,让小白人离开盒体触发器的区域的时候,门可以关闭。
-
新建时间轴——双击添加浮点型轨迹——右键添加关键帧1(时间0,值0)——添加关键帧(时间2,值85)(值是按照旋转的角度)
-
-
右键关键帧1,点击自动,右键关键帧2,点击自动(为了平缓开门的动作)
-
-
连接线条
案例2:创建门的蓝图类——Actor和组件的区别、门和轴心点修改
当画面中的东西较多的时候,将每一个门都创建一个触发器再编写关卡蓝图,会让工作量变得很大,所以可以创建一个Actor来方便后面的操作。
理解:Actor可以理解为类别
所需节点:
节点1:设置旋转
SetActorRotation(设置Actor旋转):
self整个蓝图类旋转,目标是Actor,不论有多少组件都旋转
SetRelativeRotation(设置相对旋转) 和SetWorldRotation(设置场景旋转),旋转的是蓝图类里的单个组件
SetRelativeRotation(设置相对旋转):
设置相对位置的旋转,相对位置如门和门框的位置是没有变化的,单个组件以自身轴旋转
SetWorldRotation(设置场景旋转):
世界坐标是不会被改变的,坐标永远是(0,0,0),单个组件以世界轴的旋转,世界坐标永远不会被改变,不会受物体改变而改变
案例1——开关门的互动显示
-
右键——蓝图类——Actor——新建Door_BP——双击打开(Actor内有很很多组件,就可以理解为人的衣服和帽子裤子)
-
添加组件1——Skeletal Mesh(静态网格=模型)——取名DoorFrame
-
Static Mesh——SM_DoorFrame
-
添加组件2——Skeletal Mesh(静态网格=模型)——取名Door
-
Static Mesh——SM_Door
-
-
添加box Collision(盒体碰撞(盒体触发器))——调整碰撞盒子的大小(将盒体碰撞和门放在同一级,若是没有放在同一级门动的时候触发盒子也会移动,门一旦打开,人在移动后的触发盒子范围内就没有办法关门了)
-
编写事件图表——单击box——事件——on Component Begin Overlap——on Component End Overlap——时间轴——添加关键帧1(0,0)——添加关键帧2(1.5,75)——长度2——右键自动(在碰撞盒子内on Component Begin Overlap,离开碰撞盒子的范围on Component End Overlap)
节点2:添加旋转
管平移旋转还是缩放,基本就三类节点:GetXXX是获取;SetXXX是直接设置;AddXXX是基于现有数值进行增量变化,而后两者又分世界坐标与层级中的相对坐标。
添加旋转(AddRotation)是指在物体当前的旋转基础上,再加上一定的旋转角度。
而设置旋转(SetRotation)是直接将物体的旋转角度设置为指定的值,覆盖之前的旋转角度。
SetRelativeRotation:设置相对位置的旋转,相对位置如门和门框的位置是没有变化的,单个组件以自身轴旋转
SetWorldRotation:世界坐标是不会被改变的,坐标永远是(0,0,0)单个组件以世界轴的旋转
SetActorRotation:self整个蓝图类旋转,不论有多少组件都旋转
案例3:按键实现开关门
游戏操作中一般都是用键盘开关门
案例——游戏按键E打开门
所需节点:
节点1:Enable Input(启用输入)
表示可以输入,并且系统可以识别。
右键搜索 “ 启用输入” 或者 “ enable input”
节点2.Disable Input(禁用输出)
禁用输入:意义与启用输入相反
右键搜索 “ 禁用输入” 或者 “ disable input”
节点3.Get Player Controller(获取玩家控制器)
【以上三个组合总而言之就是规定了一个控制角色(Get Player Controller),确定了蓝图可以接受或拒绝操作该角色的玩家从键盘发出的指令:启用输入(Enable Input)、禁用输入(Disable Input),一旦该角色满足了触发条件,就启用输入或者禁用输入,即该角色可以获得或者丧失从键盘(这个案例是,下面那个案例是鼠标,总结总结应该接受从设备输入)输入按键的权利,然后触发后面乱七八糟东西的】
4、E(E按键)
5、Gate(在Open或Close满足时)的前提下然后输入E(Enter)的时候触发事件
右键搜索 “ gate”,相当于一个if,专门用于流程控制,如果某种情况,那么发生某事
6、Flip Flop(不断的翻转,A和B轮流执行,第一次调用执行A,第二次B,第三次A…)
7、SetRelativeRotation(设置相对位置的旋转)
案例4:鼠标点击实现开关门
案例——鼠标点击开门
1.添加On Clicked(点击时),点击Door——事件——On Clicked(点击模型后会触发事件)
2.打开世界设置——窗口,世界设置——Game Mode
3.人物靠近后显示鼠标
节点:show mouse cursor 显示鼠标
案例5:简易电梯蓝图
在游戏里面经常会出现升降电梯的画面,那么我们也来做一个电梯,电梯的逻辑其实和开关门是差不多的,只需要修改一个节点:设置相对位置
1.先用蓝图类创建一个actor,取名为BP_DT,添加静态网格体,添加box Collision(盒体碰撞(盒体触发器)
2.开始编写蓝图
节点1:设置相对位置
将时间轴的第二个点写成为要移动到的高度
节点2:插值
由A、B、Alpha三部分输入节点和一个Reruen Value输出节点组成
A、B进行数值从A到B的变换过程,A为起始值,B为最终值,Alpha控制A到B转化到了什么程度,类似于进度条从0到100%(即0到1)的转化,Alpha可以和前面的时间轴输出轨道相连,即用时间轴在多少秒内其值从0到1来控制Alpha,用于位置移动,有一个很好过渡效果
A填写电梯位移初始值,B填写电梯位置末值
案例6:双开旋转门
如何制作旋转门的双开门,通过复制旋转门,通过移动和翻转门的角度来实现开门和关闭操作。
案例7:拾取钥匙开门
拾取钥匙打开门:玩家通过寻找钥匙,通过钥匙来控制门的打开关闭。
- 玩家寻找钥匙
- 玩家拾起钥匙
- 玩家回到门前按E开门
在场景中放置钥匙的方法,通过更改一个布尔变量来判断是否可以开门,以及如何通过添加触发盒子和拾取物品节点来实现开门操作。
创建两个actor,一个为Key_Door,一个为Bp_Key
所需节点:
节点1:Branch分支
分支就是通过检查某个值,然后根据结果来判断该执行两个处理中的哪一个,即所谓的二选一。
Branch分支:
condition项用于连接要确认的值(真值或者假值)。
未连接值时默认为勾选状态,勾选时执行的是真的处理,没有勾选时则是假的处理
节点2:Get Actors Of Class 获取所有Actor的类
当两个毫不相干的蓝图类,想要引用对方的变量的时候,就可以使用到获取所有类的Actor。
获取类的所有actor:会在场景中获取指定类的所有actor(例如指定为静态网格体,就会把场景里的所有静态网格体存入数组里),这个蓝图更适合用for each loop节点对某类actor进行批量的操作。(因为存入数组里很不方便单独获取某一个actor)
知识扩展:
节点3:GET节点
选择需要获取的变量。可以通过搜索框来快速查找变量。
注意:Get节点只能获取已经定义的变量,如果需要使用未定义的变量,需要先在蓝图中创建变量并进行定义。get表示只是获取到某个物体,可以得到她的所有属性,但是不能进行修改。而set即是可以修改;
1.门的蓝图
保留之前”键盘控制门“的所有逻辑:
创建一个布尔值,取名为开门
其中分支相当于是一个if,Condition是用于判断的条件
逻辑:按下E键,判断bool变量“是否开门”的值,如果为1走True执行开门,如果为0走False打印提示字符串
2.钥匙的蓝图
用静态网格体制作一个钥匙
进入盒体触发器后,按下E就可以触发
当我们捡起了钥匙,这时候我们想要改变布尔值为是,就可以开门。
当两个毫不相干的蓝图类,想要引用对方的变量的时候,就可以使用到获取所有Actor的类。
在Actor Class中找到你自己刚刚建的门的类名(actor的取名):Key Door
一个场景中可能有很多个门,那我们怎么找到对应的门呢?(从一个容器中想要找到某一个变量)
就时候就可以用到get节点,需要是数组存的
因为我们这里只有这一个门,所以是0(在数组中0代表第一个),并且将数值修改为是
最后一步就是拾取完钥匙之后,钥匙就没了,将其销毁
右键搜索“销毁” ,选择“销毁组件(key)”
案例8:触发加速功能
在实现触发加速前,需要考虑如何更改角色的速度,通过类型转换获得小白人中的速度变量,实现蓝图通信和针对性。最后,可以通过蓝色引脚获得变量和事件。
所需节点:
节点1:类型转换为Third Person Character
节点2:自定义节点
之前写过:参考4、自定义事件
节点3:调用自定义节点
1.点击蓝图,选择新建空白蓝图类,选择第一个Actor,命名为SpeedUp
2.添加盒体碰撞(进入这个盒体区域会触发加速)
3.添加事件中的开始重叠和结束重叠(进入触发器区域和离开触发器区域)
4.添加类型转换(加速这个动作是谁拥有的?是我们的第三人称角色拥有的,所以调用刚刚第三人称的角色的事件,要先类型转换为Third Person Character)
other Actor 与Object相连是将Third Person Character类对象与box相联系
5.返回修改第三人称,可以看到里面有很多的事件,例如跳跃,移动,点击
6.新建图表,为了布局清晰
7.自定义一个事件叫做,speedup_event
8.将CharacterMovement拖入(其是负责角色移动的组件,还包括(跳跃,坠落,飞行等)
9.添加set Max Walk speed,默认参数为600,如果想要速度变快需要改变,但是不在这里改变,这是固定数值
10.连接内容,我们将数值连接自定义事件,到可以调用的地方修改参数值,这样可玩性更大,可以随时调用修改速度
11.返回触发加速蓝图,新增节点 触发加速,修改speed 的值为2500(调用函数)
案例9:通过键盘按键控制物体的旋转
所需节点:
节点1:事件tick
Tick事件是程序运行中每一帧刷新一次,例如在通常每秒60帧的游戏运行中,Tick事件就每秒执行了60次。在程序(游戏)开发中,可以借用Tick事件每秒的执行次数来控制Actor在场景中在运动速度等。节点详细解释参考:虚幻引擎UE4中的Tick事件_ue tick-CSDN博客
delta second含义是运行每帧所需要的时间
参考资料1:DeltaSeconds含义
参考资料2:DeltaSeconds用法
帧率为什么会变化?
因为游戏的帧率,特别是射击游戏的帧率是由显卡实时渲染的,而不是像视频一样以一个稳定的速率播放的,所以一秒里的帧速率是不一样的,可能在每秒60帧里,有些帧是完美的60分之一秒的持续时间,有些帧就长达25分之一秒,有些只有100分之一秒,十分不稳定,这可能与射击游戏的渲染特性有关。
节点2:添加本地旋转
在基础上旋转
节点3:分支
分支节点具有一个条件输入和两个输出引脚:一个用于条件为真(True)时的执行路径,另一个用于条件为假(False)时的执行路径。当蓝图执行到分支节点时,它会评估条件输入的值,并根据该值选择True或False分支来继续执行。
节点4:有效is valid
IsValid 是判断是否有效,传入的变量是否为空,使用lsValid可以检查指针是否为空。
- Is Valid:不为空的时候输出
- Is Not Valid:为Flase的时候输出
案例9:通过键盘按键控制物体的旋转
1.在内容浏览器中,右键点击蓝图类,创建一个名为 物体自转_BP 的蓝图
2.添加组件 - 立方体
3.将Cube拖入
4.添加本地旋转,设置z的值为2
5.增加 事件Tick (表示每一帧都执行 本地旋转)
6.创建一个分支来判断是否应该自转
7.创建 自定义事件,来控制布尔值什么时候为True或False
(看是否可以旋转,不能旋转就让它旋转,可以旋转就让它暂停旋转)
8.创建isValid(目的是判断是否有效,此时变量为空一定是无效,要选上对应的内容才有效。如果不判断会直接报错)
9.点击标注的小眼睛,再点击 编译
9.回到主页的小白人(记得点击),再点击标注的吸管图标,再点击视口界面的 物体自转_BP (或者直接选择对应的actor)
自转的方块:
第三人称;
案例10:简单点名系统
蓝图通信
节点1:Get Actors Of Class 获取类的所有Actor
获取rotation这个类,得到其中的第三个方块(数组中的0为第一个,数组中的2为第三个),使其旋转
节点2:For each loop 数组遍历
循环遍历场景中的所有该类的演员 (和场景中的所有该类的演员都通信一次 )
案例11:靠近开灯互动实现、靠近烟雾加灯光互动实现
节点1:设置可视性
可视性/visibility,可以设置一些模型、灯光、粒子可不可见,但是模型方面设置为不可视,碰撞依然存在
节点2:执行控制台命令(直接通信)
关卡蓝图间的直接通信
控制台命令
输入ce+空格+关卡蓝图中的自定义事件名称,就可以直接开始蓝图通信
1.靠近开灯互动实现
创建一个actor
靠近开灯互动实现
2.靠近烟雾加灯光互动实现
蓝图:
案例12:按F开关灯触发门互动实现
地图:
案例12:多个角色控制权切换
节点1:MultiGate节点
功能:按一定顺序执行的门节点。
MultiGate:按顺序执行一系列的引脚(Out0、Out1……),比如点击一次按键1,就执行Out0,再点击一次,就执行Out1……通过这种方式,来控制不同的角色。(按顺序执行一系列引脚)是Gate的加强版,
reset:重置,is random:随机,loop:循环,start index:从那个下标开始。
节点2:控制Possess
虚幻引擎中的Possess和Unpossess节点都是用来控制角色的。
当你使用Possess节点时,你可以将一个控制器与一个Pawn(角色)绑定在一起。这意味着你现在可以通过该控制器来控制该角色的移动、攻击等行为。
而当你使用Unpossess节点时,你可以将控制器与Pawn解除绑定。这意味着该角色将不再受控制器的控制,而是会变成一个无人控制的AI或者一个不受控制的物理对象。
节点3:使用混合设置视图目标
在UE4中,设置混合设置视图目标的节点是用于在游戏中切换摄像机视角的一种方法
目标(Target):这是你想要切换到的新的视图目标
新视图目标(New View Target):这是你想要设置为当前视图目标的对象,就是让当前的摄像头去新的目标,比如切换后,使用新角色为目标。
混合时间(Blend Time):当前摄像头去新目标,所需花费的时间。
混合函数(Blend Func):这是用于控制混合过渡的函数
混合指数(Blend Exp):这是混合函数的指数值,用于调整混合过渡的曲线形状。较小的指数值会产生更平滑的过渡效果,而较大的指数值会产生更快速的过渡效果。
锁定输出(Lock Outgoing):用于控制是否锁定当前视图目标。如果设置为true,那么在切换到新视图目标后,将无法再切换回之前的视图目标。
连接到玩家控制器,注意玩家控制器数值为0/1。
操作
整体逻辑:使用MultiGate实现多个人物之间的切换,使用possess来获取切换后人物的控制权,使用Set View Target with Blend来实现切换视角的过度。首先用数字2键来控制人物的切换,然后在MultiGate节点中引出三个人物分别的控制切换,在Set View Target with Blend节点中,设置切换过度的时间为1秒,即用1秒的时间进行两个人物切换的视角方面的动画(注意!此时角色控制权仍未切换)。随后用一个和切换视角的过度时间相同的Delay节点来使前面的切换过度动画能够完整播完,然后用possess节点切换人物控制权。此处如果不用Delay节点,那么直接就会执行possess节点,那么视角将直接切换,前面的过度动画将会被直接打断。有些人手贱,在切换动画还没播完的时候就想着再按一次切换人物,那么,未防止此类问题导致程序出错,前后加入一个bool类型的变量来判断过度动画是否播完,若没播完就算再次按键也将无法进行切换。
1.用到蓝图节点“multigate”,顺序执行,它的随机不会重复,它的重置相当于新进来(一般都是设置自定义事件使它重置),若双选循环和随机,相当于每走一次就重置一次且为随机,这时reset就没有意义了
想要实现按键盘1实现控制切换,创建键盘1,连接MulitGate,如此即可初步切换角色
2.想让切换期间有画面移动,可以添加摄像头移动蓝图节点“使用混合设置目标”,需从玩家控制的引出。然后再添加一个延迟,免得还没到那个角色,那个角色却可以移动了
想让切换期间有画面移动,可以添加摄像头移动蓝图节点“使用混合设置目标”,需从玩家控制的引出。然后再添加一个延迟,免得还没到那个角色,那个角色却可以移动了.
完整内容:
案例13:角色上下车功能
添加一个车的蓝图(可以添加官方的载具游戏的车),在内容浏览器-添加-功能包-载具类游戏
知识点解释:数组
数组的定义:
相同数据类型的有序集合,一段连续的内存空间,用来存储多个数据。数组指的是一种容器,可以用来存储同种数据类型的多个值
数组遍历
数组遍历:将数组中所有的内容取出来,取出来之后可以(打印,求和,判断..),遍历指的是取出数据的过程。