UE4学习总结(6) C++编码


UE4工程有两种编程方式,分别是蓝图编程和C++编程。(不熟悉UE4蓝图的戳 这里)蓝图的编程方式显然开发性强得多,许多函数模块已经集成好,甚至只保留参数配置界面只需要调参即可,功能也更加完备,比如素材可以直接右键删除,操作简单且不用担心残留。并且蓝图有保护程序,出错就中断或者阻止程序接口生成,防止工程崩溃,C++就经常导致工程崩溃、打不开程序的情况,事实上,几乎是只要出现栈溢出的情况,工程就会崩溃。试想一个大项目出现系统崩溃的后果,文件都有丢失的风险。因此不宜全部用C++编码做大项目。
蓝图的缺点是程序运行效率较低,因为蓝图构建起来以后还需要在UE4的蓝图虚拟机上进行编译运行。所以一般会同时采用C++和蓝图,重复执行的模块用C++,其它模块用蓝图。

UE4中C++编码和普通C++程序的区别

1. 反射

可以使程序在运行过程中查看某个类的信息,如封装了某些内容,可以不通过“.”的方式获取到这个这个类型和名字。

2. 垃圾回收

当一个对象或类的实例没有指针指向的时候,不会被内存释放,会变成垃圾造成内存泄漏,垃圾回收机制会自动释放这块内存。

C++编码基本操作

当熟悉UE4的蓝图操作以后,C++本质上没有什么区别。需要用到的函数都在头文件里面,需要时调用即可,类似于蓝图里面调用模块。
比如对于一个Pawn类,新建类时cpp文件中对应位置就已经创建好了构造函数、BeginPlay函数、Tick函数和输入事件响应函数,相当于蓝图里面的construction script, Event BeginPlay, Event Tick和输入事件。在这里面添加代码,相当于蓝图里面的连线。

// Fill out your copyright notice in the Description page of Project Settings.


#include "MyPawn.h"

// Sets default values
AMyPawn::AMyPawn()
{
 	// Set this pawn 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 AMyPawn::BeginPlay()
{
	Super::BeginPlay();
	
}

// Called every frame
void AMyPawn::Tick(float DeltaTime)
{
	Super::Tick(DeltaTime);

}

// Called to bind functionality to input
void AMyPawn::SetupPlayerInputComponent(UInputComponent* PlayerInputComponent)
{
	Super::SetupPlayerInputComponent(PlayerInputComponent);

}

常用C++类

Object:不能直接拖拽到场景中,只能依附于其它类(如关卡蓝图)实现功能。
Actor:和蓝图工程里面的Actor相似,但无法接收输入事件,可以直接拖拽到场景中。
Pawn:可以接收输入事件,可以直接拖拽到场景中。

访问控制类型

BlueprintReadWrite:在蓝图(节点)里面可以读写(get和set方法)。
BlueprintReadOnly:在蓝图(节点)里面只读。
EditAnywhere:在资源和实例的属性窗口都可以编辑。
EditDefaultsOnly:只能在资源的属性窗口编辑。
EditInstanceOnly:只能在实例的属性窗口编辑。
VisibleAnywhere:在资源和实例的属性窗口可视,但不可编辑。
VisibleDefaultsOnly:在资源的属性窗口可视,但不可编辑。
VisibleInstanceOnly:在实例的属性窗口可视,但不可编辑。
资源窗口:
在这里插入图片描述
实例窗口:
在这里插入图片描述
访问控制类型的配置方法:在C++类的头文件里面进行操作。在所有函数定义之前添加UPROPERTY函数并按照上面介绍的几个类型参数进行设置。即,在你需要设置访问控制的函数前面调用UPROPERTY函数。(所有UE4的函数第一个字母都是U,用于反射和垃圾回收的识别)

UCLASS()
class FORMATIONMOVE_API AMyActor : public AActor
{
	GENERATED_BODY()
	
public:	
	// Sets default values for this actor's properties
	AMyActor();
	//VisiableAnyWhere表示所有位置可见
	UPROPERTY(VisibleAnywhere, Category = "My Actor Components")
		UStaticMeshComponent* MyStaticMesh;

	//初始位置
	UPROPERTY(VisibleInstanceOnly, Category = "My Actor Components | Vector")
		FVector InitLocation;

	//控制是否可以每帧偏移
	UPROPERTY(EditInstanceOnly, Category = "My Actor Properties | Control")
		bool bShouldMove = false;

	//每帧偏移量
	//EditAnywhere表示所有位置可修改,最常用    meta表示输入大小限定 ClampMax表示可输入的大小范围,UIMin表示在文本框左右滑动的大小范围
	UPROPERTY(EditAnywhere, Category = "My Actor Properties | Vector", meta = (ClampMin = -5.0f, ClampMax = 5.0f, UIMin = -5.0f, UIMax = 5.0f))
		FVector TickLocationOffset;

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

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

};

操作注意

一个C++项目的程序往往不是把源代码copy一下再编译一下就能实现的。因为有时候程序的不同部分必须分步执行,否则就会错误。比如要把一组数据读入工程,再对这组数据进行某些操作。因此C++程序既需要新建一个存此数据的结构体,也需要有执行语句。若直接执行整个代码,就会编译失败,因为定义了一个空的结构体,后面的程序面对空的结构体会出现数组越界。所以只能先把后面的程序删掉,只执行新建结构体,接着在UE4里面将数据导入结构体,最后把程序后半部分补回来,再进行第二次编译,才能完成。
完成了本次C++编码的项目小练习以后,感觉用C++做UE4项目就会对整个工程的逻辑很通透,清楚各个效果是如何实现的。而之前用蓝图做项目只是按照教程一步步操作,对内部实现逻辑理解不深。我认为对于UE4开发者,一定的C++项目练习是很有必要的,可以在实践中加深对工程内部逻辑的掌握。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值