虚幻C++入门个人笔记(2)——标记宏、结构体枚举、资源加载、代理

标记宏

类UCLASS、成员属性UPROPERTY、成员函数UFUNCTION

蓝图和C++的交互

UObject

UE4对于C++进行调整后,靠拢了其他虚拟机语言,为了方便对象内存管理和映射数据操作,UE4对UECPP进行了更加严谨的语法定义,所有UE中使用的对象大部分继承自UObject,这样的系统级的管理更加轻松,不必涉及更多不定性内容,UObject具备如下优点

1.垃圾回收(new出来的对象不用去释放了)

2.引用更新(更新受限于GC回收机制,需要使用UPROPERTY宏标记)(苹果消亡,对象里指向它的指针指向为空)

3.序列化(场景中的Actor被保存时发生)(保存时保存到本地)

4.默认属性变化自动更新(对象在蓝图中暴露了属性,在C++中改了属性,蓝图中会自动修改,蓝图里改c++也会改)

5.源码调整了对象属性时,编译后会自动更新到资源实例上,前提场景实例没有修改过属性值,修改过后将使用场景中的修改内容做填充参考

6.自动属性初始化(不赋值指向默认值)

7.自动编辑器整合(可以将C++属性暴露到蓝图上)

8.运行时类型信息可用

9.运行时使用Cast可以进行类型信息投射检查(指针转换关系,尝试性地将一个指针转换为另一个指针,转换的过程是安全的,失败返回空成功返回真,两个类没有关系的时候就会失败)

10.网络复制

UCLASS宏

用于标记从UObject派生的类,使得UObject处理系统识别到它们

该宏为UObject提供一个对UCLASS的引用,描述是基于虚幻引擎的类型。对于标记UCLASS的类,引擎可进行识别

继承关系中的头文件描述

#include "MyObject.generated.h"

必须是最后一个被引入的头文件,默认由UE模板生成,此头文件需要了解其他类,所以需要放到最后

UCLASS()

UCLASS宏使虚幻引擎4能识别UMyObject

class MYPROJECT_API UMyObject:public UObject

如MyProject希望将UMyObject类公开到其他模板,则需要指定MYPROJECT_API

GENERATED_BODY()

GENERATED_BODY宏不获取参数,但会对类进行设置,以支持引擎要求的基础结构,GENERATED_BODY宏将成员访问等级设为“public”,而非设置“private”的缺省语言

创建UObject类对象指针

动态构建对象的时候使用到这个函数

NewObject()是最为简单的UObject工厂模式,他需要可选的外部对象和类,并会创建拥有自动生成的名称的新实例。

UCLASS宏标记

语法结构

UCLASS(描述指令,描述指令,...)

常用标记

BlueprintType

此类可以作为蓝图中的一种变量类型使用,类默认均可被蓝图访问,一般我们用此标记描述结构体,提供给蓝图访问

Blueprintable或NotBlueprintable

用来标明当前类是否可以被蓝图继承,默认可被继承,标记关系向子类传递,子类可覆盖描述关系

Abstract

Abstract类修饰符将类声明为“抽象基类”,这样会阻止用户在虚幻编辑器中向这个世界中添加这个类的Actor,或者在游戏过程中创建这个类的实例

Const

本类中的所有属性及函数均为常量,并应作为常量导出,该标记由子类继承

Config

将类内的成员变量数据信息保存到本地配置文件中,需要显式调用函数SaveConfig使用,并配合UPROPERTY宏操作

例:UCLASS(Config=Game)

ClassGroup

用来配置组件在添加时分组情况

例:UCLASS(ClassGroup=(ZQSELF))        //分组名字不要写中文

meta

额外操作宏

例:meta=(BlueprintSpawnableComponent)        //当前组件可以在蓝图中再被延展

UFUNCTION宏标记

用途:将成员函数暴露到蓝图中去,在蓝图中享有操作权限

语法结构(标注在函数顶端,禁止在尾端加分号)

UFUNCTION(指令,指令...,meta(key=value))

注意:在UFUNCTION修饰的函数中,如果参数类型是引用型参数,则在蓝图中将当作返回参数使用,无法查到输入阵脚。如果参数类型是const修饰的引用型参数,则参数被当作输入阵脚使用

常用标记

BlueprintCallable

表明此函数可在蓝图中被调用(当类被蓝图继承后才有效果)

注意:如果函数参数是引用类型,则在蓝图中调用被当作输入阵脚,如果从传入参数是const修饰的引用类型,则在蓝图中被当作输入针脚

例1:UFUNCTION(BlueprintCallable)

int32 CTime(const int32& num);

例2:UFUNCTION(BlueprintCallable)

int32 CTime(int32& num);        //被当作函数输出阵脚使用

Category

标明此函数在蓝图中的分类

用法Category="UE4TEST|MyActor"        //        |符号用来划分分类级别

BlueprintImplementableEvent

标记的函数只能在C++中调用,在蓝图中无法调用——在CPP中无需定义即可调用,调用的是蓝图中的一个节点

用此标记可以在C++中构建函数声明,但定义由蓝图完成,从而打到C++向蓝图进行调用的目的,在CPP中无需定义

UFUNCTION(BlueprintImplementableEvent,Category="UECPP|ACPPActory")

类似纯虚函数,但是继承关系中的蓝图并不用必须重写此函数

注意:

如果函数没有返回类型,则在蓝图中当作事件Event使用

如果函数存在返回类型,则在蓝图中当作函数使用(需要在函数的overlap中寻找)

如果带有参数

没有返回值,参数是基本数据类型,则当作普通事件输入参数使用

没有返回值,参数是基本数据类型引用,则当作函数看待,在蓝图函数重载表中寻找

没有返回值,参数是自定义数据类型(如FString),编译不过

没有返回式,参数是自定义数据类型引用,则当作普通函数看待,在蓝图函数重载表中寻找

如果有返回值,则当作函数使用

传递引用操作如BlueprintCallable

BlueprintNativeEvent

标记的函数只能在C++中调用,在蓝图中无法调用

此标记可以标注函数可以在蓝图中被重写,并且具备在C++中有另一个标记函数声明格式为:

函数名_Implementation(参数列表)        //必须要在C++中声明且定义

达到效果,如果蓝图重写此函数,则函数逻辑实现在蓝图,如果蓝图没有重写此函数,则函数实现在(函数名_Implementation)上

蓝图中实现后,可以右键函数节点,选择add call to parent function可以调用父类的函数逻辑(类似类中的虚函数,在继承关系中子类可以调用父类的虚函数)

注意:

如果函数没有返回类型,则在蓝图中当作事件Event使用

如果函数存在返回类型,则在蓝图中当作函数使用(需要在函数的overlap中寻找)

基本效果同上

传递引用操作如BlueprintCallable

BlueprintPure

特殊标记,构建一个蓝图中的纯函数,用来获取对象数据。所以此标记的函数必须有有效返回值(无返回值编译报错),并且在蓝图中无法加入到执行队列,只能以输出值的操作方式被使用,定义实现均放在CPP中<

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值