UE蓝图进阶
1 类的介绍与继承
1.1 创建蓝图继承的类介绍
Actor:可以放置,或者在游戏世界中生成的,不是玩家直接去操控的而是说有一些功能,例如物体的旋转发光等操作,还可以与pawm玩家操控的对象进行一些交互。例如玩家进入到一定的范围内,进行开门关门,开灯关灯等操作。
Pawm:继承自actor ,玩家操控的对象,通过controller进行操控,例如操控一些球,坦克什么的。
Character: 继承自pawn, 更多的是做类人的操作,例如第一人称,第三人称的射击。
1.2 对象与类的区别
实例化对象,就是把创建好的蓝图类,拖拽到场景中
1)对象:修改对象,只是对这个对象的自身产生影响,并不会对整个类产生影响。
2)类:修改类,会对全局产生影响。
例如在中显示不同颜色的名字,就可以通过点击场景中不同的对象设置。
通过这里面可以对自己的对象进行不同的操作,不会影响到,类的
如果想一起改变场景中的BP_CubeA,BP_CubeA2的材质,则在蓝图类BP_CubeA中设置。
1.3 类的继承
BP_Cube中 Classseeting有显示
创建子类BP_CudeB 继承自BP_CubeA,BP_CudeB的内部 都有BP_CubeA的东西。
BP_CudeB中的蓝图脚本,也会继承BP_CubeA中的,并且双击能够进入。
下面是BP_CudeB的蓝图脚本:
1.4 子类与父类的区别
子类BP_CubeB在自己本类中修改继承父类BP_CubeA的方法,变量、属性、不会影响父类,如果修改了父类的东西,会影响到子类的
例如在BP_CubeA中把小球拖拽到上方,BP_CubeB也会变,但是把BP_CubeB正方形变成圆柱体BP_CubeA 不会发生改变。
变量在父类中是公有的,子类可以使用,若要在父类中是私有的,子类不可以使用。
1.5 函数重写
父类中的函数。BP_CubeA, 修改材质,修改灯管颜色。ChangeLightColor是BP_CubeA自定义的函数方法。
BP_CubeB子类想对其重写,完成其他操作。
在子类中,点击override
然后找到父类函数
点击完成后,自动增加了一个事件。然后在事件后面添加重写的内容。
当子类调用时候,事件触发。
子类先执行父类方法,然后父类BP_CubeA,中Change Light Color方法重写了子类。重写后的函数,而不会执行父类中的函数。此时灯的颜色会由紫色变成黄色。
2 直接蓝图通信
最普通的通信方式,适用于在关卡中存在两个Actors,且它们之间需要进行传递或共享信息时。
2.1 关卡蓝图内的信息交互
定义一个ShowWelcomeMessage的自定义事件。
右键单击,show welcome message,调用事件。
定义showmessage函数
方法头尾和尾部的细节
右键 show message,调用函数。
2.2 关卡蓝图与StaticMeshActor信息交互
2.2.1 获取StaticMeshActor第一种方式
获取正方形实例:
在场景中点击选择Cube, 在关卡蓝图右击 create a reference to cube
得到
对得到的Cube做一些操作:
旋转cube
更改材质
2.2.2 获取StaticMeshActor第二种方式
把想要调用的存储在变量中,假设定义一个object对象进行 Object reference 引用 ,变量的类型Type是Static Mesh Actor ,这个是场景中的StaticMeshActor的类型,如果场景中有BP_CubeA,要获取BP_CubeA,则Type就需要改为BP_CubeA,灵活运用。
也可以在Default中选择
在蓝图中赋值,要去寻找cube
代码是在关卡蓝图,所以在输入寻找类 是static mesh actor,此时关卡中右面Type类型为static mesh actor 的将全部被找到。
用Get All Actor Of Class 方法,返回数组中得到,Cube Cube2 和floor
寻找cube做修改 如果 得到的名字==cube 进行修改,For循环中得到的是找到对象的引用。Get display name : 得到对象的名字。
2.2.3 获取StaticMeshActor第三种方式
设置数组资源,可以把StaticMeshActor设置到里面。
获取数组中资源
把静态资源是cube的加入到数组中
2.2.4 蓝图关卡Static Mesh Actor绑定事件第一种方式
获取正方形实例:
在场景中点击选择Cube 在关卡蓝图右击 就能够看到下面的图内容
案例一:鼠标点击了cube2,cube2对应的材质就修改了
显示鼠标,并且激活鼠标点击事件
就是右击看到的内容中的
2.2.5 蓝图关卡Static Mesh Actor绑定事件第二种方式
直接右击去搜索绑定
执行前 要把cube对象绑定过来 bind event, 在input里面
2.3 关卡蓝图和蓝图类信息交互
2.3.1 准备工作
添加蓝图类BP_MyActorA
显示名称
创建BP_MyActorA的子类
BP_MyActorB继承BP_MyActorA
在添加一个材质变量和修改材质的方法,在父类中BP_MyActorA类。在BP_MyActorA定义一个Change Material函数
BP_MyActorB子类里面就这样。
在BP_MyActorB类里面在添加自定义事件
2.3.2 在蓝图类中获取StaticMeshActor第一种方式
在蓝图类中,创建变量,把变量暴露出来,直接在场景中选择对象。
案例
2.3.3 在蓝图类中获取StaticMeshActor第二种方式
通过GetAllActorsOfClass节点去查找所有属于该类的对象
2.3.4 关卡蓝图和蓝图类的通信第一种方式
在场景中选中BP_MyActorA实例化的对象选中后,在事件图表中,右键选择创建对象的引用。
2.3.5 关卡蓝图和蓝图类的通信第二种方式
通过GetAllActorsOfClass节点找到MyActorA对象,并存储到变量中
查找到BP_MyActor的所有,晒选出名字是BP_MyActorA的,并且把他设置给自己定义的MyActorA变量。
测试MyActorA
2.3.6 关卡蓝图和蓝图类的通信第三种方式
通过getALL actor with tag 找到对象
在类里面去添加标签具体的位置在
打开场景页
点击要添加标签的蓝图类,在右下角 Actor中有tag
添加一个数组As 存储A
开始把A存储在数组中
取数组中的对象然后对其操作
2.3.7 在关卡蓝图调用蓝图类中的函数
此时2.3.1的准备工作就用到了。
调用自定义函数
CastTo函数
父类引用指向子类对象,此时的类中没有BP_MyActor对象,通过CastTo将将一个MyActorA的对象转换为MyActorB
2.3.8 在关卡蓝图调用蓝图类中的事件
在BP_ActorA中新建一个自定义事件
BP_ActorB是继承BP_ActorA,添加事件和函数重写
在关卡蓝图中 调用
2.4 关卡蓝图和UI的通信
2.4.1 准备工作
创建UI
显示UI
做测试
2.4.2 关卡蓝图和UI的第一种通信方式
第一种获得UI的方法:Create UMG Main Widget是通过return value返回值获取到UI对象。
2.4.3 关卡蓝图和UI的第二种通信方式
第二种方法通过定义变量去存储
测试
对UI中的Text
想对text值做修改,但是搜索不到text的控件
因为text不是作为一个变量 此时要把text的is variable的属性勾选上
返回UI中
找到
is variable的属性勾选上,这样就可以对text的属性进行操作了
2.4.4 关卡蓝图和UI的第三种通信方式
Get all widgets of class 方式获取
修改UI中 Text里面内容,target转换为 TextName
修改颜色通过变量的方式
修改颜色通过make的方式
2.4.5 UI事件
events 点击加号
添加欢迎信息的文本框
从事件中操作,出现字,然后在消失掉
Text Wel 变量是文本框的,UI里面添加的,所以就自动有。
2.5 蓝图类与StaticMeshActor
和关卡蓝图的区别:
在场景中选中,然后去蓝图类中右击创建不能创建。而在关卡蓝图中这样的操作却可以。
2.5.1 蓝图类与StaticMeshActor第一种通信方式
用变量去接收;
在细节面板中设置中可以看到
Type 都是 staticMeshactor
此时的sphere已经在细节面板中赋值了,所以它带有static mesh对象
测试
2.5.2 蓝图类与StaticMeshActor第二种通信方式
Get all actor of class
2.6 蓝图类和蓝图类之间的通信
2.6.1 准备工作
允许输入
2.6.2 蓝图类和蓝图类之间第一种通信方式
暴露变量的方式
测试
2.6.2 蓝图类和蓝图类之间第二种通信方式
2.6.3 子类父类通信注意
2.7 蓝图类与关卡蓝图
为关卡蓝图添加一个自定义的函数 showmessage
为关卡蓝图添加一个自定义的事件 ce_showmessage
用execute调用
2.8 蓝类和UI
get all widgets of class 去set
测试
2.8 UI和关卡蓝图
关卡蓝图定义函数
UI中
去添加事件
2.9 UI与StaticMeshActor
点击按钮更改球体的颜色
修改后版本,进行筛选修改
2.10 UI和蓝图类
执行CubeA printnum的函数
在UI中添加输入数字的控件
3 事件调度器
适用于告知其他“正在倾听的”蓝图已发生事件。事件发生时,正在倾听的蓝图便会作出反应,并相互独立地执行预期的操作。
3.1 准备工作
创建一个新的蓝图类 和门的蓝图类
不运行就有效果constructionScrip
添加文字
事件,BP_door中在event Dispatchers 创建事件调度器
CubeC中事件调度器中的方法
3.2 绑定自身的事件,自身调用的情况
需要创建出一个事件调度器
上面操作是在游戏刚开始的时候,执行所有绑定上bind event to ed_reached的事件。就是把事件绑定上。
下面的操作:
按住r键执行call ed_reached 这样的事件调度器才能够去执行
如果想点击R call ed_reach 不作用 。解除绑定一个,添加一个unbind 事件即可。
解除绑定全部
3.3 绑定函数
定义一个函数
首先得到自身的引用 右键 create event
调用刚刚绑定的函数和事件的调用一样
3.4 类与类进行绑定调用
在BP_door 添加一个事件,模仿开门关门的操作
添加actorc的引用变量
到BP_MyActorC中调用
3.5 在关卡蓝图中的使用
依然是通过变量
在actorC中调用
或者直接右键能够寻找到在actorC中定义的事件
2种定义的方法
在actorC中调用
3.6 事件调度器和UI
设计UI,是否进入下一个关卡
添加一个panel
Panel 也设置为一个变量显示与否,这样就可以把panel设置为是否显示
为UI的蓝图添加事件
在UI中得到ActorC 做事件的绑定
绑定结束 ,在在actorC中调用
4 接口
设置开门关门,开灯关灯的类
在接口中有2个function,接口内部
在要使用接口的蓝图类中的classsetting 点击Add 接口
在门的蓝图类中添加刚刚创建的接口文件变成了事件,搜索接口的名字
在灯的蓝图类中添加刚刚创建的接口文件
在另外一个蓝图类中调用 get interface 放回门和灯的
返回的有灯,有门。此时灯和门都执行操作,如果想让某一个物体执行单独的操作,那么要 if 选择一下