UE4 C++入门之路1-C++和蓝图的关系和介绍

Posted 珞珈大胖强TURBO

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了UE4 C++入门之路1-C++和蓝图的关系和介绍相关的知识,希望对你有一定的参考价值。

C++和蓝图的关系

接触过UE4的应该都听说过,UE4提供了两种方法来设计游戏,C++和蓝图可视化脚本。我看到过很多人和教程中直接用蓝图做游戏的,有的甚至效果不错,那么这两种方法到底有什么区别呢,大家应该如何选择呢?今天我尽力的来讲一下。
首先我们直接从Epic设计UE4的初衷来谈,UE4的初衷其实设计的蓝图本身是给设计师使用的,C++是给C++程序员使用的,那么什么是设计师呢,其实可以想象为技术策划,有一些程序能力但是没有精通到程序设计语言的底层,在编码过程中可能不会考虑到游戏性能甚至代码底层消耗的这种技术人员,这样一来,最佳的编码模式便是:程序员在C++中创建游戏性构建块,设计师利用这些块打造有趣游戏性时,引擎能发挥最佳工作效率。什么是游戏性构建块呢?在蓝图中有一些方法节点比如AIMoveTo,非常的好用,直接给他目的地,Actor玩家就能移动到目的地,那对于这个AIMoveTo方法,就可以理解为游戏性构建块,C++程序员可以使用非常刁钻的手法实现此方法,让其拥有极好的性能,设计师只需要调用此方法便可以实现很多功能,这便是蓝图和C++最有效率的使用模式。
我在网上经常能看到有人使用纯蓝图设计游戏,其实我心底是比较不推崇这种做法,因为引擎提供的方法有限,而用蓝图实现复杂的方法时候,乱七八糟的真的是会写代码的人都不会写代码了,(吐槽一下最近看一个蓝图FPS教程,角色枪支换子弹的逻辑简直就是蜘蛛网)。
此文还是技术文章,而且C++入门之路系列的文章可能要着重讲C++,(毕竟我是个程序员),所以讲一点具体的UE4中如何创建C++类吧!然后讲一下创建蓝图,以及一些小知识点,话不多说,上干货!

创建C++工程

至于怎么下载UE4 ,环境配置,网上的文章已经很多了,我就先不赘述了!
首先打开UE4,我是4.26.2,初始界面如下,点击黄线中的Games,再点击Next,也就是创建新项目的意思!

选择Blank新项目

下图中

1
选择C++项目,对于C++项目和蓝图项目,他们的区别就是蓝图项目会少几个创建C++文件的按钮,但是蓝图项目转C++只需要点击File中的创建C++Code即可,所以其实总结是没有啥大区别的。

2 With Started Content就是带一些初学者的资源进去,还有一些已有的代码,所以一般开始学习选择带比较好

3 项目路径,不要带中文

4 项目名称,不要带中文


然后就来到的UE4的编辑器界面
简单介绍一下下图中

1 一些文件设置,项目设置,窗口,和很多软件一样
2 一些实时编辑需要的按钮
3 游戏场景
4 游戏里有啥
5 选中4中具体物体的属性
6 控制台
7 文件浏览器

在UE4中新建一个蓝图类

UE4中创建蓝图类很简单,找到想要创建蓝图的文件夹,右键,选择BluePrint Class

场景内的物品基本都继承自Actor,选择即可

命名后双击,下图中

1 可以加组件,赋予生命力
2 选中组件的属性


点击Event Graph进入蓝图代码编辑区,下图中

1 此Actor被加载的事件,即加载要运行的代码
2 别的Actor碰撞此Actor的事件
3 每一帧,即每0.02s一次的事件
4 文章开头说的AIMoveTo方法

在UE4中新建一个C++类

进入想要创建C++的文件夹,右击点击New C++ Class
同样选中Actor

命名类,后面的选择是选择是否公开,其实是同一模块下其他类能否访问的意思

代码如下
BeginPlay()是一个事件,将告知你Actor已以可操作状态进入游戏中。现在便适合开始类的游戏性逻辑。Tick()每帧调用一次,对应的时间量为自上次调用传入的实际运算时间。在此可创建反复逻辑。如不需要此功能,最好将其移除,以节约少量性能开销。如要移除此功能,必须将构建函数中说明tick应该发生的代码行删除。以下构建函数APublicActor的cpp实现中包含讨论中的代码行。
一般会生成h和cpp文件,h是声明,cpp是实现
.h

#pragma once

#include "CoreMinimal.h"
#include "GameFramework/Actor.h"
#include "PublicActor.generated.h"

UCLASS()
class STUDYPROJECT1_1_1_API APublicActor : public AActor
{
	GENERATED_BODY()
	
public:	
	// Sets default values for this actor's properties
	APublicActor();

protected:
	// Called when the game starts or when spawned
	virtual void BeginPlay() override;

public:	
	// Called every frame
	virtual void Tick(float DeltaTime) override;

};

.cpp

#include "StudyProject1_1_1/Public/PublicActor.h"

// 构造函数
APublicActor::APublicActor()
{
 	// 将此actor设为每帧调用Tick ()。不需要时可将此关闭,以提高性能。
	PrimaryActorTick.bCanEverTick = true;

}

// 游戏开始或生成时调用
void APublicActor::BeginPlay()
{
	Super::BeginPlay();
	
}

// 每帧调用
void APublicActor::Tick(float DeltaTime)
{
	Super::Tick(DeltaTime);

}

这里讲一下刚开始写代码的时候可能会遇到的疑问,下图中

1 只编译一次的标识代码,标识此头文件只编译一次,为了防止被引用此头文件多次时多次编译的问题
2 .generated.h文件,UE4将生成所有反射数据并将放入此文件。必须在声明类型的头文件中将此文件作为最后的 include包含。
3 模块名,在.cs文件中声明

4 UE4使用它替代为类型生成的所有必需样板文件代码。

结束!不要吝啬一个赞奥,写的真累,下篇再见!

以上是关于UE4 C++入门之路1-C++和蓝图的关系和介绍的主要内容,如果未能解决你的问题,请参考以下文章

ue4/5蓝图与c++混用基础入门的基础操作(适合有蓝图基础和c++基础的新手,创建自己的蓝图)

UE4 C++入门之路7-UObject,AActor,UActorComponent,UStruct介绍,生命周期介绍

UE4 C++入门之路7-UObject,AActor,UActorComponent,UStruct介绍,生命周期介绍

UE4 C++入门之路7-UObject,AActor,UActorComponent,UStruct介绍,生命周期介绍

UE4入门建立和打开项目

UE4 C++入门之路6-PostEditChangeProperty以及和PostInitProperties的区别