UE4入门笔记一(begin in 2022/10/21)
前期准备,需要安装的东西
Epic Games Launcher
UE4.25.4
Visual Studio2019
Visual Assist
1:UE4.25.4的配置
1.1:修改UE4缓存路径
UE4默认缓存路径在C盘,每次打开新的项目,就需要编译着色器,所有项目编译完就会保存在缓存路径中,方便下次打开直接加载。但是久而久之,C盘空间占用就会非常厉害
找到UE4.25.4的安装位置\UE_4.25\Engine\Config
把Path="%ENGINEVERSIONAGNOSTICUSERDIR%DerivedDataCache"
换成Path="%GAMEDIR%DerivedDataCache"
重新打开项目之后,你的项目的缓存路径就会在项目的根目录创建了
2:UE4 C++基础
我们可以在编辑,编辑器偏好设置,点击源代码修改UE4对应的C++编辑器,UE高版本引擎可以打开低版本的项目,但是低版本的引擎无法打开高版本的项目,UE引擎是向下兼容的。
2.1:创建UE4项目
(1)创建项目
打开UE4,点击创建游戏
选一个模板(这里我就选择空白模板),之后修改一下项目设置
(2)GameModelBase
首先我们创建C++项目,底下会以我们的项目名创建一个对应的GameModel
这个类继承自GameModelBase
GameModelBase定义的就是游戏规则(比如lol赢就是摧毁敌方基地,输就是自己基地被拆了),很多的游戏规则和游戏基本设置都会定义在GameModelBase里面。
这个类是默认创建的,但是有的时候我们需要定制化设置的时候我们可以自己创建GameModelBase
2.2:C++通过和蓝图进行交互
(1)概述
反射就是说当一个程序在运行的时候,另外一个程序可以获取他类里面的属性或者是方法
比如说C++写好了一个变量和一个方法,在运行的我如果想在蓝图中调用C++的属性和方法,那这个时候就需要使用属性
要想深入了接反射,可以看Inside UE4,但是本人C++基础不好就不看了
(2)Actor
Actor就是一个演员,比如一个场景里面的桌子或者门都可以是Actor
Actor的生命周期
从放置在一个场景里,那么这个Actor就出生了,直到这个场景消失,那么这个Actor就死了。
比如一个从杭州到武汉,那么这个时候杭州场景销毁,杭州场景里面的所有Actor也会销毁。
(3)UObject
比如我想要一个东西一直运行,那就不能使用Actor,要用Object,UObject是UE4中的顶级父类,就是UE4的所有类都是UObject的子类。
藉着UObject提供的元数据、反射生成、GC垃圾回收、序列化、编辑器可见、Class Default object等,UE可以构建一个object运行的世界。
(4)创建Actor实例
比如我们新建一个Actor,在过滤器中新建右键新建C++文件选则Actor
选则共有还是私有(public文件夹下还是private文件夹下)
最终建立结果如下:
由于UE4中元素非常多,所有他们会对所有的元素进行标识,比如继承与Actor,那么这个类名就需要在前面加个A,包括Actor本身也会被写成AActor,比如刚才创建的MyActor组件,类名会变成AMyActor
(5)Actor实例解读
MyActor.cpp文件内容如下
// Fill out your copyright notice in the Description page of Project Settings.
#include "MyActor.h"
// Sets default values
AMyActor::AMyActor()
{
// Set this actor to call Tick() every frame. You can turn this off to improve performance if you don't need it.
PrimaryActorTick.bCanEverTick = true;
}
// Called when the game starts or when spawned
void AMyActor::BeginPlay()
{
Super::BeginPlay();
}
// Called every frame
void AMyActor::Tick(float DeltaTime)
{
Super::Tick(DeltaTime);
}
MyActor.h文件内容如下
// Fill out your copyright notice in the Description page of Project Settings.
#pragma once
#include "CoreMinimal.h"
#include "GameFramework/Actor.h"
#include "MyActor.generated.h"
UCLASS()
class CLIENTSERVERGAME_API AMyActor : public AActor
{
GENERATED_BODY()
public:
// Sets default values for this actor's properties
AMyActor();
protected:
// Called when the game starts or when spawned
virtual void BeginPlay() override;
public:
// Called every frame
virtual void Tick(float DeltaTime) override;
};
1:在刚才创建的MyActor.h里面还有一个特殊的语句
#include "MyActor.generated.h"
这一行的.generated.h
部分是固定写法,这是支持反射的代码,引入反射相关的文件,一定要放在引入头文件的最后一行。
2:UCLASS()
UCLASS()是一个宏,宏是反射相关的宏,为了让UE4提供我们这个类相关的元数据(类的结构,方法,变量等),要注意的是只要是被UCLASS必须是派生自UObject,用Alt+G点击AActor可以看到,AActor继承与UObject。
(3)GENERATED_BODY()
GENERATED_BODY()提供的是个模板,也是类似于
之后就是一个无参构造函数
public:
// Sets default values for this actor's properties
AMyActor();
下面是一个protected的方法
protected:
// Called when the game starts or when spawned
virtual void BeginPlay() override;
virtual表示是虚函数,override表示重写,代表我继承这个方法后我要自己实现一份BeginPlay()
在AActor中搜索BeginPlay可以看到本身被定义就是个虚函数(没有实现体的,但是是可以实现的)。
下面就和上面的一样了,父类规定要你做这个事,你通过重写来解决怎么做这个事。
public:
// Called every frame
virtual void Tick(float DeltaTime) override;
(6)在C++里和蓝图进行通信
比如定义一个整形变量,如果想要蓝图进行调用就需要加一个宏UPROPERTY()
UPROPERTY()
int a;
宏:又以叫宏定义、也叫宏替换
宏的定义
define 名字 内容;
类似于如果我们需要多次用到一个变量,可以给这个变量一个名字替换他
#define a 1500;
a + 15;
a * 15;
C++会在预处理阶段,有个预处理器把这a替换为1500。
添加上上面的代码之后可以在ue4编辑器中编译一下
我们要使用这个C++类和蓝图通信,就必须创建一个蓝图类作为这个C++类的子类
右键C++项目创建基于该项目的蓝图类
但是现在还是不行,因为只是加了一个宏UPROPERTY(),但是没有给他任何属性修饰
UPROPERTY(Category = "Addam", VisibleAnywhere)
int a;
比如用上述代码设置a为Addam分组,并且为随处可见后
双击MyActorBP就可以看到这个a了,吧不过由于设置了不可修改,所以为初始值就是0。
但是不可以修改,所以可以用EditAnywhere 替换VisibleAnywhere
UPROPERTY(Category = "Addam", EditAnywhere)
int a;
并且我们添加一个MyActorBP到游戏里,这个模型也有a这个属性,并且也是可编辑的。
详细设置(9条消息) UE4入门-常见的宏-UPROPERTY_303snowing的博客-CSDN博客_uproperty
(7)UE4C++如何和蓝图进行交互
新建一个共有的C++类名叫Student
在程序最下面添加一个name属性,在ue4中,String有一个新名字叫FString
如果几个属性或方法是在同一个类下面,name这个时候这些属性和方法的Category都应该是一样的。(规范化)
BlueprintReadOnly:设置变量只可读取不可修改
UPROPERTY(Category = "Student", BlueprintReadOnly)
FString StudentName;
去编辑器编译之后创建一个基于Student的蓝图类
之后在事件图表中,右键搜索Student,我们可以看到有一个Student Name,这里面的Student是代码中通过Category去设置的名字,由于设置了BlueprintReadOnly,所以只有获取Student Name,没有设置Student Name。
去代码中给Student Name一个默认值
UPROPERTY(Category = "Student", BlueprintReadOnly)
FString StudentName = "AddamHolmes";
然后重新编译一下
之后在事件图表新建一个获取Student的方法,然后新建一个Print打印字符串的操作,最后绑定在时间Tick上,这样就会每一帧输出一个获取到的名字。
同时需要添加一个MyStudentBP在游戏中去
然后运行
并且日志中也会有,在左上角窗口,通用,开发者工具,输出日志,就可以从控制台看到日志啦。
这样C++就会和蓝图进行交互。
(8)蓝图读写C++的变量
首先就是刚才是设置了StudentName为只读属性,现在需要修改为可读可写的属性
UPROPERTY(Category = "Student", BlueprintReadWrite)
FString StudentName = "AddamHolmes";
第二就是打印到日志里有很大的内存消耗,所以最好在输出字符串的时候把打印到日志给注释掉。
由于把只读改成读写,现在这里面就多了一个设置StudentName
编辑节点
运行之后就从打印AddamHolmes
变成打印我们在set里面设置的张三
了
(9)蓝图调用C++的函数方法
在Student.h中声明一个方法
UFUNCTION(Category = "Student", BlueprintCallable)
void study();
由于下载了番茄插件,右键study
创建实现
C++中声明在.h文件中,实现在cpp文件中(返回类型 类名::方法名(形参列表){方法的实现体})
void AStudent::study()
{
GEngine->AddOnScreenDebugMessage(-1, -15, FColor::Red, TEXT("我正在学习"));
}
引入一下GEngine的头文件,由于有番茄插件就很方便。
编译后然后去事件图表里面编辑一下,就会发现出现了这个Study的方法。
之后去运行一下
传中文会乱码,英文就不会有类似的问题
void AStudent::study()
{
GEngine -> AddOnScreenDebugMessage(-1, 5.0f, FColor::Red, TEXT("I am Study Now"));
}
(10)C++方法元数据的修饰方法
修改元数据显示的名字:meta
UFUNCTION(Category = "Student", BlueprintCallable,meta=(DisplayName="StudyTest"))
void study();
添加搜索关键字Keywords
每次再蓝图的输入框中搜索其实都是搜索关键字
UFUNCTION(Category = "Student", BlueprintCallable,meta=(DisplayName="StudyTest",Keywords="addam study"))
void study();
这个时候搜addam study也可以搜到StudyTest这个方法,当然,直接搜StudyTest也是可以的。
3:UE4项目及编辑器界面解读
3.1:项目结构
首先按照上面步骤创建一个UE4的项目,如创建C++项目,则蓝图C++都可以用,如创建蓝图项目,则只能使用蓝图。
项目文件如图所示
- Config -包含了项目设置,键盘输入之类的配置文件
- Content ― 存放引擎或游戏的内容,包括地图、贴图、模型、材质、蓝图等
- Intermediate -包含了在编译引擎或游戏时生成的临时文件
- Saved -包含了自动保存内容,配置 (*.ini)文件以及日志文件
- .uproject - 项目启动程序,开启我们的项目
3.2:初学者内容包介绍
最开始创建项目的时候可以勾选初学者内容包,如果没勾选项目中也可以手动添加
在初学者内容包中,可以在内容管理器中看到有如下几个文件夹
Architecture:一些建筑模型
Audio:音频
Blueprints:一些制作好了功能的蓝图
HDRI:美国官方高动态粒子贴图
Maps:几个默认的地图
Materials:接几个可能用到的材质,比如水、金属等
Particles:粒子特效,爆炸特效、火、烟、烟雾的特效
Props:小道具,椅子、门、门框之类的
Shapes:一些基本的几何体
Textures:一些基本的贴图
3.3:编辑界面介绍
UE4编辑器主界面(也称为关卡编辑器)主要用于构建世界场景和关卡以及放置资源。
菜单栏
关卡编辑器(Level Editor)工具栏
“模式”(Modes)面板
“模式”(Modes)面板显示各种编辑模式。通过该面板可以使用特定的编辑界面来编辑不同类型的Actor。
“内容浏览器”(Content Browser)面板
内容浏览器是在虚幻编辑器中创建、导入、组织、查看和修改内容资源的主要区域。它可管理内容文件夹,在资源上执行其他实用操作(如重命名、移动、复制和查看引用)。
内容浏览器可以搜索游戏中的所有资源并与之交互。
注:资源被放置到关卡中后,就会被称之为Actor.
“视口”(Viewport)面板
“视口”是你进入到虚幻中创建的世界场景的窗口。你可以像在游戏中导航那样来导航视口,或者可以像使用建筑蓝图进行方案设计那样来应用视口。
虚幻编辑器视口包含各种工具和查看器,可帮助你精确地看到所需数据。
主要哦有两种模式,正交模式(顶端、左端、低端等)和透视模式
在查看单页面时可以用快捷键Alt+数字切换不同的视图模式,视图模式和可视查看器可以提供对关卡状态的重要反馈。
- Alt+2:线框模式
- Alt+3:无光照模式
- Alt+4:正常带光照模式
- Alt+5:细节光照模式
- Alt+6:仅光照模式
- Alt+7:光照的复杂程度模式
- Alt+8:着色器复杂度,越红性能开销就越大
- Alt+0:光照贴图密度
与视图模式一样,显示标志可帮助直接在关卡视口中显示相关信息。例如,它们可用于显示
- Actor碰撞凸包
- 边界框
- 静态网格体
“世界大纲视图”(World Outliner)面板
世界大纲视图”(World Outliner)面板以层次化的树状图形式显示了当前关卡中的所有Actor。
类似于一个标签,展示场景中所有看得见看不见的东西
只需在“世界大纲视图”(World Outliner)面板中单击Actor的名称即可将其选中,选中的Actor属性将显示在“细节”面板中。
“细节”(Details)面板
细节面板可以对当前选中的Actor进行调整。
3.4:视口导航
(1)鼠标移动视口(不推荐)
鼠标左键:前进后退,或者左右移动视角
鼠标右键:视口旋转,上下左右移动视角
鼠标中键:上下移动
(2)键盘搭配鼠标移动视口(推荐)
键盘ws,前进后退
ad,左右移动
qe,镜头下降上升
键盘控制镜头移动再搭配鼠标右键的视角转换
键盘z,广角的缩放,键盘的c,广角的聚焦
重点:在操作键盘的时候一定要按住鼠标的右键,不然无法成功操作
功能按钮 | 操作 |
---|---|
F键 | 将视口摄像机聚焦到视口中选中的Actor上 |
Alt+鼠标左键+拖动 | 围绕单个的支点或兴趣点翻转视口。 |
Alt+鼠标右键+拖动 | 向前推动摄像机使其接近或远离单个支点或兴趣点。 |
Alt+中键单击+拖动 | 根据鼠标移动的方向将摄像机向左、右、上、下移动 |
3.5:UE4导入资源
资源类型 | 文件扩展名 |
---|---|
三维模型、骨架网格图结构、动画数据 | .fbx 、.obj |
纹理和图片 | .bmp 、.jpeg 、.pcx 、.png 、.psd 、.tga 、.hdr |
字体 | .otf 、.ttf |
音频 | .wav |
视频和多媒体 | .wmv |
PhvsX | .fbx 、.obj |
其他 | .scv |
导入可以在内容浏览器导入
也可以直接左键文件拖进来
导入资源:资源图标
内容浏览器中的资源图标让你不必打开就能预览大多数的资源。将光标悬停在图标上,会显示资源的相关信息。
- 资源图标左下角的小星号表示资源尚未保存。
- 导入的资源必须保存才能写入磁盘。
- .如果关闭编辑器,未保存的导入资源将消失。
- 按Ctrl+S保存所有资源,或右单击资源并选择“保存”(Save) 。
引用查看器
右键资源,打开引用查看器,就可以看到跟这个资源相关的一些蓝图,模型,材质,关卡等。
4:物体编辑
4.1:笛卡尔坐标系
要了解任何类型的三维内容创建,就必须了解三维坐标系——笛卡尔坐标系的用法。
- 笛卡尔坐标系是一种计算系统,使用该系统可以在给定区域或空间内生成信息或点。
- 3D平面使用x、y和z坐标。每个字母对应一个轴,其中z为上下方向,y为从左到右,x为从前到后。
- 所有3D图形都是通过绘制相对于特定值的单个点而生成
- 你可以使用一连串的这类交叉点,在点之间建立连接,从而创建形状或体积。你还可以使用这些点进行操作和移动,绘制3D空间中对象的位置和比例。
4.2:对物体进行处理变换
变换工具可以在UE4中的3D空间内操作或转换。变换有三种基本类型:
- 移动:点击物体之后按键盘W
- 缩放:点击物体之后按键盘R
- 旋转:点击物体之后按键盘E
除了用鼠标拉之外,还可以通过点击物体之后输入数值来进行精确变换,“细节”(Details)面板中的手动变换选项也具有相同的相关色方案。
并且选择了一个物体之后还可以选则坐标体系
4.3:单位和度量
了解用于在游戏世界场景中建立风格、背景和连续性的部分的比例和度量。
默认情况下,1个虚幻单位(uu)等于现实世界的1厘米(cm)。这是一个需要注意的重要细节,你应将其应用于设计和游戏的所有方面,以开发出相应的环境、角色、效果等。
默认情况下,玩家通常在游戏世界场景中高约6英尺;相当于180厘米,或180uu。为了满足项目的需要,你可以更改此默认值。但无论默认值是什么,你都可以将其用作基值来为所有其他Actor的大小建立情境。
4.4:网格对齐
可以在视图右上角选则网格对齐,选择每次移动某个物体或者旋转某个物体一次最小移动或旋转多少,同时也有缩放的对齐。
最右边(缩放的对齐的右边)就是调整摄像机的移动速度
4.5:枢轴点
静态网格体Actor和放置在关卡中的所有其他Actor都有一个枢轴点。
枢轴点是Actor的局部轴。构成Actor的所有组件都相对于Actor的枢轴点。
例如,构成3D模型的顶点、边缘和多边形在空间中都有自己相对于Actor枢轴点的位置。
当对Actor应用变换时,也会对Actor的枢轴点应用。
如果你的模型在3DMax中相对于000进行了偏移,那么导入到游戏中模型的坐标轴也会有偏移
也可以在UE4中改变模型的枢轴点,鼠标中键点击模型的枢轴点即可进行移动。
4.6:模型的框选和复制
Ctrl+Alt+鼠标左键可以对模型进行框选
点击模型的旋转、移动某一轴点击Alt即可对模型进行复制。
4.7:主流三维模型的导入
FBX格式和obj格式的共同点
它们都是三维通用模型格式,都支持三个点以上的面,都可以用在目前几乎所有主流的三维软件中
FBX格式和obj格式的大致区别
FBX中包含动画、材质特性、贴图、骨骼动画、灯光、摄像机等信息
OBJ中不包含动画、材质特性、贴图路径、动力学、粒子等信息
abc格式:
中文名称:蒸馏机 支持动画、粒子等! bake三维场景的模型、流体、动画、特效等数据
模型导入
导入有动画的就会变成骨骼网格体,导入没有动画的模型就会变成静态网格体
Datasmith
该插件可以导入模型到虚幻引擎中
4.8:BSP笔刷工具
BSP笔刷工具简介
BSP 画刷是虚幻的关卡构建中最为基本的工具
从理论上说,最好将 BSP想象为可以在关卡中进行填充并切除空间体积的东西。很久之前,BSP被用来作为关卡设计中的主要构建模块。但是现在,这个角色由静态网格物体来承担,相较而言,静态网格物体远为高效。
不过,作为关卡和物体的快速原型化产品的前期应用,以及对于那些无法使用3D建模工具而需要进行关卡构建的人来说,BSP依然很有用。
BSP笔刷工具的使用
在设置BSP笔刷工具添加模型时可以设置添加型还是减去型,添加型就是添加模型,减去型就是如果那一块有模型就减去。
添加型和减去型有对应的层级关系,先添加的减去型无法减去后添加的添加型模型,所以这个时候我们可以通过设置模型排序来使后添加的减去型排序提前。
可以在笔刷设置这里设置模型长宽高,这个时候这里的设置长宽高和鼠标去拉不一样,这里设置不会拉伸模型上的材质
并且也可以设置模型中空,这个时候可以设置模型墙壁厚度。
设置画刷的固体性
固体
固体画刷是画刷的默认类型。
- 阻挡游戏中的玩家和射弹。
- 可以是添加型或挖空型。
- 在周围画刷中创建 BSP分割。
半固体
半固体画刷指的是可以放置在关卡中且不会对周围的世界几何体创建 BSP分割的碰撞画刷
- 阻挡玩家和射弹,就像固体画刷一样。
- 只可以是添加型,绝对不可以是挖空型。
- 不会在周围画刷中创建 BSP分割(就是不会被挖空型影响)。
非固体
非固体画刷指的是在周围世界几何体中也不会创建BSP分割的非碰撞画刷。它们具有可视化的效果,但是使用任何方式都无法与它们互动。它们具有以下属性:
- 不会阻挡玩家或射弹。
- 只可以是添加型,绝对不可以是挖空型。
- 不会在周围画刷中创建BSP分割。
保存为静态网格体
我们如果搭建了一个场景可以选择所有的画刷,比如说我这里创建了一个房子的模型
我们可以按照下图步骤打包
4.9:静态网格体的碰撞设置
静态网格体就是模型,本质是没有碰撞的,这个时候我们需要给他设置碰撞
在4.25版本中的设置:1双击击需要使用的静态网格,此时右中部屏幕出现“细节”栏;2.在“细节”栏中找到“静态网格体”,然后双击"静态网格体"右边的图片,就会弹出一个窗口
选中碰撞,碰撞复杂度的第四个选项
然后这个模型(静态网格体就变成可碰撞的了)
5:蓝图
5.1:关卡蓝图控制自动开门
(1)添加一个门
初学者材质包中的门添加到场景中
双击门静态网格体打开门的设置界面,添加一个盒体的简化碰撞模型,可以修改一下碰撞体的厚度,这个绿色的框就可以阻挡人物进入。
(2)添加一个盒体触发器
添加一个盒体触发器并设置其位置大小。
(3)把互动的逻辑撰写到关卡蓝图中
关卡蓝图:关卡蓝图一般是写一些场景中的互动
事件:我什么时候要进行什么动作
首先先给门的移动性改成可移动的。
之后选择触发盒子,并且在工具栏的蓝图那边打开关卡蓝图。
在蓝图中因为有一个触发盒子了,所以就有一个Trigger Box 1,为Trigger Box 1添加事件,添加碰撞中的开始碰撞(进入盒子,也就是开门)和结束碰撞(离开盒子,也就是关门)。
出去之后点击门,然后再返回这个事件图表页面,右键添加一个对SM Doar的引用
之后右键SetActorRotation
这是一个修改Actor角度的方法。
设置一下触发控制的目标(门),设置一下触发的事件(人物进入盒体触发器),设置一下出发的效果(目标z轴转90度)
但是现在会有点问题,一接近秒变90度,贼生硬,这个时候可以用时间轴节点进行过度
可以搜索节点时间轴
。
设置一下时间轴,点击f+新建轨道,然后添加两个关键帧,最后设置一下时间轴长度。
效果挺好的。
5.2:Actor类编写蓝图
(1)Actor类编写蓝图实现走进自动开关门
第二节解释过Actor
在内容管理器里选择一个你喜欢的位置,右键新建一个蓝图类,点击Actor蓝图类,然后修改一下这个蓝图类的名字叫Doar_OpenClose
双击蓝图点击添加组件 → 添加静态网格体 → 设置静态网体的为SM_DoorFrame,这个是门款
点击添加组件 → 添加静态网格体 → 设置静态网体的为SM_Door,这个是门
和之前关卡蓝图一样这里也需要添加一个盒体触发器,这里的盒体触发器叫Box Collision
所以点击添加组件搜索Box Collision
,这里面需要注意的就是需要把该Box Collision和门设置为同一级,如果该触发器是门的下级,那么他就会随门的转动一起转动,这并不合理。
最后设置一下Box Collision
的方位宽高之类的就可以啦
之后设置一下事件图表
在设置事件图表时我们要分清楚什么是绝对坐标什么是相对坐标
在UE4中有三种旋转
SetActorRotation
:对整个蓝图的所有组件进行相对于世界坐标系下的角度旋转
SetRelativeRotation
:对蓝图中某一组件进行相对于自身蓝图的相对坐标系下的角度旋转
SetWorldRotation
:对蓝图中某一组件进行相对于世界坐标系下的角度旋转
像这里面我们需要设置相对旋转,SetRelativeRotation
(2)设置人物走进之后按E打开门
Gate节点
Gate节点直译为门节点,所以它的作用也显而易见。门打开,事件可以用通过,门关闭,事件也就无法进行。门的开启关闭分别对应节点中的open,close。Toggle和FlipFlop作用相似,循环切换开关门逻辑。Start Closed默认是勾上的,意思Gate节点开始是关闭的,可以通过Open,Toggle打开。
修改之后的蓝图如下:
搜索键盘
即可找到E节点。
但是现在还是没有什么作用,因为我们没有开启玩家的键盘输入功能
Enable Input
为启用键盘输入
Disable Input
为结束键盘输入
Get Player Controller
修改控制器为Enable Input
和Disable Input
这个时候效果如下:
按E门会启动
但是门不会自己关闭了
那怎么让门按一下E自己打开,按一下E自己关闭呢
Flip Flop
:这个节点就是类似于,第一下和第二下执行不同的事情,并且来回交替,连好后的蓝图如下所示:
(3)通过鼠标点击门实现开关门
本质就是把E换成鼠标点击嘛
点击蓝图组件页面的Doar,右边细节 → 点击时。
之后修改事件图标
但是这个时候鼠标还是没有用上,因为打开之后界面没有鼠标,我们需要设置一下,窗口 → 世界场景设置 → 在游戏模式中选一个游戏模式,之后新建一个玩家控制类
把该玩家控制类的属性修改一下,把显示鼠标光标和启用点击事件打勾即可。
效果还是很不错的
我们也可以移动到门之前鼠标显示,否则鼠标隐藏
点击获取玩家控制器的Return Value拉一根线出去,输入Shoe Mouse Cursor,并且设置接近就显示,离开后就不显示
然后记住一定要把默认的显示鼠标光标给取消勾选。
(4)捡钥匙开门
这个可以让我们了解蓝图通信
首先就是需要两个Actor,门和钥匙
门还是按E开门,但是减了钥匙就开门,没减钥匙就不开门。
所以在门的事件图表中加一个组件是否可以开门
的布尔变量
就是按E变成了按E进行是否可以开门的布尔判断,判断成功才进入下一步,判断为否就输出“小兄弟,你没有钥匙”,门的蓝图如下,模型还是之前一样的模型
之后设置钥匙逻辑,由于是否可以开门
的布尔值默认为folse,所以我们需要捡到钥匙之后修改为true,并且接到钥匙之后把钥匙组件给删除掉(捡到了就没了)
首先钥匙模型如下
蓝图如下:
最重要的就是这一块
获取所有类的Actor,这个是获取一个数组,里面有所有类的Actor。由于我们这里除了钥匙本身其实就是一个组件,所以就get(0),然后set是否可以开门的属性改成true,之后再销毁组件。
5.3:蓝图通信
(1)蓝图通信概念
蓝图通信
蓝图通信是一种用于蓝图之间数据通信的方式,可以在一个类中获取到另一个类的方法和属性,两个类产生了一些联系,那么一个类就可以更改另一个类的属性。
就是两个或多个类产生联系发生关系。
事件
比如之前的触发事件碰撞检测事件等,这些都是系统自带的事件,类似于本能
自定义事件
但是自定义事件就是我们自己定义的事件,我们可以给这个事件取一个名字,也需要自定义触发事件和触发之后执行的内容。
类型转换
如果你需要获得你要更改的另外一个类里面的变量和数据,或者希望和另一个类发生关系,那么你就需要类型转换就是到对应的对象。
类型转换除了用来蓝图通信之外还有一个用处,就是判断是谁触发了这个触发事件,并且后面可以接ThirdPersonCharactor的事件。
(2)自定义加速事件
添加自定义事件
先双击点开ThirdPersonCharactor的编辑,新建一个图表取名触发加速
在里面添加一个自定义事件添加自定义事件
,并且取一个不那么离谱的名字“触发加速_Event”
那怎么设置加速呢
可以在右边看到有一个CharactorMovement,里面1有一个最大行走速度的设置,由于UE4中1等于1cm,所以现在其实初始值是6m/s,我们可以改成300,也就是3m/s
也可以在蓝图中修改
但是我想在其他蓝图修改这个,这个时候就需要多连一条
(3)实现触发加速
在加速盒子中调用自定义事件
5.4:变量引用(提升为变量)
(1)概念
当一个类里面的函数比较多,并且使用比较频繁的时候,就要不断的从这个类节点往外拉线,从而获取不同的函数节点,这样的蓝图就会看起来比较乱,这时候,就可以将这个常用的类提升为变量。
提升为变量的方法:
示例:按住第三人称角色的蓝色输出节点,往外拉即可看到“提升为变量”
也可以理解为,创建了一个变量,然后将第三人称角色类放入到了这个变量中。
有效性:判断当前的这个变量引用是不是有效的。
(2)实现物体自转
AddLocalRotation为添加本地旋转
设置一个是否可以旋转的变量,并设置初始值为Flase,也就是一开始不可以转动
接着要添加自定义事件,自定义事件的作用是来更改这个布尔值什么时候是对的什么时候是错的。
接下来就是调用这个,在小白人身上创建一个蓝图,创建一个变量并且设置变量类型为自转_BP(刚才自转蓝图的名字,非自转的方法名)
调用自我旋转的变量,现在他已经是自转蓝图的变量引用了。先isValid
判断这个变量是否是有效的。之后如果是有效的那就调用控制旋转的方法,如果是无效的就输出字符串引用变量无效
运行之后会发现会输出无效,因为我们没有给这个小白人绑定到底是控制哪一个自转_BP
先把调用自我旋转的引用变量给点成公有变量,并且点完之后需要编译一下
之后在视图窗口中点击小白人之后会多一个属性
选成我们需要控制的对象,这个对象需要是英文名。
5.5:Get All Actor的顺序
在使用Get All Actor的时候需要先选则再获得,就是现在Actor Class底下选则类之后再用get n的方式选则第n个。
5.6:和关卡蓝图进行通信
(1)新用到的蓝图节点和组件
1)执行控制台命令
在Command里面输入ce 事件名称
,使得其他蓝图也可以调用关卡蓝图的事件。
2)For Each Loop With Break
这是一个可以中断的循环
3)设置可见性
可以设置模型、灯光、粒子是否可见
4)TextRander
文本渲染组件,可以理解成一个快速创建的3DUI,但是可拓展性不强,之后还是要使用UM6功能
(2)设置探险关卡
1)设置会提示的门
整体蓝图如下:
蓝图解释如下:
之后的逻辑还是很简单的,给门加个90度旋转的关卡蓝图并设置为自定义事件
之后用刚才说的控制台命令调用这个事件即可
5.7:多角色控制权切换
(1)使用MultiGate
进行多角色切换
首先把游戏模式设置为ThirdPersonGameModel
,在世界场景的游戏模式中,找到游戏模式重载选则ThirdPersonGameModel
。
在游戏中添加五个小人,并把五个小人拖入关卡蓝图
接下来我们使用一下之前使用过的Gate的升级版MultiGate
视角切换的关卡蓝图
获取玩家控制器
加控制
加对象
可以实现把玩家切换到固定对象上,
最核心的就是键盘 1
加上MultiGate
,这个作用就是按1进行调用某一个引脚
上面添加了五个引脚,分别对应了切换成模型小人1~5,MultiGate各个输入解释如下:
Reset
:后面可以接重置之后的函数,就是比如现在,熊Out0到Out4走了一轮之后执行的函数
Is Randomm
:是否随机,点上之后就随机执行,可能Out0下一个是Out1234的任何一个值,但是还是会一轮一轮得执行,即一轮之后Out0~Out4均执行有且只有一遍
Loop
:是否循环,点上之后执行Out0~Out4之后继续回到Out0
Start Index
:开始下标,就是第一个执行这个是输出哪个引脚
之后我们需要把第一个小人小人0设置为玩家0,然后由于Start Index = 1,所以点一下就切换到第2(下标1就是第二个)个小人1,之后点到最后一个再点一下由于Loop打了钩,就会继续回到第一个小人0。
(2)优雅地实现切换过渡
优雅永不过时
学一个新的节点使用混合设置视图目标
,必须用玩家控制器连线才找得到。
里面的内容解释如下:
New View Target
:我们要转去的目标是哪一个蓝图
Blend Time
:时间,转场时间
Blend Func
:转场模式,比如线性或者先快后慢之类的。
比如说按一下1从小人1慢慢换到小人2上
就是一旦调用了控制视角就会马上切过去,所以混合设置视图目标之后需要加一个延迟,延迟时间和混合设置视图目标的Blend Time一样。
但是这个时候有两个问题,一是如果用户手剑,不停按1,前一个视频还没播放完就接下一个会出问题,所以我们需要加一个全局变量切换是否完成
来限制一下用户的手剑行为。
设置切换是否完成
为false,之后分支判断后切换为true
然后控制完再变成false
再就是这个操作太多了,如果剩下的四个角色都这样连蓝图的可读性会很差。
但是这个不能封装成函数,函数中不能有任何时间相关的节点,也不能有任何流程控制的节点。
不过对于一个玩家要加切换,下面红色的部分都是固定的,又不能封装函数。
不过可以框选右键,折叠到节点或者折叠到宏。比如右键折叠到节点之后,上面那四个节点就变成了一个节点。
然后复制四份连连线,这样蓝图可读性就会很好,看起来也舒服很多
折叠到节点之后其实每次复制都是真的复制一份这四个,可以看到每次复制之后都需要重命名,但是如果折叠到宏那就是每次复制都是复制其调用,这一批节点其实就一个。
6:UE4集成Cesium for Unreal
Cesium for UE4插件解锁了虚幻引擎中的3D地理空间生态系统。通过将高精度全尺寸WGS84 globe、开放API和空间索引开放标准(如3D图块)以及基于云的真实世界3D内容与虚幻引擎的强大功能相结合,我们将能够使用游戏引擎创建利用真实世界内容的地理空间应用程序的新时代。
6.1:获取Cesium for UE4 插件
- 先安装UE4引擎,需要4.26及以上的,我之前用的是4.25.4,现在需要换成4.26.2。
- 插件地址:Cesium for Unreal in Code Plugins - UE Marketplace (unrealengine.com)
- 登录epic账号,点击页面中的Free之后再点击在启动浏览器打开,就会自动启动Epic Games Launcher。
- 下载这个插件即可
6.2:使用&加载插件
创建好一个游戏项目
加载该插件
进入到程序,转到 编辑-> 插件
并在插件窗口右上角的插索栏中搜索"Cesium",确保选中插件的启用复选框
在编辑→项目设置→自动曝光
来修改曝光
然后把初始场景中的所有对象都删除
Ctrl+S保存关卡,取一个名字cesium
打开菜单编辑->项目设置,再选择项目->地图和模式。将编辑器开始地图和游戏默认地图设置为刚创建的关卡cesium。这样可以确保在重新启动虚幻编辑器时自动重新打开您的关卡。
6.3:添加SunSky照明和DynamicPawn
在内容管理器右下角→视图选项中打钩显示引擎内容和显示插件内容
在内容中搜索CesiumForUnreal以打开CesiumForUnreal内容
CesiumSunSky蓝图给室外场景增加了炫酷的天阳光照明,它扩展了内置的SunSky蓝图,让它跟真实地球上的太阳光一模一样。
添加Cesium的太阳光,一定要用Cesium的不能用自己的太阳光。
同样,Cesium的DynamicPawn扩展了内置的DynamicPawn,使其能在地球上任意移动,并允许使用鼠标滚轮控制移动速度,特别是距离地面很远时非常有用(用键盘WSAD前后左右移动,鼠标控制方向,滚轮控制移动速度)。
当视角在Cesium地球上方的不同位置之间飞行时,照相机应遵循与地球表面平行的弯曲路径,而不是线性的点对点飞行轨迹。Cesium的FloatingPawn就是做这个用的,它确保你从地球的一边飞到地球的另外一边时,向上的方向始终从地球的球心指向天空(直观的理解就是:因为地球是园的,不是平的,所以虚幻引擎默认的相机移动方式就不行了)。
在此之后需要设置玩家为玩家0
6.4:连接到Cesium ion并创建一个地球
点击Connect按钮,连接到Cesium ion。这时浏览器会自动打开,要求您允许Cesium for Unreal使用Cesium ion中当前登录的帐户访问您的资产:
通过单击工具栏中的Cesium按钮来打开Cesium面板。在Quick Add中,单击Cesium World Terrain + Bing Maps Aerial imagery右侧的加号(可以随意添加其他Cesium World Terrain + imagery组合之一)。 、
此步骤将在世界大纲视图中生成新的Cesium World Terrain和CesiumGeoreference蓝图对象。
如果场景太暗,请调整CesiumSunSky对象上的Solar Time属性,比如设置一个美丽的日落场景。您可能还想更改时区Time Zone。
6.5:Cesium for Unreal添加倾斜摄影模型
第一步:创建一个项目和关卡并从Cesium ion添加墨尔本倾斜摄影模型
现在Asset Depot | Cesium ion 添加Melbourne Photogrammetry
之后在UE4编辑器中添加Melbourne Photogrammetry
在世界大纲视图面板中双击Melbourne Photogrammetry墨尔本倾斜摄影Actor,将编辑器视角跳转到墨尔本。
你可能会发现上下颠倒了,刚添加的墨尔本倾斜摄影模型飘在头顶了。
第二步:让墨尔本在虚幻引擎的世界中居中显示
虚幻编辑器里相机的+Z方向始终是朝上的,以地球为中心的坐标系中的向上方向会根据您在地球上的位置而变化
倾斜摄影模型本身有经纬度信息,当你把倾斜摄影模型添加到关卡后,Cesium for Unreal会自动调整倾斜摄影模型的位置和旋转,让他贴着地球表面;当你从地球的某个地方移动到墨尔本时,镜头的位置变了,但是向上的方向还是以前的,如果你从美国移动到中国,你会发现上下颠倒了。
世界大纲视图面板中点击CesiumGeoreference-1。
在细节面板中,单击Place Georeference Origin Here按钮。
然后墨尔本就显示正常了。如果场景变黑,可能是因为现在的时间是墨尔本的夜间。调整调整CesiumSunSky对象上的Solar Time属性。
Place Georeference Origin Here按钮不仅改变了方向。如果仔细观察,您可能会注意到按下按钮时按钮下方的经度、纬度和高度属性也发生了变化。确切地说,该按钮重新定位了虚幻引擎关卡的坐标系,以使其中心点(0, 0, 0)恰好位于相机的位置。并且对齐了虚幻引擎的坐标轴,使+X指向东方,+Y指向南方,+Z指向上方。
也可以直接输入经度Longitude,纬度Latitude和高度Height值,在地球上精准定位。
将世界坐标原点定位在某个地方可能非常有用。因为虚幻引擎中的许多东西(相机、植被和物理特性)都应该设置为相对较小的值,且+Z朝上。通过以这种方式经纬度映射georeferencing到虚幻的世界坐标系,我们就可以将普通的虚幻引擎对象放置在墨尔本及其周围,并且像在其他任何游戏中一样对他们进行操作。
6.6:加载本地3Dtiles
(1)加载本地3Dtiles
再已经构建好的地图上添加Blank 3D Tiles Tileset
,这步操作将往场景中添加一个新的、空白的Cesium3DTileset Actor。 之后世界大纲视图就会出现这个,改个名字,我的是改成AddamTileset
双击再细节页面就会出现详细信息
Source
改成From Url
下面Url改成本地文件地址,我的是
D:\GameProject\MyModel\nantaizihu\tileset.json
就得改成file:///D:/GameProject/MyModel/nantaizihu/tileset.json
在细节面板中调整LocalTileset的位置Location,将其放置在需要的地方。例如,要将3D Tileset贴在地形上,请将Location的Z坐标更改为7400。
接下来在世界大纲视图中找到CesiumGeoreference
,双击细节面板上点击Place Georeference Origin Here
,这个会校准我们的世界起始位置的经纬度,并且把相机DynamicPawn的位置重置为(0,0,0)
目前Cesium for Unreal不支持加载本地quantized-mesh地形文件。但是,可以从任何服务器(包括本机localhost)加载地形资产。要完全离线加载地形资产,请考虑设置本机localhost地形服务。可以使用与上述相同的步骤,用http://localhost:portNumber/terrainAsset设置Url属性。
(2)使用制图多边形隐藏切片集的某些部分
现在虽然3Dtiles加上了,但是会有问题,类似于这种地方其实是Cesium初始地球地形穿模导致,这个时候我们可以使用制图多边形隐藏切片集的某些部分。
首先添加和塑造多边形
参与者添加到关卡。您可以通过在“放置Actor”面板中搜索并将其拖动到关卡中来查找该Actor,或者只需单击一下即可从“Cesium快速添加”面板中添加它。
该执行组件看起来像一个方形样条,在闭合环中具有四个控制点。目前,样条曲线只能是线性的,并且不允许使用曲线。这样可以更快地进行栅格化。
可以选择一个点移动该点位置,要移动其中一个点,请在视口中单击该点以选择该点。使用变换小控件更改其位置。
若要添加新点,请按住键盘上的 alt 键,然后在按住 alt 键的同时移动一个点。将创建一个新点。也可以右键单击样条线点,然后选择“重复点”。 Alt+鼠标左键选择一个点,之后复制一个点,然后四边形就变成五边形了。
让这个和模型边缘贴合(因为模型部分就不需要加载Cesium地球底图了),在和模型契合的时候可以把这个线换个颜色。
要删除某个点,请右键单击该点,然后选择“删除点”。
创建多边形的更多提示和技巧:
- 制图多边形是 2.5D 的,因此它将影响样条点下方和上方的所有内容。因此,它不适用于垂直剪裁,例如切掉建筑物侧面的窗户。样条点的精确 Z 位置无关紧要,只有 X 和 Y 位置才重要。
- 为了最精确地放置多边形,请尝试使样条点尽可能靠近切片集的表面。
- 您可以在“详细信息”面板中更改样条曲线的颜色。查找**编辑器“未选择的样条线段颜色”**参数。
之后将多边形连接到切片集
选择自己想要去除该部分的蓝图,我选择的是Cesium World Terrain(Cesium的地球地图)
点击添加组件搜索Cesium Polygon Raster Overlay
给这个Cesium Polygon Raster Overlay
添加一个Polygon并设置为刚才的Blank 3D Tiles Tileset
。
最终效果就完成啦。
6.7:去除Cesium的logo
这个Cesium的logo一运行就会有
我们找到CesiumCreditSystemBP
,编辑蓝图
在细节面板搜索Credits Widget Class,改成none。改了之后由于没有这个了Cesium会出点问题,但是不影响整体运行。
7:用户界面UI设计
7.1:添加一个图片到界面上
在一个内容管理器里面挑选一个文件夹,右键 → 用户界面 → 控件蓝图
这个长方形就是我们电脑的屏幕,在这个上面怎么摆UI运行之后就是怎样的界面
现在内容浏览器导入一张图片
之后打开刚才创建的控件蓝图在左边的控制板中找到通用 → 图像
,拖到界面中去。
我们可以拖动拉大拉小,也可以用数值修改位置之类的。
右边上角的那个菊花叫做锚点,就是当我们的界面缩放之后图像要像那个方向进行靠拢,右下角那个点了,并且把x,y,偏移等全部归零,那就是让界面永远保持图片全屏。
可以在外观→笔刷→图像
里把图片样式做一些修改,可以直接把内容管理器的图片拉进来
之后回到关卡蓝图中,创建一个Even BeginPlay
的事件开始运行的节点,之后后面连接一个只要是创建UI必须用到的create widget
创建控件的控件,Class里面选中我们新建的UI,之后我们需要一个节点add to viewport
,把这个UI添加到界面上
可以看到效果如下:
后面还有什么再写续集