UE4入门笔记
打开一个第三方项目
选择more options
选择skip conversation
重新build
基础
蓝图
蓝图class
https://blog.csdn.net/JennyBi/article/details/79872767
你需要指定该蓝图的Parent Class(父类) 选择继承父类,允许你在自己的蓝图里面调用父类创建的属性。
下面是你创建蓝图是最常见的父类:
Actor 一个可以在世界中摆放,或者生成的Actor。
Pawn Pawn是一个可以从控制器获得输入信息处理的Actor.
Character 角色是一个包含了行走,跑步,跳跃以及更多动作的Pawn.
PlayerController 角色控制器
Game Mode 一个Game Mode 定义了游戏是如何被执行的,游戏规则,如何的分以及其他方面的内容。
添加动作类Add Actor Class
在contentbrowser C++库处右键,并选择新的C++类。
选择父类 Actor class。
输入名字并选择类的位置。
添加刚体mesh
- 创建CreateStaticMesh动作类。
- CreateStaticMesh.h
#pragma once
#include "CoreMinimal.h"
#include "GameFramework/Actor.h"
#include "CreateStaticMesh.generated.h"
UCLASS()
class UNREALCPP_API ACreateStaticMesh : public AActor
{
GENERATED_BODY()
public:
// Sets default values for this actor's properties
ACreateStaticMesh();
protected:
// Called when the game starts or when spawned 开始或者调用时候
virtual void BeginPlay() override;
public:
// Called every frame每一帧被调用
virtual void Tick(float DeltaTime) override;
**// 添加属性UPROPERTY 到任意地方可视化-->使我们可以在编辑器里轻松添加mesh。**
UPROPERTY(VisibleAnywhere)
**//头文件添加UStaticMeshComponent 实例化为supermesh**
UStaticMeshComponent* SuperMesh;
};
- CreateStaticMesh.cpp
利用CreateDefaultSubobject 创建新的 UStaticMeshComponent,返回名为SuperMesh的mesh。
SuperMesh = CreateDefaultSubobject<UStaticMeshComponent>(TEXT("My Super Mesh"));
最后的cpp代码
#include "CreateStaticMesh.h"
// Sets default values
ACreateStaticMesh::ACreateStaticMesh()
{
// 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;
// Add static mesh component to actor
SuperMesh = CreateDefaultSubobject<UStaticMeshComponent>(TEXT("My Super Mesh"));
}
// Called when the game starts or when spawned
void ACreateStaticMesh::BeginPlay()
{
Super::BeginPlay();
}
// ::Tick(float DeltaTime)每一帧被调用Called every frame
void ACreateStaticMesh::Tick(float DeltaTime)
{
Super::Tick(DeltaTime);
}
在编辑器里面,把新建的actor托到里面。在右侧详细参数内,选择static mesh添加到actor上。
添加Component
添加一个 Billboard Component 到actor.h
继承UBillboardComponent 类, 允许添加billboard component 并可以使用其分布attributes(?)
class UBillboardComponent* MyBillboardComp;
AddBillboardComp.h
#pragma once
#include "CoreMinimal.h"
#include "GameFramework/Actor.h"
#include "AddBillboardComp.generated.h"
UCLASS()
class UNREALCPP_API AAddBillboardComp : public AActor
{
GENERATED_BODY()
public:
// Sets default values for this actor's properties
AAddBillboardComp();
protected:
// Called when the game starts or when spawned
virtual void BeginPlay() override;
public:
// Called every frame
virtual void Tick(float DeltaTime) override;
// declare point light comp
UPROPERTY(VisibleAnywhere)
class UBillboardComponent* MyBillboardComp;
};
.cpp文件
# 如果想添加component 在cpp文件中要include头文件。
#include "Components/BillboardComponent.h"
建立一个billboard元件的子物体
MyBillboardComp = CreateDefaultSubobject<UBillboardComponent>(TEXT("Root Billboard Comp"));
设定可不可见
MyBillboardComp->SetHiddenInGame(false, true);
设定rootcomponent为我的元件,不知道干什么用?
RootComponent = MyBillboardComp;
.cpp文件
#include "AddBillboardComp.h"
// include billboard comp
#include "Components/BillboardComponent.h"
// Sets default values
AAddBillboardComp::AAddBillboardComp()
{
// 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;
MyBillboardComp = CreateDefaultSubobject<UBillboardComponent>(TEXT("Root Billboard Comp"));
MyBillboardComp->SetHiddenInGame(false, true);
RootComponent = MyBillboardComp;
}
// Called when the game starts or when spawned
void AAddBillboardComp::BeginPlay()
{
Super::BeginPlay();
}
// Called every frame
void AAddBillboardComp::Tick(float DeltaTime)
{
Super::Tick(DeltaTime);
}
小项目
入门小项目1—利用蓝图创建香蕉旋转(蓝图,材质,贴图,视图,节点)
建立一个蓝图项目
下方有三个选项:
Target Hardware: 选择 Mobile/Tablet 会关闭一些后期处理效果。还会用鼠标模拟触摸。设置为 Desktop/Console。
Graphical Target: 选择 Scalable 3D or 2D 会关闭一些后期处理特效。请设置为 Maximum Quality。
Starter Content: 使用这个选项可以包含一些开始内容。为了简单起见,这里将它设为 No Starter Content
1.内容浏览器: 显示所有项目文件。用它创建文件夹并组织文件。
2.Modes: 各种工具比如 Landscape 工具和 Foliage 工具。默认工具是 Place 工具。它允许将各种对象比如灯光和相机放到游戏关卡中。
3.世界大纲编辑器: 当前关卡中的所有对象。你可以通过将相关的对象放入文件夹中来组织整个列表。
4.详情: 你选中的对象会在这里显示出属性。这里可以编辑对象的设置。这里进行的修改只会影响这个对象的实例。例如,如果你有两个球体,如果你改变了其中一个的大小,那么只会对你选中的对象有效。
5.工具栏: 包含各种功能。你用得最多的一个就是 Play。
6.视口: 关卡视图。按下右键拖动鼠标可以查看四周。按下右键,用 WASD 键进行移动。
导入模型以及贴图
https://koenig-media.raywenderlich.com/uploads/2017/01/UnrealBanana.zip
下载 Banana_Model.fbx 和 Banana_Texture.jpg文件。利用内容浏览器导入他们。
导入fbx时会进行设置:确保 Import Materials 未选中,因为你会创建自己的材质。其他不变。
现在把香蕉拖入世界窗口中。
关卡中的对象是可以
移动、旋转和缩放:
快捷键分别是 W、E 和 R
创建添加材质
材质包括:
基本色: 颜色或纹理。添加细节和色彩。
金属化:表面和金属的相似度。通常,纯粹的金属拥有的金属化值是最大的,而织物的金属化值为 0。
高光:非金属表面的发光。例如,陶瓷拥有较高的高光值,而黏土则相反。
粗糙度:粗糙度最大时,没有任何高光。用于岩石或木头的表面。
要创建材质,在下方内容浏览器,点击绿色的 Add New 按钮。创建的 assets。点击 Material。
将其重命名为banana_material,并双击打开。
材质编辑器
材质编辑器由 5 部分组成:
1. 图(graph): 这个区域包含所有节点和结果节点。按下鼠标右键并移动鼠标可以平移。滚动鼠标滚轮可以进行缩放。
2. 详情: 这里显示选中节点的属性。如果没有选择任何节点,这里会显示材质的属性。
3. 视口: 包含一个预览的网格,显示你的材质。要转动相机可以按住鼠标左键并移动鼠标。要缩放可以用鼠标滚轮。
4. 调色板:一个列表,列出材质所有节点变量。
节点
节点构成了材质的主体。有许多不同的节点,提供了不同的功能。
节点可以有输入和输出,用一个圆圈+一个箭头来表示。输入位于左边,输出位于右边。
材质有一个特殊的节点,就是结果节点,在 Banana_Material 中它是现成的。它是所有节点的终点。一旦你接通这个节点,就可以决定材质的最终显示。
节点:
结果节点:
添加材质
一个纹理就是一张 2D 图片。TextureSample 节点允许你在材质上使用贴图。
在右侧的调色板,找到 TextureSample。按下鼠标左键,将它拖到中间的“graph”窗口。
然后,在左下方的detail里面texture选择banana_texture.
然后把texture sample 白色输出节点连接到base color上 —> 可以在左上方窗口预览贴图。
点击工具栏上的 Apply 按钮,应用你的材质。然后关闭材质编辑器——这部分的工作结束了。
然后点击模型,把banana_material拖到模型材料上。
蓝图
计划放置一个圆桌在场景里,让香蕉在圆桌上旋转。
简单讲,一个蓝图(Blueprint)表示一件”东西“。蓝图允许你为对象创建自定义行为。对象可以是某种物体(比如圆桌),也可以是某些抽象的东西比如生命系统
想制作一辆会动的车吗?构建一个蓝图。一只会飞的猪呢?使用蓝图。一只在碰撞中爆炸的小猫?还是蓝图。
就像材质一样,蓝图使用了节点系统。这意味着你只需要创建节点然后将它们连接起来,不需要编写代码!
在下方内容浏览器,点击 Add New。在列表中选择 Blueprint Class。弹出一个窗口,让你选择父类。你的蓝图会从父类继承所有的变量、函数和组件。
( 注:Pawn 和 Character 也是 Actor 类,因为你可以放置和生成它们。)
因为圆桌只会待在一个地方不动,Actor 类最适合。选择 Actor 然后给文件命名为 Banana_Blueprint。并双击打开。
在蓝图编辑器中,上方选择 Event Graph 标签页。
蓝图编辑器有 5 个主要的窗口:
1.组件窗口:当前组件的列表。
2.我的蓝图:用于管理你的图形、功能和变量。
3.详情窗口:显示当前选中对象的属性。
4.图形窗口:这是关键。所有节点和逻辑都在这里。按下右键并拖动鼠标进行平移。滚动鼠标滚轮进行缩放。
5.视口:任何拥有可视化元素的组件都在这里显示。你可以用主编辑器一样的方式移动和旋转。
通过组件,创建圆桌
要创建圆桌,需要两个东西:一个基座和一个陈列品。你可以通过组件来创建这两个东西。
组件
如果一个蓝图是一辆车,那么组件就是组成车辆的构件。例如,车门、轮胎、引擎都是组件。
但是,组件不仅仅限于物理对象。
例如,要让车动起来,你需要添加一个移动组件,你甚至可以为它添加一个飞行组件让它飞起来。
添加组件
从上方切换到视口视图viewpoint,
圆桌用到了两个组件:
Cylinder: 一个简单的白色圆柱体。这是放置香蕉的底座。
Static Mesh: 这个组件用于显示香蕉网格。
要添加底座,找到组件面板。点击 Add Component 并选择 Cylindar。
快捷键R,然后可以缩放z方向的大小。
左上角add component添加网格。回到组件面板,在空白地方点击左键,清除对圆柱体的选中状态。这能保证接下来的组件不会附加在圆柱体组件上
(注:如果不这样做,接下来的组件会附加在圆柱体上。这意味着它会继承圆柱体的 scale 属性。因为你缩短了圆柱体,那么接下来的组件也会被缩短。)
添加static mesh, 在detail里面选择banana模型以及选择材料为banana material.
利用蓝图节点,实现转动圆桌
接下来让圆桌旋转。这就要用到蓝图节点了。
和材质节点不同,蓝图节点拥有特殊的 pin 叫做 Execution pin。位于左边的 pin 是输入,位于右边的则是输出。所有节点至少有一个输入/输出。
如果节点有一个输入 pin,它前边必定有一个连接才能执行。如果有一个节点没连接,那么后续的任何节点都不会执行。
在开始之前,看一眼组件面板。你会看到 Cylindar 和 Static Mesh 有缩进而 DefaultSceneRoot 没有缩进。这是因为前者是附加到 DefaultSceneRoot 上的。如果你移动、旋转或缩放 root 组件,那么它包含的组件也会有同样动作。通过这种方式,你可以让 Cylinder 和 Static Mesh 一起旋转,而不是分别旋转。
创建节点
要开始编写脚本,需要进入 Event Graph 标签页。
让某个对象旋转非常简单,只需要创建一个节点。在 graph 视图空白地方右键,打开有效的节点菜单。搜索 AddLocalRotation。因为你需要旋转底座和香蕉,你只需要旋转 root 组件即可。选择 AddLocalRotation(DefaultSceneRoot)。
注:如果没有列出这个节点,请反选菜单右上角的 Context Sensitive 选项。
在 graph 窗口中会多出一个 AddLocalRotation 节点。Target 输入会自动连接到你选择的组件。
要设置旋转角度,找到 Delta Rotation 输入,然后修改 Z 值为 1.0。这将导致蓝图沿 Z 轴旋转。值越大,转速越快。
要不断地旋转,你必须逐帧调用 AddLocalRotation。要逐帧调用,需要使用 Event Tick 节点。它已经在你的 graph 视图中了。如果没有,用前面一样的方法创建一个。
将 Event Tick 节点的输出 pin 拖到 AddLocalRotation 节点的输入 pin。
最后,点击工具栏上的 Compile 按钮,更新你的蓝图,然后关闭蓝图编辑器。
将蓝图添加到关卡
在添加蓝图之前,在主编辑器的视口中,删除香蕉的模型。选择该模型,点击 Edit\Delete 菜单或者按 Delete 键。
添加蓝图和添加网格一样。在文件上按住左键,将它拖到视口中。
点击工具栏上 的 Play 按钮,看看效果!
UI教程
https://www.cnblogs.com/leoin2012/p/11713476.html
小项目2 — 自制第一人称动作游戏,学习如何随机生成并躲避障碍物
TODO:
持续移动玩家角色
生成需要玩家躲避的障碍点
随机生成不同样式的障碍点来丰富游戏性
当玩家撞上障碍点后,显示重玩按钮
下载
https://koenig-media.raywenderlich.com/uploads/2017/08/InfiniteMatrixStarterProject.zip
按下Play运行游戏尝试控制移动。你可以通过移动鼠标进行垂直,水平移动。