虚幻引擎基础入门(C++) — 【宏定义 06】

前言

虚幻引擎是模块化编程,下面是继承关系中头文件描述

 一、UObject

  • UE中使用的对象大部分继承自UObject(顶级父类)
  • UObject具备如下优点:

        1.垃圾回收
        2.引用更新(更新受限于GC回收机制,需使用UPROPERTY宏标记)
        3.序列化(场景中的Actor被保存时发生)
        4.默认属性变化自动更新
        5.源码调整了对象属性时,编译后会自动更新到资源实例上,前提场景实例资源没有修改过属性值,修改过后将使用场景中的修改内容做填充参考
        6.自动属性初始化
        7.自动编辑器整合
        8.运行时类型信息可用
        9.运行时使用Cast可以进行类型信息投射检查(Cast To)
        10网络复制

  • 创建UObject类对象

二、UClass 宏

  • 用于标记从UObject派生的类,使得UObject处理系统识别到它们
  • 语法结构:

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

  •  六个常用宏标记:
//① 可以作为蓝图中的一种变量类型使用,类默认均可被蓝图访问
UCLASS(BlueprintType)

//② 默认可被继承,标记关系向子类传递,子类可覆盖描述关系
UCLASS(Blueprintable)
UCLASS(BlueprintType,NotBlueprintable)  // 可访问,但不可继承

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

//④ 所有属性及函数均为常量,并应作为常量导出。该标识由子类继承
UCLASS(Const)

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

//⑥ 用来配置组件在添加时分组情况
UCLASS(ClassGroup = (TestClass01))

三、UFunction 宏

  • 语法结构:
UFUNCTION(指令,指令..,meta(key=value))

//注意:在UFUNCTION修饰的函数中,如果参数类型是引用型参数,则在蓝图中将当做返回参数使用,无法查到输入针脚。
//如果参数类型是const修饰的引用型参数,则参数被当做输入针脚使用
  • 五个常用宏标记:
//1. BlueprintCallable:表明此函数可在蓝图中被调用(当类被蓝图继承后才有效果)
UFUNCTION(BlueprintCallable)
void Func(int32& A, const int32& B);  //void Func(输出针脚, 输入针脚)
//如果函数参数是引用类型,则在蓝图中调用被当做输出针脚
//如果传入参数是const修饰的引用类型,则在蓝图中被当做输入针脚


//2. Category:标明此函数在蓝图中的分类
Category=”UE4Test|MyActor”  // |符号用来划分分类级别
UFUNCTION(BlueprintCallable,Category=”UE4Test|MyActor”);


//3. BlueprintImplementableEvent:用此标记可以在C++中构建函数声明,但是定义由蓝图完成,从而达到C++向蓝图进行调用的目的,在CPP无需定义
public:
    UFUNCTION(BlueprintImplementableEvent, Category = "UECPP|ACPPActory")
    void Func();
//必须放在公有或受保护的访问域中,不能在C++中定义函数(本质上相当于纯虚函数virtual)
//注意:
//① 无参无返,则在蓝图中当作事件Event使用;
//② 无参有返,则在蓝图中当作函数使用(需要在函数的overlap中寻找)
//③ 有参无返(基本数据类型),当作普通事件输入参数使用
//④ 有参无返(自定义数据类型,如FString),编译不过
//⑤ 有参无返(基本数据类型/自定义数据类型引用),当作函数看待,在函数表中寻找


//4. BlueprintNativeEvent:标记的函数只能在c++中调用,在蓝图中无法调用,此标记可以标注函数可在蓝图中被重写,并且具备在C++中有另一个标记函数
UFUNCTION(BlueprintNativeEvent)
void Func01(int32 Num);  //在蓝图中调用
void Func01_Implementation(int32 Num);  
//如果蓝图重写此函数,则函数实现在蓝图,如果蓝图没有重写此函数,则函数实现在(函数名_ Implementation)上
//蓝图中实现后,可以右键函数节点,选择add call to parent function可以调用父类的函数逻辑(类似类中的虚函数,在继承关系中子类可以调用父类的虚函数)
//注意:
//① 无参无返,则在蓝图中当作事件Event使用;
//② 无参有返,则在蓝图中当作函数使用(需要在函数的overlap中寻找)


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

四、UPROPERTY 宏

  1. 语法结构:

    UPROPERTY(标记,标记,...,meta(key=value,key=value,...)
    //用于将对象属性暴露到蓝图中操作
    
  2. 常用宏标记:

    ① Category:分组(定义属性的分类)

UPROPERTY(Category=CategoryName)
Type VariableName;

UPROPERTY(Category="CategoryName|SubCategoryName")
Type VariableName;

UPROPERTY(EditAnywhere, Category = "MyCategory")
int CategoryNum;

UPROPERTY(EditAnywhere, Category = "MyCategory|SubCategory")
int SubCategoryNum;

② Blueprint

//----------以下2个不兼容,只能取其一:
//① BlueprintReadOnly:只读
UPROPERTY(BlueprintReadOnly)

//② BlueprintReadWrite:可读可写
UPROPERTY(BlueprintReadWrite)


//----------以下2个仅能用于Multicast代理:
//③ BlueprintAssignable:应显示该属性,以供在蓝图中分配
UPROPERTY(BlueprintAssignable)

//④ BlueprintCallable:应显示该属性,以在蓝图代码中调用
UPROPERTY(BlueprintCallable)

③ Edit

//① EditAnywhere:可从编辑器内的属性窗口编辑,在原型和实例中
//(可以在编辑器窗口中进行编辑,也可在场景细节面板中编辑)
UPROPERTY(EditAnywhere)

//② EditDefaultsOnly:可通过属性窗口来编辑,仅能对原型编辑
//(可以在蓝图编辑器中编辑原型数据,但无法在场景细节面板中编辑场景中的具体对象)
UPROPERTY(EditDefaultsOnly)

//③ EditInstanceOnly:可通过属性窗口来编辑,仅能对实例而非原型进行编辑
//(属性的修改权限在实例,不能在蓝图编辑器原型中修改)
UPROPERTY(EditInstanceOnly)


//④ EditFixedSize:限定动态数组长度,禁止用户在蓝图属性面板中修改(单一添加无法显式,需要配合使用上面两个标记)
//只限制修改数组大小,不限制普通变量
UPROPERTY(BlueprintReadWrite, EditAnyWhere, EditFixedSize)

//⑤ EditInline:使得用户可编辑UnrealEd的属性查看器中的变量所引用的对象属性
//(仅对对象引用可用,包括对象引用数组)
UPROPERTY(EditInline)

④ Visible

//① VisibleAnywhere:在属性窗口可见但无法编辑(原型实例中均可看到)
//如果标记组件指针,则表示组件内容在场景和编辑器的细节面板中显示所有编辑项
//如果标记的是普通属性(指针、基本数据类型、复合数据类型),则在场景和编辑器中只显示,无法编辑
UPROPERTY(VisibleAnywhere)

//② VisibleDefaultsOnly:仅在原型蓝图编辑器属性窗口中可见,无法编辑
//如果标记组件指针,则表示组件内容在场景和编辑器的细节面板中显示所有编辑项
//如果标记的是普通属性(指针、基本数据类型、复合数据类型),则只在编辑器中会显示(不在场景细节面板中显示),无法编辑
UPROPERTY(VisibleDefaultsOnly)

//⑩ VisibleInstanceOnly:仅在实例属性窗口中可见,无法编辑
//如果标记组件指针,则表示组件内容在场景和编辑器的细节面板中显示所有编辑项
///如果标记的是普通属性(指针、基本数据类型、复合数据类型),则只在场景细节面板中会显示(不在编辑器中显示),无法编辑
 UPROPERTY(VisibleInstanceOnly)

⑤ 其他

1.AdvancedDisplay:将属性信息在细节面板中隐藏到高级显式项内容中

UPROPERTY(EditAnywhere, Category = "Adv")
int AdvNum1;

UPROPERTY(EditAnywhere, AdvancedDisplay, Category = "Adv")
int AdvNum2;

2.Config:标记此属性可被存储到指定的配置文件中,启动时属性内容将从配置文件中获取

UPROPERTY(Config)

3.meta=(DisplayName=”别名”):别名标记指令

//给函数或属性取一个别名,用于蓝图显示和搜索
//可用在修饰属性和函数上,要和暴露到蓝图中的宏连用
UPROPERTY(BlueprintReadWrite, EditAnyWhere, meta=(DisplayName=”取一个别名”))

4.成员属性值域约束

//只在UI上约束,填入数据不约束
UPROPERTY(EditAnyWhere, meta = (UIMin="10", UIMax = "20"))

//UI上约束,填入数据也被约束
UPROPERTY(EditAnyWhere, meta = (ClampMin = "0", ClampMax = "10"))

5.成员属性修改约束 

//EditCondition="bShow",借助一个布尔变量用来控制另一个变量是否可以在面板中被修改 
UPROPERTY(EditAnywhere, EditFixedSize) 
bool bShow; 

UPROPERTY(EditAnywhere, AdvancedDisplay, meta = (ClampMin = "0", ClampMax = "10", EditCondition="bShow")) int32 wock; 


//蓝图可以访问C++中private中的属性,作用于在private中不能使用BlueprintReadWrite,加了(AllowPrivateAccess = “true”)之后就会把C++中私有的属性继承到蓝图并变成公有属性
UPROPERTY(EditAnywhere, EditFixedSize, meta = (AllowPrivateAccess = “true”))

总结

        以上就是今天要讲的内容,本文仅仅简单介绍了虚幻引擎中的宏定义的使用。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值