【UE架构】虚幻GamePlay架构(未完结,施工中,勿进)

本文是基于 @大钊 在知乎的《InsideUE4》文章笔记,传送门:《InsideUE4》目录 - 知乎 (zhihu.com)

食用对象:有一定C++基础,一定UE基础


 

一. Actor 和 Component

1.1 创建 Actor 的两种方式

  • 静态创建:直接在场景中编辑拖拽,创建由引擎构建场景时进行创建
    • 无需编码,更加直观简单
    • 但会影响游戏启动速度,增加场景构建负担
  •  动态创建:通过编码动态进行生成
    • 复杂度上升
    • 但可控性更强,动态生成的Actor会持有有效的操作指针,我们可以根据实际情况进行生成,更加灵活

 

1.2 SpawnActor函数

 

 

1.3 创建Actor

  •  ① 在头文件中,对其父类函数BeginPlay和Tick进行虚函数重写
    复制代码
    //在MyGameModeBase.h文件
    UCLASS()
    class UE_C_API AMyGameModeBase : public AGameModeBase
    {
        GENERATED_BODY()
    
    public :
        //虚函数重写
        virtual void BeginPlay()override;
        virtual void Tick(float DeltaSeconds)override;
    };
    复制代码
    复制代码

     

  • ② 在 .cpp 文件中,定义BeginPlay和Tick函数
    //在MyGameModeBase.cpp文件
    void AMyGameModeBase::BeginPlay()
    {
    }
    
    void AMyGameModeBase::Tick(float DeltaSeconds)
    {
    }

     

  • ③ 调用函数SpawnActor()
    复制代码
    //在MyGameModeBase.cpp文件
    void AMyGameModeBase::BeginPlay()
    {
        //调用父类同名函数(Super相当于父类)
        //Super::BeginPlay();
    
        //1.调用函数SpawnActor():
        GetWorld()->SpawnActor<AActor>();
    
        //2.
        GetWorld()->SpawnActor(AActor::StaticClass());
        //GetWorld 获得当前运行世界实例指针(全局函数 UWorld类型对象)
        //SpawnActor 是 UWorld类的一个成员函数(工厂函数),帮助我们在场景中生成Actor
        //AActor::StaticClass() 是一个类的实例数据(类型是 UClass)
    
        //3.
        UWorld* world = GetWorld();
        world->SpawnActor<AActor>();
    
        //4.滞后生成 Actor:
        //创建一个 UWorld类对象的指针
        UWorld* pWorld = GetWorld();  
    
        //创建一个 FTransform
        FTransform tran;
    
        //滞后生成 Actor
        AActor* pActor = pWorld->SpawnActorDeferred<AActor>(AActor::StaticClass(), tran);
    
        //确定生成对象到世界
        pActor->FinishSpawning(tran);
    }
    
    void AMyGameModeBase::Tick(float DeltaSeconds)
    {
        Super::Tick(DeltaSeconds);
    }
    复制代码

     

  • ④ 上面采用了4种方式创建Actor,编译后运行结果如下:

  • 虚幻中除了使用模版构建对象外,还增加了映射关系,可以将类作为对象构建依据,这可以方便的将类提供给蓝图使用
  • 注意:C++本身是编译型语言,在编辑器中看到的文件类并不是真正的C++类,只是编译后生成的映射文件

 

1.4 Actor 生命周期

  • ① Actor的创建分为两种方式,两种方式的创建有细微差异,但总体不大,基本分为以下流程:
    • 构造函数调用

    • 初始化成员变量

    • (如有蓝图,则初始化蓝图数据)

    • 构建组件

    • BeginPlay(标志着Actor被创建到世界当中)

    • Tick

  • ② 消亡Actor

    复制代码
    //创建一个 UWorld类对象的指针
    UWorld* pWorld = GetWorld();  
    
    //创建一个 FTransform
    FTransform tran;
    
    //滞后生成 Actor
    AActor* pActor = pWorld->SpawnActorDeferred<AActor>(AActor::StaticClass(), tran);
    
    //确定生成对象到世界
    pActor->FinishSpawning(tran);
    //调用自身Destroy函数进行强制消亡操作
    pActor->Destroy();
    
    //滞后5秒删除
    pActor->SetLifeSpan(5);
    复制代码
    • Destroy函数

      • 参数说明:

      • bNetForce 是否强制网络同步删除

      • bShouldModifyLevel 主要是用来控制先删除actor再修改关卡,还是先修改关卡再删除actor,默认是true,即为先修改关卡,再删除actor(修改关卡即为把actor先移除出场景)

    • SetLifeSpan函数

      • 参数说明:

      • 设置延时删除(单位秒)

 

  • ③ 消亡Actor通知
    • Destroyed函数

      • 当对象被删除时(非内存删除)进行回调操作

    • EndPlay函数

      • 对象被彻底清除时回调,回调会进行删除类型通知

 

  •  ④ 删除类型介绍
    • Destroyed:当actor或是component彻底被删除时(内存中)

    • LevelTransition:关卡切换时删除回调(非关卡流)

    • EndPlayInEditor:编辑器关闭时,回调通知

    • RemovedFromWorld:关卡流切换被释放时调用

    • Quit:游戏退出时被删除回调

 

 

 

 

 

 

 

 

 


 

临时草稿 

 

 

 

 

 

 

 

 

未完待续...

posted @   哟吼--小文文公主  阅读(533)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
点击右上角即可分享
微信分享提示