虚幻C++入门个人笔记(3)——接口、智能指针、动画蓝图、行为树、EQS系统

接口

接口的词义广泛,用来陈述功能、选项,与其他程序结构进行沟通的方式。接口抽象出了交互结构,提供了两个未知逻辑交互的便捷性。对于编程中,如何更好地设计低耦合程序起到了至关重要的作用。设计者可以在互不关心的情况下,进行友好的程序设计,并且通过接口来完成设计的整合交互

虚幻引擎中加入了接口设计,从一定程度上“去掉了”多继承。接口可以帮助我们解决在不同类型的类之间却有相同行为的特性。接口设计增加了代码编写的便捷性(处理不同类中的相同行为)

例如在设计射击类游戏时,我们需要子弹与场景中的物体进行交互,场景中的桌椅板凳,角色,怪物(都是独立的对象)都希望受到子弹的攻击伤害,那么子弹在打到目标后要逐一排查,审查目标是否属于上述对象,这很麻烦。但我们可以通过接口,增加上述目标具有受伤的能力。当子弹打到目标时,我们只需要检查目标是否继承受伤的接口,如果有则调用接口函数即可

构建接口类

接口类可以直接在虚幻编辑器中选择继承然后完成构建        ——Unreal接口

编写接口函数

接口如果想在蓝图中使用可以在UCLASS中加入Blueprintable

如果接口在蓝图中被继承,则:

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

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

3.函数说明如果使用BlueprintNativeEvent则必须在继承类中定义函数(同名加后缀_Implementation),如果使用BlueprintImplementableEvent修饰则可以选择性重写

接口中要加标记宏UFUNCTION(BlueprintNativeEvent)

实现接口

如果在C++中希望获得接口能力,则需要继承接口。需要注意的是,必须继承I开头的接口名称,并且继承修饰位public。不要尝试重写接口中的函数。如果希望实现接口可以编写同名函数,并用后缀“_Implementation”进行标记。所有的接口函数都必须有定义

注意的地方

1.逻辑写在接口的头文件的I类的public里,不要写错了地方

2.不要加私有域和受保护域

3.不要在U类里写代码

继承操作

1.在你需要继承的接口的Actor的头文件里的class的后面加",public I接口名称",引入头文件

2.virtual 接口中的函数_Implementation() override; //声明并定义

调用操作

调用函数,持有继承接口对象指针,第一步先转换到I类指针,调用Execute_接口函数名,参数第一位需要传递原对象指针,后面直接按照原函数参数填入即可

接口例子:

1.创建接口函数

//接口头文件中

public:

    UFUNCTION(BlueprintNativeEvent,BlueprintCallable)
    void NotifyHurt(int32 Value);

    UFUNCTION(BlueprintNativeEvent,BlueprintCallable)
    int32 NotifyHurt_Two();

2.继承接口类

MyActor头文件中,继承添加上接口

3.创建接口函数定义

//MyActor头文件中

public:
    
    virtual void NotifyHurt_Implementation(int32 Value) override;        //加定义
    
    virtual int32 NotifyHurt_Two_Implementation() override;        //加定义,return0

4.调用接口函数

AMyActor* My = GetWorld()->SpawnActor<AMyActor>(AMyActor::StaticClass());
    if (My)
    {
        IHurtInterface* Interf = Cast<IHurtInterface>(My);
        if (Interf)
        {
            Interf->Execute_NotifyHurt(My, Num);
        }
    }

接口总结

1.接口函数需要定义在I开头的类中,不要修改访问域public关键字,声明需要使用宏标记BlueprintNativeEvent或BlueprintImplementableEvent(专门用来在蓝图中使用)

2.如果需要继承接口,继承I类,继承关系public

3.接口中的函数禁止重载

4.在继承类中实现接口函数,并添加后缀_Implementation,需要注意,函数前加入虚函数关键字virtual,函数结尾加override,并在cpp文件中实现逻辑

5.所有接口函数均必须要进行定义

6.调用函数,持有继承接口对象指针,第一步先转到I类指针,调用Execute_接口函数名,参数第一位需要传递原对象指针,后面直接按照原函数参数填入即可

7.检查某一个类是否实现了对应接口可以使用如下语法进行检查

obj->GetClass()->ImplementsInterface(U类型::StaticClass());

act->GetClass()->ImplementsInterface(UMyInterface::StaticClass());

act是对象指针

接口优点

1.具备多态特性,接口衍生类支持李氏转换原则

2.接口可以使得整个继承系统更加的干净单一

3.接口可以规范类的具体行为,继承自接口的类必须实现接口中的行为

4.接口可以隔离开发中的开发耦合,我们只需要针对接口去编码,无需关心具体行为

5.接口继承可以使得继承关系中出现真正的操作父类

接口缺点

1.丢失了C++中的广泛继承特性

2.接口拘束了类型的属性拓展,无法进行更详细的内容定义

3.继承关系中容易让人混淆,接口本身不具备真正的继承特性

虚幻中的智能指针

指针

虚幻为了解决C++中指针导致的内存泄漏问题,加入了智能指针(共享指针,共享引用,弱指针),当我们使用动态方式构建对象时,再也不需要担心内存释放的问题,指针的释放规则由引擎制定,包括释放时机

自定义类

智能指针不能应用到U类上,我们在虚幻中创建C++类中继承自虚幻的都是U类,选择无则是自定义类

在构建自定义类时需要以F开头

#pragma once

#include "CoreMinimal.h"
#include <UObject/GCObject.h>

/**
 * 
 */
class ULESSONJK_API FNClass : public FGCObject
{
public:
    FNClass();
    ~FNClass();

protected:
    class USoundB

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值